第一節(jié)基礎(chǔ)
--讀寫分離的原理
多臺mysql服務(wù)器
分別提供讀寫服務(wù)逮诲,均衡流量
通過主從復(fù)制保持?jǐn)?shù)據(jù)一致性
由mysql代理面向客戶端
收到sql寫請求時洁段,交給服務(wù)器a處理
收到sql讀請求時酒奶,交給服務(wù)器b處理
具體區(qū)分策略由服務(wù)設(shè)置
讀寫分離:數(shù)據(jù)的讀,寫分離
優(yōu)點(diǎn)
1.增加冗余
2.增加了機(jī)器的處理能力
3.對于讀操作為主的應(yīng)用,使用讀寫分離是最好的場景肴盏,因?yàn)榭梢源_保寫的服務(wù)器壓力更小芋浮,而讀又可以接受點(diǎn)時間上的延遲冲甘。
缺點(diǎn)
單點(diǎn)故障
容易形成瓶頸
拓?fù)鋱D:
第二節(jié)實(shí)戰(zhàn)
--構(gòu)建思路
部署mysql一主一從 同步結(jié)構(gòu)
已經(jīng)搭建好mysql主從復(fù)制
基于上一個實(shí)驗(yàn)的結(jié)果
其中slave為只讀
添加一臺mysql代理服務(wù)器(讀寫分離服務(wù)器)
部署/啟用maxscale
client測試
1)mysql中間件
Mysqlcat
Maxscale
Mysql-proxy
--配置
1,mysql一主一從同步結(jié)構(gòu)
1)配置主服務(wù)
[root@mysql-51 ~]# vim /etc/my.cnf
[mysqld]
log_bin=master51
server_id=51 #mysql主從里途样,id必須唯一江醇,范圍:1~255
binlog_format="mixed"
[root@mysql-51 ~]# systemctl restart mysqld ??#重啟刷新文件配置
mysql> show master status\G; #查看主庫master狀態(tài),查看當(dāng)前使用的binlog日志文件
*************************** 1. row ***************************
?????????????File: master51.000001
?????????Position: 441
?????Binlog_Do_DB:
?Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql> grant replication slave on *.* to repluser@'%' identified by '123456'; #授權(quán)給從服務(wù)器何暇,單個數(shù)據(jù)庫授權(quán)無效陶夜,必須設(shè)置*.*
2)配置從服務(wù)器
mysql> show slave status; #查看從庫信息
mysql> show master status; ??????#查看binlog日志,查看主庫信息
[root@mysql-52 ~]# vim /etc/my.cnf
[mysqld]
server_id=52 #從庫id裆站,要唯一
[root@mysql-52 ~]# systemctl restart mysqld
mysql> change master to
????-> master_host='192.168.4.51',
????-> master_user='repluser',
????-> master_password='123456',
-> master_log_file='master51.000001', #與主庫binlog日志名相同
-> master_log_pos=441; #偏移量条辟,與主庫相同
提示:任意參數(shù)指定不對,io線程讀取不了信息
mysql> start slave; #啟動slave(io,sql線程)
mysql> show slave stattus\G;
???????????????Slave_IO_State: Waiting for master to send event
??????????????????Master_Host: 192.168.4.51
??????????????????Master_User: repluser
??????????????????Master_Port: 3306
????????????????Connect_Retry: 60
??????????????Master_Log_File: master51.000001
Read_Master_Log_Pos: 441
???????????????Relay_Log_File: mysql-52-relay-bin.000002
????????????????Relay_Log_Pos: 319
????????Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes ????????????#看到y(tǒng)es就成功了
Slave_SQL_Running: Yes #ok了
??????????........
提示:sql線程在執(zhí)行中繼日志的sql命令時宏胯,一旦出錯羽嫡,sql線程立即停止
方案:停掉slave,在從庫新建相關(guān)表,重啟slave
2肩袍,mysql代理服務(wù)器配置
使用軟件-->maxscale
配置文件:/etc/maxscale.cnf
[root@myweb-57 jluo]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
[root@myweb-57 jluo]# vim /etc/maxscale.cnf
[maxscale] ????????????#進(jìn)程名
threads=auto #線程數(shù)量杭棵,默認(rèn)1
[server1]
type=server
address=192.168.4.51 ??#主庫ip
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.4.52 ??#從庫ip
port=3306
protocol=MySQLBackend
[MySQL Monitor] ??#監(jiān)視mysql服務(wù)
type=monitor
module=mysqlmon
servers=server1, server2
user=scalemon ?????#maxscale登錄mysql服務(wù)用戶名,用于監(jiān)視mysql 是否running, ???????????????????????
passwd=123456 ?#主從結(jié)構(gòu)是否正常氛赐,誰是主庫魂爪,誰是slave
monitor_interval=10000 ???#每隔10s檢查一次
#detect_stale_master=true ??????#當(dāng)所有的slave都不可用時,select查詢請求會轉(zhuǎn)發(fā)到master艰管。
#[Read-Only Service] 不需要指明只讀
#type=service
#router=readconnroute
#servers=server1
#user=scalemon
#passwd=mypwd
#router_options=slave
[Read-Write Service] #定義讀寫分離服務(wù)
type=service
router=readwritesplit
servers=server1, server2
user=pliadmin #maxscale連接mysql服務(wù)檢查客戶端
passwd=123456 #使用的用戶名和密碼用的用戶名,密碼
max_slave_connections=100% ?#所有的slave提供select查詢服務(wù)
#max_slave_replication_lag = 5 ?????# slave超時5秒滓侍,就把請求轉(zhuǎn)發(fā)到其他slave
[MaxAdmin Service] #定義管理服務(wù)
type=service
router=cli #命令行
#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008
[Read-Write Listener]
type=listener
service=Read-Write Service #與上面的[Read-Write Service]
protocol=MySQLClient
port=4006 #maxscale服務(wù)監(jiān)聽的端口號
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service #與上面的[MaxAdmin Service]一樣
protocol=maxscaled
socket=default
port=4026 ???????????????????#自定義端口號,不寫使用默認(rèn)端口
#user=maxscale ?????????#用戶名默認(rèn)admin
#passwd=Mhu87p2D #密碼默認(rèn)mariadb
51,52添加授權(quán)
51牲芋,52主機(jī)都要添加權(quán)限
mysql> grant select,insert on db1.* to rose@'%' identified by '123456'; #授予客戶端相應(yīng)訪問權(quán)限
mysql> grant replication slave,replication client on *.* to scalemon@'%'
-> identified by '123456'; ??????????#授權(quán)給maxscale
mysql> grant select on mysql.* to pliadmin@'%' identified by '123456'; #授權(quán)給maxscal
提示:授權(quán)地址必須寫’%’撩笆,否則會自動添加上ipv6地址,就會出錯
replication slave:常用于建立復(fù)制時所需要用到的用戶權(quán)限缸浦,也就是slave server必須被master server授權(quán)具有該權(quán)限的用戶夕冲,才能通過該用戶復(fù)制master server 的binlog日志sql語句。
并且"SHOW SLAVE HOSTS"這條命令和REPLICATION SLAVE權(quán)限有關(guān)餐济,否則執(zhí)行時會報錯:
??ERROR 1227 (42000): Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation
replication client:不可用于建立復(fù)制耘擂,有該權(quán)限時,只是多了可以使用如"SHOW SLAVE STATUS"絮姆、"SHOW MASTER STATUS"等命令醉冤。
在5.6.6版本以后秩霍,也可以使用"SHOW BINARY LOGS"
52主機(jī)
mysql> select user,host from mysql.user;
+-----------+-----------+
| user ?????| host ?????|
+-----------+-----------+
| pliadmin ?| % ????????|
| scalemon ?| % ????????|
57主機(jī)
[root@myweb-57 jluo]# maxscale -f /etc/maxscale.cnf ???#開啟服務(wù)
[root@myweb-57 jluo]# ss -tunlp | grep maxscale
tcp ???LISTEN ????0 ?????128 ?????:::4026 ????????????????:::* ??????????????????users:(("maxscale",pid=4498,fd=12))
tcp ???LISTEN ????0 ?????128 ?????:::4006 ????????????????:::* ??????????????????users:(("maxscale",pid=4498,fd=11))
[root@myweb-57 jluo]# killall -9 maxscale #停止服務(wù)
提示:注意57主機(jī)上不能運(yùn)行mysql數(shù)據(jù)庫服務(wù)
3)客戶端驗(yàn)證
在maxscale本機(jī)連接管理端口
Maxadmin ?-uadmin ?-pmariadb ?-P端口
訪問maxscale代理
Mysql ?-h服務(wù)器地址 -P端口 -u用戶名 -p密碼
在57本機(jī)訪問管理服務(wù)查看監(jiān)控信息
[root@myweb-57 jluo]# maxadmin -uadmin -pmariadb -P4026
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server ????????????| Address ????????| Port ?| Connections | Status ?????????????
-------------------+-----------------+-------+-------------+--------------------
server1 ???????????| 192.168.4.51 ???| ?3306 | ??????????0 | Master, Running
server2 ???????????| 192.168.4.52 ???| ?3306 | ??????????0 | Slave, Running
第三節(jié)測試
在客戶端主機(jī)連接57對數(shù)據(jù)進(jìn)行訪問,測試能否實(shí)現(xiàn)讀寫分離
測試一:
51主機(jī)
mysql> insert into db1.t1 values(11);
Client主機(jī)
[root@mysql-50 ~]# mysql -h192.168.4.57 -P4006 -urose -p123456
mysql> select * from db1.t1;
+------+
| id ??|
+------+
| ??11 |
測試二:
52主機(jī)
mysql> insert into db1.t1 values(52); #主機(jī)51沒有這條數(shù)據(jù)
Client主機(jī)
mysql> select * from db1.t1;
+------+
| id ??|
+------+
| ??11 |
| ??52 |
測試三:
Client主機(jī):
mysql> insert into db1.t1 values(50);
mysql> select * from db1.t1;
+------+
| id ??|
+------+
| ??11 |
| ??52 |
| ??50 |
綜上三個測試可知蚁阳,實(shí)現(xiàn)了讀寫分離
結(jié)束語:
更多精彩內(nèi)容持續(xù)更新中铃绒,關(guān)注我微信公眾號,有你更精彩螺捐。