零、簡介
MySQL Group Replication(簡稱MGR)字面意思是mysql組復制的意思,但其實他是一個高可用的集群架構,暫時只支持mysql5.7和mysql8.0版本.
是MySQL官方於2016年12月推出的一個全新的高可用與高擴展的解決方案,提供了高可用、高擴展、高可靠的MySQL集群服務.
也是mysql官方基於組復制概念並充分參考MariaDB Galera Cluster和Percona XtraDB Cluster結合而來的新的高可用集群架構.
MySQL Group Replication是建立在基於Paxos的XCom之上的,正因為有了XCom基礎設施,保證數據庫狀態機在節點間的事務一致性,才能在理論和實踐中保證數據庫系統在不同節點間的事務一致性。
由一般主從復制概念擴展,多個節點共同組成一個數據庫集群,事務的提交必須經過半數以上節點同意方可提交,在集群中每個節點上都維護一個數據庫狀態機,保證節點間事務的一致性。
優點:
高一致性,基於原生復制及paxos協議的組復制技術.
高容錯性,有自動檢測機制,當出現宕機后,會自動剔除問題節點,其他節點可以正常使用(類似zk集群),當不同節點產生資源爭用沖突時,會按照先到先得處理,並且內置了自動化腦裂防護機制.
高擴展性,可隨時在線新增和移除節點,會自動同步所有節點上狀態,直到新節點和其他節點保持一致,自動維護新的組信息.
高靈活性,直接插件形式安裝(5.7.17后自帶.so插件),有單主模式和多主模式,單主模式下,只有主庫可以讀寫,其他從庫會加上super_read_only狀態,只能讀取不可寫入,出現故障會自動選主.
缺點:
還是太新,不太穩定,暫時性能還略差於PXC,對網絡穩定性要求很高,至少是同機房做.
模式:
支持多主模式,但官方推薦單主模式:
多主模式下,客戶端可以隨機向MySQL節點寫入數據
單主模式下,MGR集群會選出primary節點負責寫請求,primary節點與其它節點都可以進行讀請求處理.
一、安裝
1、環境規划
多主模式下最好有三台以上的節點,單主模式則視實際情況而定,不過同個Group最多節點數為9.服務器配置盡量保持一致,因為和PXC一樣,也會有"木桶短板效應".
需要特別注意,mysql數據庫的服務端口號和MGR的服務端口不是一回事,需要區分開來.
而server-id要區分開來是必須的,單純做主從復制也要滿足這一點了.
2、部署
由於方便我這里直接用docker部署
# 拉取MySQL鏡像
docker pull mysql/mysql-server
# 創建專門的網絡,連接各個容器
docker network create mysql_mgr docker network ls
# 創建容器
for N in 1 2 3 do docker run -d --name=node$N --net=mysql_mgr --hostname=node$N \ -v $PWD/d$N:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypass \ mysql/mysql-server \ --server-id=$N \ --log-bin='mysql-bin-1.log' \ --enforce-gtid-consistency='ON' \ --log-slave-updates='ON' \ --gtid-mode='ON' \ --transaction-write-set-extraction='XXHASH64' \ --binlog-checksum='NONE' \ --master-info-repository='TABLE' \ --relay-log-info-repository='TABLE' \ --plugin-load='group_replication.so' \ --relay-log-recovery='ON' \ --group-replication-start-on-boot='OFF' \ --group-replication-group-name='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' \ --group-replication-local-address="node$N:33061" \ --group-replication-group-seeds='node1:33061,node2:33061,node3:33061' \ --loose-group-replication-single-primary-mode='OFF' \ # 如果單主模式,則設置為ON --loose-group-replication-enforce-update-everywhere-checks='ON' # 如果單主模式,則設置為OFF done
# 配置首節點,如:創建用戶,開啟組復制等
docker exec -it node1 mysql -uroot -pmypass \ -e "SET @@GLOBAL.group_replication_bootstrap_group=1;" \ -e "create user 'repl'@'%' identified by 'P@ssword1!';" \ -e "GRANT REPLICATION SLAVE ON *.* TO repl@'%';" \ -e "flush privileges;" \ -e "change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';" \ -e "START GROUP_REPLICATION;" \ -e "SET @@GLOBAL.group_replication_bootstrap_group=0;" \ -e "SELECT * FROM performance_schema.replication_group_members;"
# 新增其他節點
for N in 2 3 do docker exec -it node$N mysql -uroot -pmypass \ -e "change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';" \ -e "START GROUP_REPLICATION;" done
# 驗證集群是否正常
docker exec -it node1 mysql -uroot -pmypass -e "select * from performance_schema.replication_group_members;"
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | group_replication_applier | d955da6d-0048-11ea-b7b4-525400f4342d | node1 | 3306 | ONLINE | PRIMARY | 8.0.18 | | group_replication_applier | e050c34f-0048-11ea-917d-52540021fab9 | node2 | 3306 | ONLINE | SECONDARY | 8.0.18 | | group_replication_applier | e6c56347-0048-11ea-9e8b-5254007c241f | node3 | 3306 | ONLINE | SECONDARY | 8.0.18 | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)
# 單主切換到多主
###################################################################### # 單主切換到多主 # MGR切換模式需要重新啟動組復制,因此需要在所有節點上先關閉組復制, #設置 group_replication_single_primary_mode=OFF 等參數,再啟動組復制。 1) 停止組復制(在所有MGR節點上執行): stop group_replication; set global group_replication_single_primary_mode=OFF; set global group_replication_enforce_update_everywhere_checks=ON; 2) 隨便選擇某個MGR節點執行 (比如這里選擇在MGR-node1節點): set global group_replication_recovery_get_public_key=1; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 然后在其他的MGR節點執行 (這里指MGR-node2和MGR-node3節點上執行): set global group_replication_recovery_get_public_key=1; START GROUP_REPLICATION; 4) 查看MGR組信息 (在任意一個MGR節點上都可以查看) SELECT * FROM performance_schema.replication_group_members; # 可以看到所有MGR節點狀態都是online,角色都是PRIMARY,MGR多主模式搭建成功。 ##########################################################################
# 多主切換回單主
########################################################################## # 多主切回單主模式 1) 停止組復制(在所有MGR節點上執行): stop group_replication; set global group_replication_single_primary_mode=ON; set global group_replication_enforce_update_everywhere_checks=OFF; 2) 選擇一個節點作為主節點, 在主節點上執行 (這里選擇MGR-node1節點作為主節點) SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 在其他剩余的節點, 也就是從庫節點上執行 (這里從庫節點指的就是MGR-node2和MGR-node3): START GROUP_REPLICATION; 4) 查看MGR組信息 (在任意一個MGR節點上都可以查看) SELECT * FROM performance_schema.replication_group_members;
##########################################################################
# 注意故障
# 故障注意點: # 單主模式,恢復MGR-node1節點, 恢復后, 需要手動激活下該節點的組復制功能 # 如果節點發生故障, 在恢復后需要重新加入到MGR集群里, 正確的做法是: STOP GROUP_REPLICATION; START GROUP_REPLICATION; # 如果某個節點掛了, 則其他的節點繼續進行同步. # 當故障節點恢復后, 只需要手動激活下該節點的組復制功能("START GROUP_REPLICATION;"), # 即可正常加入到MGR組復制集群內並自動同步其他節點數據. # 如果是i/o復制出現異常 # 確定數據無誤后 # 查找主庫的gtid情況 mysql> show global variables like '%gtid%' ; +----------------------------------------------+-------------------------------------------------------+ | Variable_name | Value | +----------------------------------------------+-------------------------------------------------------+ | binlog_gtid_simple_recovery | ON | | enforce_gtid_consistency | ON | | group_replication_gtid_assignment_block_size | 1000000 | | gtid_executed | 58f6e65e-9309-11e9-9d88-525400184a0a:1-946050:1000003 | | gtid_executed_compression_period | 1000 | | gtid_mode | ON | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------------------+-------------------------------------------------------+ 9 rows in set (0.00 sec) # 在有故障的從庫中操作 stop GROUP_REPLICATION; reset master; set global gtid_purged='58f6e65e-9309-11e9-9d88-525400184a0a:1-946055:1000003'; START GROUP_REPLICATION; # 添加白名單網段 stop group_replication; set global group_replication_ip_whitelist="127.0.0.1/32,172.16.60.0/24,172.16.50.0/24,172.16.51.0/24"; start group_replication; show variables like "group_replication_ip_whitelist"; # 一定要注意: 配置白名單前面一定要先關閉 Group Replication, 及先要執行"stop group_replication;"
搭建的時候注意細節,有些參數需要根據自身情況調整下