最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Springboot中怎么利用Mysql8實現(xiàn)讀寫分離功能

本篇文章給大家分享的是有關Springboot中怎么利用MySQL8實現(xiàn)讀寫分離功能,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

站在用戶的角度思考問題,與客戶深入溝通,找到華寧網(wǎng)站設計與華寧網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋華寧地區(qū)。

安裝配置mysql

從 https://dev.mysql.com/downloads/mysql/頁面下載mysql安裝包,我這里下載的是mysql8.0.16 Linux-Generic.

準備兩臺虛擬機用作安裝mysql,并將下載后的文件mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz上傳至服務器/app/mysql

192.168.249.131 CENTOS7 主192.168.249.129 CENTOS7 從

查看防火墻狀態(tài),如果啟動需要先關閉防火墻

service firewalld status ## 查看防火墻狀態(tài)service firewalld stop  ## 關閉防火墻使用如下命令將xz文件解壓成tar文件xz -d mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz

解壓安裝包

tar -xvf mysql-8.0.16-linux-gl-ibc2.12-x86_64.tar

在/app/mysql下建立data文件夾,用于存放數(shù)據(jù)

創(chuàng)建mysql用戶組和mysql用戶

groupadd mysql                 ## 創(chuàng)建用戶組useradd -g mysql -d /app/mysql mysql  ## 在用戶組下創(chuàng)建mysql用戶并授權相關目錄groupdel mysql                 ## 刪除用戶組名(若報已存在相關用戶組)userdel mysql   ## 刪除用戶(若報已存在相關用戶)

初始化安裝mysql數(shù)據(jù)庫

./mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data --initialize2019-07-01T02:05:52.681626Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.2019-07-01T02:05:52.681694Z 0 [System] [MY-013169] [Server] /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 14792019-07-01T02:05:52.681726Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file '/app/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.2019-07-01T02:05:55.713747Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: xa6(H>rK/r

注意,此時mysql會生成一個默認的臨時密碼,如上所示,需要先保存下來然后修改

建立mysql服務并增加執(zhí)行權限

cp mysql-8.0.16-linux-glibc2.12-x86_64/support-files/mysql.server /etc/init.d/mysqld

修改mysql配置文件 vi /etc/my.cnf 增加如下配置

[mysqld]port=3306basedir=/app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64datadir=/app/mysql/datasocket=/tmp/mysql.socksymbolic-links=0[mysqld_safe]log-error=/app/mysql/data/log/error.logpid-file=/app/mysql/data/mysql.piduser=mysqltmpdir=/tmpcharacter_set_server=utf8default-storage-engine=INNODBinit_connect='SET NAMES utf8'!includedir /etc/my.cnf.d

如果報日志權限相關錯誤,請先建立對應日志文件,并給mysql用戶授權

chown -R mysql:mysql /app/mysql/data/log/error.log

啟動mysql服務

service mysqld start

建立mysql客戶端軟連接

ln -s /app/mysql/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysql /usr/local/bin/mysql

登錄mysql修改密碼

mysql -uroot -p密碼    ## 登錄 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '000000';

設置遠程登錄

use mysql;update user set host='%' where user='root' limit 1;flush privileges;

配置mysql主從同步(binlog)

復制原理

