本篇文章給大家分享的是有關(guān)Springboot中怎么利用MySQL8實(shí)現(xiàn)讀寫(xiě)分離功能,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到華寧網(wǎng)站設(shè)計(jì)與華寧網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋華寧地區(qū)。
安裝配置mysql
從 https://dev.mysql.com/downloads/mysql/頁(yè)面下載mysql安裝包,我這里下載的是mysql8.0.16 Linux-Generic.
準(zhǔn)備兩臺(tái)虛擬機(jī)用作安裝mysql,并將下載后的文件mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
上傳至服務(wù)器/app/mysql
192.168.249.131 CENTOS7 主192.168.249.129 CENTOS7 從
查看防火墻狀態(tài),如果啟動(dòng)需要先關(guān)閉防火墻
service firewalld status ## 查看防火墻狀態(tài)service firewalld stop ## 關(guān)閉防火墻使用如下命令將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用戶并授權(quán)相關(guān)目錄groupdel mysql ## 刪除用戶組名(若報(bào)已存在相關(guān)用戶組)userdel mysql ## 刪除用戶(若報(bào)已存在相關(guān)用戶)
初始化安裝mysql數(shù)據(jù)庫(kù)
./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 注意,此時(shí)mysql會(huì)生成一個(gè)默認(rèn)的臨時(shí)密碼,如上所示,需要先保存下來(lái)然后修改 建立mysql服務(wù)并增加執(zhí)行權(quán)限 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 如果報(bào)日志權(quán)限相關(guān)錯(cuò)誤,請(qǐng)先建立對(duì)應(yīng)日志文件,并給mysql用戶授權(quán) chown -R mysql:mysql /app/mysql/data/log/error.log 啟動(dòng)mysql服務(wù) 建立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'; 設(shè)置遠(yuǎn)程登錄 use mysql;update user set host='%' where user='root' limit 1;flush privileges; 配置mysql主從同步(binlog) 復(fù)制原理 Master將數(shù)據(jù)改變記錄到二進(jìn)制日志(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫做二進(jìn)制日志事件(binary log events) Slave通過(guò)I/O線程讀取Master中的binary log events并寫(xiě)入到它的中繼日志(relay log) Slave重做中繼日志中的事件,把中繼日志中的事件信息一條一條的在本地執(zhí)行一次,完成數(shù)據(jù)在本地的存儲(chǔ),從而實(shí)現(xiàn)將改變反映到它自己的數(shù)據(jù)(數(shù)據(jù)重放) 復(fù)制要求 主從服務(wù)器操作系統(tǒng)版本和位數(shù)一致 Master和Slave數(shù)據(jù)庫(kù)的版本要一致 Master和Slave數(shù)據(jù)庫(kù)中的數(shù)據(jù)要一致 Master開(kāi)啟二進(jìn)制日志,Master和Slave的server_id在局域網(wǎng)內(nèi)必須唯一 配置步驟 主數(shù)據(jù)庫(kù)(192.168.249.131) 創(chuàng)建同步用戶并授權(quán) 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)建用戶時(shí)需要選用 修改配置 [mysqld] # 開(kāi)啟二進(jìn)制日志功能 查看主服務(wù)器狀態(tài) show master statusfile 注意看里面的參數(shù),特別前面兩個(gè)File和Position,在從服務(wù)器(Slave)配置主從關(guān)系會(huì)有用到的。 從數(shù)據(jù)庫(kù)(192.168.249.129) 修改/etc/my.cnf,新增如下配置,并重啟服務(wù) [mysqld]server-id=129log-bin=mysql-binreplicate-do-db=mydbreplicate-ignore-db=mysql 在slave中設(shè)置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ù)說(shuō)明: master_host='192.168.249.131' ## Master的IP地址master_user='slave' ## 用于同步數(shù)據(jù)的用戶(在Master中授權(quán)的用戶)master_password='000000' ## 同步數(shù)據(jù)用戶的密碼master_port=3306 ## Master數(shù)據(jù)庫(kù)服務(wù)的端口masterlogfile='mysql-bin.000001' ##指定Slave從哪個(gè)日志文件開(kāi)始讀復(fù)制數(shù)據(jù)(Master上執(zhí)行命令的結(jié)果的File字段)masterlogpos=155 ## 從哪個(gè)POSITION號(hào)開(kāi)始讀(Master上執(zhí)行命令的結(jié)果的Position字段)masterconnectretry=30 ##當(dāng)重新建立主從連接時(shí),如果連接建立失敗,間隔多久后重試。單位為秒,默認(rèn)設(shè)置為60秒,同步延遲調(diào)優(yōu)參數(shù)。 查看從服務(wù)器狀態(tài) 至此數(shù)據(jù)庫(kù)層面主從配置完成。 SpringBoot中配置主從讀寫(xiě)分離 在主從模式下請(qǐng)遵守如下規(guī)則:主數(shù)據(jù)庫(kù) 只執(zhí)行 INSERT,UPDATE,DELETE 操作從數(shù)據(jù)庫(kù) 只執(zhí)行SELECT操作 我們這里使用開(kāi)源項(xiàng)目[dynamic-datasource-spring-boot-starter](https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/)作為讀寫(xiě)分離的工具包 使用方法 在mydb主數(shù)據(jù)庫(kù)中建立一個(gè)簡(jiǎn)單數(shù)據(jù)表user,建好后從數(shù)據(jù)庫(kù)會(huì)自動(dòng)同步 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; 引入相關(guān)依賴 配置數(shù)據(jù)源 spring: datasource: dynamic: primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master strict: false #設(shè)置嚴(yán)格模式,默認(rèn)false不啟動(dòng). 啟動(dòng)后再為匹配到指定數(shù)據(jù)源時(shí)候回拋出異常,不啟動(dòng)會(huì)使用默認(rèn)數(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 在啟動(dòng)類入口加入mybatis掃描包 @SpringBootApplication@MapperScan("com.jianzh6.dynamic.mapper")public class DynamicDatsourceBootstrap { public static void main(String[] args) { SpringApplication.run(DynamicDatsourceBootstrap.class, args); }} 建立實(shí)體類User @Datapublic class User { private int id; private String account; private String name; private String position;} 建立mapper接口文件,新增兩個(gè)方法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服務(wù)層相關(guān)實(shí)現(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,默認(rèn)操作都會(huì)從主庫(kù)執(zhí)行,使用注解@DS切換數(shù)據(jù)源,此注解也可直接用于類文件上,同時(shí)存在方法注解優(yōu)先于類上注解。 編寫(xiě)單元測(cè)試進(jìn)行測(cè)試 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開(kāi)發(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()); }} 通過(guò)觀察執(zhí)行日志,發(fā)現(xiàn)讀寫(xiě)數(shù)據(jù)庫(kù)會(huì)根據(jù)@DS注解進(jìn)行切換,至此Springboot集成數(shù)據(jù)庫(kù)主從讀寫(xiě)分離完成。 以上就是Springboot中怎么利用Mysql8實(shí)現(xiàn)讀寫(xiě)分離功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。service mysqld start
mysql_native_password
加密方式插件,否則默認(rèn)會(huì)使用caching_sha2_password加密方式,這樣在同步的時(shí)候需要使用SSL的身份進(jìn)行驗(yàn)證,為了方便簡(jiǎn)單,我們直接采用mysql_native_password方式/etc/my.cnf
,新增如下配置,開(kāi)啟binlog,并重啟mysql服務(wù)log-bin=mysql-bin #
設(shè)置server_id,,注意在網(wǎng)段內(nèi)要唯一 server-id=131 #(可選配置)要同步的數(shù)據(jù)庫(kù)名,要同步多個(gè)數(shù)據(jù)庫(kù),就多加幾個(gè)replicate-db-db=數(shù)據(jù)庫(kù)名 binlog-do-db=mydb #(
可選配置)要忽略的數(shù)據(jù)庫(kù) binlog-ignore-db=mysql
show slave status\G;
當(dāng)前題目:Springboot中怎么利用Mysql8實(shí)現(xiàn)讀寫(xiě)分離功能
網(wǎng)站地址:http://weahome.cn/article/igcgdh.html