我們通過 Mycat 和 MySQL 的主從復(fù)制配合搭建數(shù)據(jù)庫的讀寫分離仰美,實(shí)現(xiàn) MySQL 的 高可用性迷殿。我們將搭建:一主一從、雙主雙從兩種讀寫分離模式咖杂。
1搭建 MySQL 數(shù)據(jù)庫主從復(fù)制
-
原理
- 主機(jī)配置(atguigu01)
修改mysql的配置文件etc/my.cnf
#主服務(wù)器唯一ID
server-id=1
#啟用二進(jìn)制日志
log-bin=mysql-bin
# 設(shè)置不要復(fù)制的數(shù)據(jù)庫(可設(shè)置多個(gè))
binlog-ignore-db=mysql binlog-ignore-db=information_schema
#設(shè)置需要復(fù)制的數(shù)據(jù)庫 binlog-do-db=需要復(fù)制的主數(shù)據(jù)庫名字
#設(shè)置logbin格式 binlog_format=STATEMENT
- 從機(jī)配置
還是同樣的修改my.cnf文件:
修改配置文件:vim /etc/my.cnf
#從服務(wù)器唯一ID
server-id=2
#啟用中繼日志
relay-log=mysql-relay
- 主機(jī)庆寺、從機(jī)重啟 MySQL 服務(wù)
- 主機(jī)從機(jī)都關(guān)閉防火墻
- 在主機(jī)上建立帳戶并授權(quán) slave
#在主機(jī)MySQL里執(zhí)行授權(quán)命令
CREATE USER 'slave2'@'%' IDENTIFIED BY '123123';
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%'; #此語句必須執(zhí)行。否則見下面诉字。
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges; #查詢master的狀態(tài) show master status;
#記錄下File和Position的值 #執(zhí)行完此步驟后不要再操作主服務(wù)器MySQL止邮,防止主服務(wù)器狀態(tài)值變化
- 在從機(jī)上配置需要復(fù)制的主機(jī)
復(fù)制主機(jī)的命令
CHANGE MASTER TO MASTER_HOST='主機(jī)的IP地址', MASTER_USER='slave', MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具體數(shù)字',MASTER_LOG_POS=具體值;
下面兩個(gè)參數(shù)都是Yes,則說明主從配置成功! # Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主機(jī)新建庫奏窑、新建表导披、insert 記錄,從機(jī)復(fù)制
這個(gè)主要是測(cè)試一下埃唯,在主機(jī)上做一些數(shù)據(jù)庫的修改撩匕,從機(jī)會(huì)不會(huì)更新如何停止從服務(wù)復(fù)制功能
stop slave;如何重新配置主從
stop slave;
reset master;
2 配置 Macat 讀寫分離
1.2.1 登錄Mycat,創(chuàng)建邏輯庫墨叛,配置數(shù)據(jù)源
在Mycat里創(chuàng)建數(shù)據(jù)庫mydb1 #創(chuàng)建db2邏輯庫
create database mydb1;
修改mydb1.schema.json 指定數(shù)據(jù)源 "targetName": "prototype"止毕,配置主機(jī)數(shù)據(jù)源 vim /usr/local/mycat/conf/schemas/mydb1.schema.json
在我第一個(gè)帖子里面又講,就跟登錄mysql一樣的登錄mycat不過端口號(hào)是8066漠趁,當(dāng)然也可以使用工具 扁凛,比如 navicat來登錄mycat。
1.2.2 使用注解方式添加數(shù)據(jù)源
這里我們可以在登錄之后(命令行登錄或者navicat等工具連接好)闯传,運(yùn)行下面的一些命令:
登錄Mycat谨朝,注解方式添加數(shù)據(jù)源,指向從機(jī)
/*+ mycat:createDataSource{ "name":"rwSepw", "url":"jdbc:mysql://192.168.140.100:3306/mydb1?useSSL=false&characterEncodi ng=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123123" } */;
/*+ mycat:createDataSource{ "name":"rwSepr", "url":"jdbc:mysql://192.168.140.99:3306/mydb1?useSSL=false&characterEncodin g=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123123" } */;
查詢配置數(shù)據(jù)源結(jié)果
/*+ mycat:showDataSources{} */;
更新集群信息,添加dr0從節(jié)點(diǎn).實(shí)現(xiàn)讀寫分離
/*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rw Sepr"]} */;
查看配置集群信息
/*+ mycat:showClusters{} */;
查看集群配置文件 conf/clusters/prototype.cluster.json
readBalanceType
查詢負(fù)載均衡策略 可選值: BALANCE_ALL(默認(rèn)值)
獲取集群中所有數(shù)據(jù)源
BALANCE_ALL_READ
獲取集群中允許讀的數(shù)據(jù)源
BALANCE_READ_WRITE 獲取集群中允許讀寫的數(shù)據(jù)源,但允許讀的數(shù)據(jù)源優(yōu)先 BALANCE_NONE
獲取集群中允許寫數(shù)據(jù)源,即主節(jié)點(diǎn)中選擇
switchType NOT_SWITCH:不進(jìn)行主從切換 SWITCH:進(jìn)行主從切換
3 重新啟動(dòng) Mycat
1.2.4驗(yàn)證讀寫分離
這里注意一點(diǎn)甥绿,我們?cè)谂渲眉何募臅r(shí)候readBalanceType配置的是all字币,也就是說讀的時(shí)候是輪訓(xùn)的遍歷所有的數(shù)據(jù)源來讀取,寫入的話在文中沒有特意的配置共缕,我們可以按需在配置的數(shù)據(jù)源文件中配置: instanceType:配置實(shí)例只讀還是讀寫
可選值: READ_WRITE,READ,WRITE
-
在寫主機(jī)數(shù)據(jù)庫表mytbl中插入帶系統(tǒng)變量數(shù)據(jù)洗出,造成主從數(shù)據(jù)不一致 INSERT INTO mytbl VALUES(2,@@hostname);
- 在Mycat里查詢mytbl表,可以看到查詢語句在主從兩個(gè)主機(jī)間切換