Master將數(shù)據(jù)改變記錄到二進制日志(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫做二進制日志事件(binary log events)  Slave通過I/O線程讀取Master中的binary log events并寫入到它的中繼日志(relay log)  Slave重做中繼日志中的事件,把中繼日志中的事件信息一條一條的在本地執(zhí)行一次,完成數(shù)據(jù)在本地的存儲,從而實現(xiàn)將改變反映到它自己的數(shù)據(jù)(數(shù)據(jù)重放)

復制要求

主從服務器操作系統(tǒng)版本和位數(shù)一致  Master和Slave數(shù)據(jù)庫的版本要一致  Master和Slave數(shù)據(jù)庫中的數(shù)據(jù)要一致  Master開啟二進制日志,Master和Slave的server_id在局域網(wǎng)內必須唯一

配置步驟

主數(shù)據(jù)庫(192.168.249.131)

創(chuàng)建同步用戶并授權

CREATE USER 'slave'@'192.168.249.129' IDENTIFIED WITH 'mysql_native_password' BY '000000';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.249.129';FLUSH PRIVILEGES;

注意這里創(chuàng)建用戶時需要選用mysql_native_password加密方式插件,否則默認會使用caching_sha2_password加密方式,這樣在同步的時候需要使用SSL的身份進行驗證,為了方便簡單,我們直接采用mysql_native_password方式

修改配置/etc/my.cnf,新增如下配置,開啟binlog,并重啟mysql服務

[mysqld] # 開啟二進制日志功能 log-bin=mysql-bin # 設置server_id,,注意在網(wǎng)段內要唯一 server-id=131 #(可選配置)要同步的數(shù)據(jù)庫名,要同步多個數(shù)據(jù)庫,就多加幾個replicate-db-db=數(shù)據(jù)庫名 binlog-do-db=mydb #(可選配置)要忽略的數(shù)據(jù)庫 binlog-ignore-db=mysql

查看主服務器狀態(tài)

show master statusfile

注意看里面的參數(shù),特別前面兩個File和Position,在從服務器(Slave)配置主從關系會有用到的。

從數(shù)據(jù)庫(192.168.249.129)

修改/etc/my.cnf,新增如下配置,并重啟服務

[mysqld]server-id=129log-bin=mysql-binreplicate-do-db=mydbreplicate-ignore-db=mysql

在slave中設置master信息,指定同步位置

stop slave;change master to master_host='192.168.249.131',master_user='slave',master_password='000000',master_log_file='mysql-bin.000001',master_log_pos=155;start slave;

參數(shù)說明:

master_host='192.168.249.131' ## Master的IP地址master_user='slave' ## 用于同步數(shù)據(jù)的用戶(在Master中授權的用戶)master_password='000000' ## 同步數(shù)據(jù)用戶的密碼master_port=3306 ## Master數(shù)據(jù)庫服務的端口masterlogfile='mysql-bin.000001' ##指定Slave從哪個日志文件開始讀復制數(shù)據(jù)(Master上執(zhí)行命令的結果的File字段)masterlogpos=155 ## 從哪個POSITION號開始讀(Master上執(zhí)行命令的結果的Position字段)masterconnectretry=30 ##當重新建立主從連接時,如果連接建立失敗,間隔多久后重試。單位為秒,默認設置為60秒,同步延遲調優(yōu)參數(shù)。

查看從服務器狀態(tài)

show slave status\G;

至此數(shù)據(jù)庫層面主從配置完成。

SpringBoot中配置主從讀寫分離

在主從模式下請遵守如下規(guī)則:主數(shù)據(jù)庫 只執(zhí)行 INSERT,UPDATE,DELETE 操作從數(shù)據(jù)庫 只執(zhí)行SELECT操作

我們這里使用開源項目[dynamic-datasource-spring-boot-starter](https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/)作為讀寫分離的工具包

使用方法

在mydb主數(shù)據(jù)庫中建立一個簡單數(shù)據(jù)表user,建好后從數(shù)據(jù)庫會自動同步

DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`account` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`position` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

引入相關依賴

         org.springframework.boot      spring-boot-starter              org.springframework.boot      spring-boot-starter-web              org.mybatis.spring.boot      mybatis-spring-boot-starter      2.0.1              com.baomidou      dynamic-datasource-spring-boot-starter      2.5.5              mysql      mysql-connector-java      8.0.15              org.projectlombok      lombok      true              org.springframework.boot      spring-boot-starter-test      test      

配置數(shù)據(jù)源

spring: datasource:  dynamic:   primary: master #設置默認的數(shù)據(jù)源或者數(shù)據(jù)源組,默認值即為master   strict: false #設置嚴格模式,默認false不啟動. 啟動后再為匹配到指定數(shù)據(jù)源時候回拋出異常,不啟動會使用默認數(shù)據(jù)源.   datasource:    master:     type: com.zaxxer.hikari.HikariDataSource     url: jdbc:mysql://192.168.249.131:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false     username: root     password: '000000'     driver-class-name: com.mysql.cj.jdbc.Driver    slave_1:     type: com.zaxxer.hikari.HikariDataSource     url: jdbc:mysql://192.168.249.129:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false     username: root     password: '000000'     driver-class-name: com.mysql.cj.jdbc.Driver

在啟動類入口加入mybatis掃描包

@SpringBootApplication@MapperScan("com.jianzh6.dynamic.mapper")public class DynamicDatsourceBootstrap {    public static void main(String[] args) {        SpringApplication.run(DynamicDatsourceBootstrap.class, args);  }}

建立實體類User

@Datapublic class User {  private int id;  private String account;  private String name;  private String position;}

建立mapper接口文件,新增兩個方法addUser(User user),getById(int id)

public interface UserDao {  @Insert("INSERT INTO user(account, name, position) VALUES(#{account}, #{name}, #{position})")  @Options(useGeneratedKeys = true,keyProperty = "id")  int addUser(User user);  @Select("SELECT * FROM user WHERE id = #{id}")  User getById(int id);}

建立Service服務層相關實現(xiàn)

public interface UserService {    int addUser(User user);    User getById(int id);}@Servicepublic class UserServiceImpl implements UserService {    @Resource    private UserDao userDao;    @Override    public int addUser(User user) {      return userDao.addUser(user);    }    @DS("slave")    @Override    public User getById(int id) {      return userDao.getById(id);    }}

由于在數(shù)據(jù)源中配置了primary: master,默認操作都會從主庫執(zhí)行,使用注解@DS切換數(shù)據(jù)源,此注解也可直接用于類文件上,同時存在方法注解優(yōu)先于類上注解。

編寫單元測試進行測試

public class UserServiceTest extends DynamicDatsourceBootstrapTests {  @Autowired  private UserService userService;  @Test  public void testAddUser(){    User user = new User();    user.setName("李四");    user.setAccount("sili");    user.setPosition("JAVA開發(fā)工程師");    int i = userService.addUser(user);    System.out.println(user);  }  @Test  public void testGetById(){    int id = 4;    User user = userService.getById(id);    Assert.assertEquals("sanzhang",user.getAccount());  }}

通過觀察執(zhí)行日志,發(fā)現(xiàn)讀寫數(shù)據(jù)庫會根據(jù)@DS注解進行切換,至此Springboot集成數(shù)據(jù)庫主從讀寫分離完成。

以上就是Springboot中怎么利用Mysql8實現(xiàn)讀寫分離功能,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站欄目:Springboot中怎么利用Mysql8實現(xiàn)讀寫分離功能
網(wǎng)站URL:http://fisionsoft.com.cn/article/igcgdh.html