1. MGR背景
MySQL Group Replication 是MySQL官方提供的強(qiáng)一致性存儲(chǔ)方案,可以很方便的提供多點(diǎn)寫入,跨機(jī)房等功能。搭建MGR步驟:
MGR搭建
測(cè)試版本: Percona Server 5.7.19
2. 功能測(cè)試
測(cè)試機(jī)器信息
| alias | hostname | ip | port |
|---|---|---|---|
| rcdb1 | l-rc***db1.uc.cn2 | 10.****.189 | 3315 |
| rcdb2 | l-rc***db2.uc.cn2 | 10.****.196 | 3315 |
| rcdb3 | l-rc***db3.uc.cn2 | 10.****.221 | 3315 |
| rcdb4 | l-rc***db4.uc.cn2 | 10.****.234 | 3315 |
| collectdb3 | l-collect****db3.dba.cn8 | 192.****.202 | 3320 |
2.1 基本功能測(cè)試
| 測(cè)試項(xiàng) | 結(jié)果 | 備注 |
|---|---|---|
| 新加入節(jié)點(diǎn)加入組后,數(shù)據(jù)是否一致 | ?? | |
| group內(nèi)節(jié)點(diǎn)重啟后加入,數(shù)據(jù)是否一致 | ?? | |
| group內(nèi)節(jié)點(diǎn),直接kill掉,重新加入后數(shù)據(jù)是否一致 | ?? | |
| 清理binlog后,新節(jié)點(diǎn)是否能加入 | 只要一個(gè)節(jié)點(diǎn)有新增節(jié)點(diǎn)所需的binlog就可以加入組,否則在嘗試 group_replication_recovery_retry_count 次后報(bào)錯(cuò),加入失敗 | 節(jié)點(diǎn)加入組后無法執(zhí)行 reset master;只能用purge binary logs to 'file';清理binlog |
2.2 加入脫離組
2.2.1 已有數(shù)據(jù)節(jié)點(diǎn)加入組
如果新增節(jié)點(diǎn)A落后數(shù)據(jù)很少,可以直接 START GROUP_REPLICATION; 加入組
如果新增節(jié)點(diǎn)A落后數(shù)據(jù)很多,則需要先選擇任意一個(gè)組內(nèi)節(jié)點(diǎn)作為master開啟復(fù)制
CHANGE MASTER TO MASTER_HOST='ip',MASTER_PORT=port,MASTER_USER='replication',MASTER_PASSWORD='***',MASTER_AUTO_POSITION=1;
- 追上后直接START GROUP_REPLICATION; 加入組(如果直接加入組的話,會(huì)導(dǎo)致組fc)
- 查看是否成功加入組
SELECT * FROM performance_schema.replication_group_members\G;
查看 MEMBER_STATE 值是否為 ONLINE
2.2.2 通過備份加入組
- 使用備份數(shù)據(jù)做好數(shù)據(jù)(舊版本innobackupex不支持MySQL 5.7.19 使用的是公司打包的最新版 innobackupex version 2.4.7)
- 根據(jù)搭建MGR的步驟設(shè)置修改配置文件等(如果是跨機(jī)房需要修改group_replication_ip_whitelist,此參數(shù)默認(rèn)只能同網(wǎng)段節(jié)點(diǎn)加入組,目前多點(diǎn)寫入模式下無法通過備份加入組,但是可以在單主模式加入后,修改為多主)
配置group_replication_ip_whitelist
loose-group_replication_ip_whitelist='192.168.39.0/24,10.90.72.0/24'
- 根據(jù)xtrabackup_binlog_info 設(shè)置新增節(jié)點(diǎn)A的 gtid_purged (通過備份數(shù)據(jù)啟動(dòng)后的gtid值是落后的)
- 先選擇任意一個(gè)組內(nèi)節(jié)點(diǎn)作為master開啟復(fù)制
CHANGE MASTER TO MASTER_HOST='ip',MASTER_PORT=port,MASTER_USER='replication',MASTER_PASSWORD='***',MASTER_AUTO_POSITION=1;
- 追上后直接START GROUP_REPLICATION; 加入組
- 查看是否成功加入組
SELECT * FROM performance_schema.replication_group_members\G;</pre>
查看MEMBER_STATE 值是否為 ONLINE
2.3 DDL和大事務(wù)操作影響
MGR進(jìn)行alter操作是在主節(jié)點(diǎn)完成后,其他節(jié)點(diǎn)再開始執(zhí)行
2.3.1 DDL對(duì)寫入操作的影響
| 操作 | 狀態(tài) | 主節(jié)點(diǎn) | 其他節(jié)點(diǎn) | 備注 | |
|---|---|---|---|---|---|
| alter | |||||
| 主節(jié)點(diǎn)執(zhí)行alter,其他節(jié)點(diǎn)未執(zhí)行 | dml可以順利執(zhí)行 | 可以立刻同步主節(jié)點(diǎn)dml操作 | 無論是否為alter的表,都可以立刻執(zhí)行,并同步 | ||
| alter 其他表也可以順利執(zhí)行 | 主節(jié)點(diǎn)完成后就開始同步 | alter一個(gè)表不會(huì)阻塞alter其他表 | |||
| 主節(jié)點(diǎn)完成alter,其他節(jié)點(diǎn)開始執(zhí)行 | dml可以順利執(zhí)行 | 要等到alter操作執(zhí)行完后,才同步dml操作 | 無論是否為alter的表,都可以立刻執(zhí)行,但要等到完成alter操作后,才會(huì)同步dml | ||
| alter 其他表可以順利執(zhí)行 | 要等當(dāng)前alter執(zhí)行完后,才會(huì)執(zhí)行 |
2.3.2 DDL中斷的影響
| 操作 | 狀態(tài) | 主節(jié)點(diǎn) | 其他節(jié)點(diǎn) | 備注 |
|---|---|---|---|---|
| alter | ||||
| 主節(jié)點(diǎn)執(zhí)行alter,其他節(jié)點(diǎn)未執(zhí)行 | 不斷對(duì)表進(jìn)行插入操作 | 可以同步 | alter執(zhí)行過程中不影響寫入(不論修改表或者其他表)ctrl+C不會(huì)造成數(shù)據(jù)不一致 | |
| 主節(jié)點(diǎn)alter進(jìn)行中,重啟主節(jié)點(diǎn) | 從讀節(jié)點(diǎn)中選擇一個(gè)作為主節(jié)點(diǎn) | 主節(jié)點(diǎn)啟動(dòng)后可以加入group,數(shù)據(jù)一致 | ||
| 主節(jié)點(diǎn)alter進(jìn)行中 讀節(jié)點(diǎn)未執(zhí)行 | 重啟讀節(jié)點(diǎn) | 讀節(jié)點(diǎn)重啟后可以加入組并且數(shù)據(jù)一致 | ||
| 主節(jié)點(diǎn)alter完成, 讀節(jié)點(diǎn)開始執(zhí)行執(zhí)行 | 重啟讀節(jié)點(diǎn) | 讀節(jié)點(diǎn)啟動(dòng)后正常加入組,數(shù)據(jù)一致(這個(gè)是等alter完成后讀節(jié)點(diǎn)才完成關(guān)閉操作) | ||
| 主節(jié)點(diǎn)alter完成, 讀節(jié)點(diǎn)開始執(zhí)行執(zhí)行 | kill讀節(jié)點(diǎn) | 重啟后能夠加入group數(shù)據(jù)一致(但是看文檔說可能會(huì)有不一致的情況) |
2.3.3 qosc改表
| 操作 | 狀態(tài) | 主節(jié)點(diǎn) | 其他節(jié)點(diǎn) | 備注 |
|---|---|---|---|---|
| qosc alter | ||||
| 執(zhí)行改表操作,不斷插入數(shù)據(jù) | ctrl+C | 無亂是否為修改表,都可以寫入數(shù)據(jù),清理trigger,臨時(shí)表后可以再次qosc改表 | ||
| 讀節(jié)點(diǎn)重啟 | 加入group后數(shù)據(jù)一致 | |||
| 直接alter其他表 | 可以正常執(zhí)行并同步 |
2.3.4 大事務(wù)影響
| 主節(jié)點(diǎn)session1 | 主節(jié)點(diǎn)session2 | 讀節(jié)點(diǎn) | 備注 |
|---|---|---|---|
| update big_table_1 set val1=1; (報(bào)錯(cuò)超過max_binlog_cache_size) | 寫數(shù)據(jù) | 對(duì)big_table_1操作被阻塞對(duì)其他表操作順利執(zhí)行,同步 | |
| update big_table_1 set val1=100 limit 10000000; (報(bào)錯(cuò)ERROR 3100 (HY000): Error on observer while running replication hook 'before_commit'.) | 寫數(shù)據(jù) | 鎖不沖突的數(shù)據(jù)都能順利執(zhí)行同步,文檔上說如果傳輸時(shí)間超過5s會(huì)導(dǎo)致失敗 | |
| update big_table_1 set val1=100 limit 500000; | 與later一樣,分為主節(jié)點(diǎn)執(zhí)行階段,讀節(jié)點(diǎn)執(zhí)行階段: 主節(jié)點(diǎn)執(zhí)行時(shí),只要沒有鎖沖突的dml都可以執(zhí)行并同步讀節(jié)點(diǎn)執(zhí)行階段,因?yàn)橐WC事務(wù)順序一致,此時(shí)主節(jié)點(diǎn)的dml要等完成大事務(wù)后才會(huì)同步 |
3. 性能測(cè)試
復(fù)制線程為16
buffer_pool 為16G
機(jī)器為SSD
3.1 單點(diǎn)寫入模式


