MYSQL MGR复制模式

  • MGR简介
  • MGR搭建步骤
  • MGR故障模拟
  • 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单主、多主的搭建过程!工欲善其事,必先利其器。笔者建议各位读者在掌握基本的搭建方法之后,能够投入更多的时间,模拟各种故障的场景,提高处理故障的能力,深入剖析底层的原理。

MYSQL MGR复制模式相关推荐

  1. 基于mysql传统复制模式转为GTID模式 mysql 5.7版本

    来源:<MySQL运维内参> ① 所有的server上执行 set @@global.enforce_gtid_consistency = warn; 特别注意: 这一步是关建的一步使用不 ...

  2. clickhouse 同步mysql_ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式

    原文出自:https://bohutang.me/2020/08/26/clickhouse-and-friends-mysql-gtid-replication/ 最后更新: 2020-09-03 ...

  3. mysql gtid 搭建主从_MySQL5.7 - 基于GTID复制模式搭建主从复制

    MySQL5.7 - 基于GTID复制模式搭建主从复制 发布时间:2020-04-17 10:09:20 来源:51CTO 阅读:226 作者:insist_way 环境: MySQL5.7.24版本 ...

  4. mysql在线复制_mysql的两种复制模式

    mysql的复制术语 扩展的方式: Scale up Scale Out 复制: 向外扩展 二进制日志 单向 复制功用: 数据分布 负载均衡:读操作,适用于读密集型的应用 备份 高可用和故障切换 My ...

  5. DBA(三):MySQL主从同步、复制模式

    MySQL主从同步 主从同步概述 MySQL主从同步 主从同步介绍 实现数据自动同步的服务结构 主服务器:接受客户端访问连接 从服务器:自动同步主服务器的数据 主从同步的工作原理 主库有1个线程叫du ...

  6. MYSQL的主从和主主复制模式

    一.复制介绍 MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录 ...

  7. Mysql组复制(MGR)——技术细节

    本文提供mysql组复制相关的更多技术细节. 一. 组复制插件架构 Mysql组复制是一个mysql插件,且其构建于已有mysql复制架构之上,其利用了类似二进制日志,基于行的日志及全局事务标识符等的 ...

  8. Mysql组复制(MGR)——常问的问题

    本文提供常被问到问题的答案. 1.复制组中最多能有多少个mysql服务器? 复制组最多包含9个mysql服务器.尝试向已有9个服务器的组添加另外的服务器将被拒绝. 2.组内服务器间如何连接? 组内服务 ...

  9. Mysql组复制(MGR)——前提及限制

    本文将对组复制的前提条件和限制进行列举和解释. 一.组复制前提 想用组复制的服务器实例必须满足如下前提条件: 1.基础架构 1)InnoDB存储引擎.数据必须存储于InnoDB事务存储引擎.事务被乐观 ...

最新文章

  1. 史上最权威宏基因组软件评估—人工重组宏基因组基准数据集
  2. Python学习笔记:进程和线程(起)
  3. silverlight ListBox 多列图片效果
  4. Robot Framework(十七) 扩展RobotFramework框架——扩展Robot Framework Jar
  5. leetcode509. 斐波那契数(矩阵快速幂)
  6. 详解rel=”nofollow”的用法与意义
  7. mysqlserver输入密码后闪退_iOS降级教程:iOS 14 后如何降级到ios13?
  8. xcode工程间的引用,iOS静态库
  9. php中输入这个网站的网址跳转到你定义的页面代码
  10. Python文档学习笔记(1)--使用Python 解释器
  11. 计算机刷bios版本,华硕主板怎么刷BIOS版本?华硕主板在线升级BIOS详细图文教程...
  12. php带图片的每日单词,GRE背单词-每日十个单词(第一天) - 英语家园
  13. 计算机管理模块无法初始化单元,win7组策略提示MMC无法初始化管理单元怎么办...
  14. Python制作安卓游戏外挂
  15. debconf_Starbound的开源游戏开发,DebConf上的SteamOS等
  16. c语言程序实例100题,C 练习实例3
  17. 关于css3中的2d样式skew倾斜详解
  18. memcacheredis构建缓存服务器
  19. Github上的开源工具帮助你实现“十一”回家的愿望
  20. Git 上传代码到github上

热门文章

  1. 苹果发布了史上最强但最贵的 iPhone 新品,还有中国特供版 # 天猫首发
  2. Hotspot 源码入门
  3. Windows 8 微软官方 MSDN版 下载
  4. WIFI (热点)打开和关闭
  5. android万能USB驱动的安装方法.(针对开发人员 windows)
  6. linux下获取在终端中输出的数据
  7. Unity Shader 之 像素风格(马赛克风格)的简单实现
  8. 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
  9. Android开发之使用MediaRecorder录制声音
  10. 你被「七月再见,八月你好」刷屏了吗?