數據庫之MySQL部署MGR方案(二)


零、簡介

  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;"

 搭建的時候注意細節,有些參數需要根據自身情況調整下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM