数据库之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;"

 搭建的时候注意细节,有些参数需要根据自身情况调整下

原文地址:https://www.cnblogs.com/shumtn/p/13407870.html