MYSQL MGR复制模式

MGR简介

MGR组复制模式是MYSQL官方在5.7.17版本正式推出的一种复制方式。
MGR由若干个节点组成一个复制组,一个事务的提交,必须经过组内(N/2+1)决议并通过,才能得以提交。

MGR引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。
组复制依靠分布式一致性Paxos协议,实现了分布式下数据的最终一致性,实现了高可用。

MGR特点如下:
高一致性:基于分布式paxos协议实现组复制,保证数据一致性;
高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作;
高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;
高灵活性:提供单主模式和多主模式,单主模式在主库宕机后自动选主,所有写入都在主节点进行,多主模式支持多节点写入。

MGR的局限:
1. 只支持innodb存储引擎
2. 每张表必须有一个主键,用于做write set的冲突检测
3. 只支持ipv4,网络需求较高
4. 必须打开gtid特性,二进制日志格式必须为row,用于选主与write set
5. commit可能会导致失败,类似于快照事务隔离级别的失败场景
6. 目前一个mgr集群组最多支持9个节点
7. 不支持save point特性,无法做全局间的约束检测与部分回滚
8. 二进制日志binlog不支持replication event checksums
9. 多主模式不支持serializable事务隔离级别
10.多主模式不能完全支持级联外键约束
11. 多主模式不支持在不同节点对同一个数据库对象并发执行DDL,不同节点对同一行并行发起rw事务,后发起的事务会失败。 

MGR搭建步骤

1. 初始化数据目录
2. 配置主服务器配置
3. 配置辅助服务器配置
4. 启动mysql实例
5. 安装组复制插件
6. 创建复制用户
7. 在主服务器上启动组复制
8. 将辅助服务器连接到主服务器上
9. 确认组复制状态
# 注:本项目实验环境基于MYSQL8.0.27版本,搭建模式为单主MGR.

# 1. 解压MYSQL压缩包
tar xzf mysql-8.0.27-linux-glibc2.12-x86_64.tar.gz

# 2. 初始化数据目录
mkdir -p /root/mgr/{data,sock}
cd /root/mgr
./mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --no-defaults --user=root --initialize-insecure --basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64 --datadir=/root/mgr/data/primary
./mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --no-defaults --user=root --initialize-insecure --basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64 --datadir=/root/mgr/data/secondary1
./mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --no-defaults --user=root --initialize-insecure --basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64 --datadir=/root/mgr/data/secondary2
./mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --no-defaults --user=root --initialize-insecure --basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64 --datadir=/root/mgr/data/secondary3

# 3. 配置主服务器配置
cat > /root/mgr/data/primary/primary.cnf <<-EOF
[mysqld]
datadir=/root/mgr/data/primary
basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64
plugin_dir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/lib/plugin/
port=24801
socket=/root/mgr/sock/primary.sock
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog-checksum=NONE
# 定义用于事务期间哈希写入提取的算法,组模式必须配置为XXHASH64
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用SSL,通常设置为开,但默认设置为关
loose-group_replication_recovery_use_ssl=ON
# 该服务器的实例所在复制组的名称,必须是有效的UUID
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制
loose-group_replication_start_on_boot=OFF
# 为复制组中其他的成员提供网络地址
loose-group_replication_local_address="127.0.0.1:24901"
# 用于建立新成员到组的连接组成员列表
loose-group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903,127.0.0.1:24904"
# 配置此服务器为引导组(仅在一台服务器上配置,成功引导启动后应该将该选项改为关闭)
loose-group_replication_bootstrap_group=OFF
EOF

# 4. 配置辅助服务器配置
for i in `seq 1 3`
do
cat > /root/mgr/data/secondary$i/secondary$i.cnf <<-EOF
[mysqld]
datadir=/root/mgr/data/secondary$i
basedir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64
plugin_dir=/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/lib/plugin/
port=2480$((i+1))
socket=/root/mgr/sock/secondary$i.sock
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog-checksum=NONE
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_get_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="127.0.0.1:2490$((i+1))"
loose-group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903,127.0.0.1:24904"
loose-group_replication_bootstrap_group=OFF
EOF
done

# 5. 启动MYSQL实例(--user=root一定要在defaults-file后边)
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/root/mgr/data/primary/primary.cnf --user=root > primary_output.txt 2>&1 &
for i in `seq 1 3`
do
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/root/mgr/data/secondary$i/secondary$i.cnf --user=root > /root/mgr/data/secondary$i/secondary$i_output.txt 2>&1 &
done

# 6. 登录所有节点数据库
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysql -uroot -S /root/mgr/sock/primary.sock
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysql -uroot -S /root/mgr/sock/secondary1.sock
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysql -uroot -S /root/mgr/sock/secondary2.sock
/root/mgr/mysql-8.0.27-linux-glibc2.12-x86_64/bin/mysql -uroot -S /root/mgr/sock/secondary3.sock

# 7. 安装组复制插件(所有节点)
SQL> install plugin group_replication SONAME 'group_replication.so';
# 查看状态
SQL> select * from information_schema.plugins where plugin_name = 'group_replication' \G

# 8. 创建复制用户(Replication user)账户(所有节点)
# 不记录日志
SQL> set sql_log_bin=0;
SQL> create user repl@'%' identified by 'repl';
SQL> grant replication slave on *.* to repl@'%';
SQL> flush privileges;
# 记录日志
SQL> set sql_log_bin=1;

# 9. 在主服务器上启动组复制
SQL> set global group_replication_bootstrap_group=ON;
SQL> start group_replication;
SQL> set global group_replication_bootstrap_group=OFF;

# 10. 将辅助(secondaries)服务器连接到主(primary)服务器
# 每个从节点都执行,连接到主节点上
SQL> change master to master_user='repl', master_password='repl' for channel 'group_replication_recovery';
# 每个节点启动组复制
SQL> start group_replication;

# 11. 确认组复制的状态
SQL> select * from performance_schema.replication_group_members \G;
SQL> select member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

MGR故障模拟

# kill主库进程
ps -ef | grep mysql | grep -v grep | grep primary.cnf | awk '{print $2}' | xargs kill -9
# 查看主库是否自动切换到其他节点上
SQL> select member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

MGR模式切换

单主切换多主

# 停止组复制(所有节点执行)
SQL> stop group_replication;
SQL> set global group_replication_single_primary_role=off;
SQL> set global group_replication_enforce_update_everywhere_checks=on;

# 选择任意节点执行:
SQL> set global group_replication_bootstrap_group=on;
SQL> start group_replication;
SQL> st global group_replication_bootstrap_group=off;

# 其他节点执行:
SQL> start replication;

# 查看主库是否自动切换到其他节点上
SQL> select member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

多主切换单主

# 停止组复制(所有节点执行)
SQL> stop group_replication;
SQL> set global group_replication_enforce_update_everywhere_checks=off;
SQL> set global group_replication_single_primary_role=on;

# 选择主节点执行:
SQL> set global group_replication_bootstrap_group=on;
SQL> start group_replication;
SQL> st global group_replication_bootstrap_group=off;

# 其他节点执行:
SQL> start replication;

# 查看主库是否自动切换到其他节点上
SQL> select member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

写给读者

至此,您已经掌握了基本的MGR单主、多主的搭建过程!工欲善其事,必先利其器。笔者建议各位读者在掌握基本的搭建方法之后,能够投入更多的时间,模拟各种故障的场景,提高处理故障的能力,深入剖析底层的原理。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值