3.2 多點(diǎn)寫入


3.3 混合讀寫
集群三個(gè)節(jié)點(diǎn)
讀寫為10:4
14個(gè)讀寫操作為一個(gè)事務(wù)
單點(diǎn)寫入
3.3.1 QPS


3.3.2 TPS


4. 基于MGR的InnoDB Cluster高可用
http://03bff331.wiz03.com/share/s/03L_cN2yvkX52KAoED0dgBk-2q1EdR14rA_02a95kh3ExGXn
5. MGR與PXC性能對(duì)比
MGR與PXC主要參數(shù)
復(fù)制線程為24
5.1 單點(diǎn)寫入對(duì)比


5.2 多點(diǎn)寫入
這個(gè)我測(cè)試了很多邊,一直沒想通為啥pxc可以在多點(diǎn)寫入時(shí)性能那么好,感覺都沒受到線程增加影響
mgr隨著線程增加有明顯的下降


5.3 混合讀寫
讀寫大概10:4 14個(gè)讀寫操作為一個(gè)事務(wù)
都為三個(gè)節(jié)點(diǎn)


綜合上面對(duì)比可以發(fā)現(xiàn),mgr 跟 pxc5.7 整體性能相近,單節(jié)點(diǎn)寫入時(shí)mgr線程數(shù)較多時(shí)性能較佳,多節(jié)點(diǎn)寫入時(shí)pxc5.7在線程數(shù)較多時(shí)性能較佳