数据人成长交流的一站式服务平台

网站首页 > 数据编程 正文

详解MGR单主(Single-Primary)模式部署

nandi88 2024-10-01 00:20:34 数据编程 3 ℃

概述

前面说了MGR方面的一些基础介绍,下面介绍一下MGR单主模式应该如何部署..

参考:https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html


一、搭建MGR的基础结构要求和使用限制

1、基础结构要求

1)引擎要求

数据库引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查;

可以通过设置如下参数来禁用其他存储引擎:

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

2)主键要求

每个表必须有主键或者等价的非空的唯一键,在进行事务冲突检测时需要利用主键值对比;

3)binlog日志要求

1、开启二进制日志文件功能
--log-bin[=log_file_name]
2、Slave Updates Logged(组内中的服务器必须可以记录所有事务的日志)
--log-slave-updates
3、二进制日志格式为row
--binlog-format=row
4、Binary Log Checksums Off
--binlog-checksum=NONE

4)GTID要求

必须开启GTID功能,用来检测MGR中事务的执行情况

5)Replication Information Repositories

必须设定如下参数记录主从库的元数据信息(主从状态信息存于表中)

--master-info-repository=TABLE
--relay-log-info-repository=TABLE

6)Transaction Write Set Extraction

设置如下参数使在记录日志的时候同时记录写集,用来检测冲突

--transaction-write-set-extraction=XXHASH64

7) Lower Case Table Names

设置--lower-case-table-names 参数为同一个值,innodb中设置为1

注意不同平台的该值可能不一致

8) Multithreaded Appliers

可以设定一些参数使同步进程并行起来

--slave-parallel-workers=N
--slave-preserve-commit-order=1
--slave-parallel-type=LOGICAL_CLOCK


2、MGR使用限制

1)MGR推荐使用 READ COMMITTED 隔离级别来避免使用Gap Locks
不支持gap lock(间隙锁),隔离级别需设置为read_committed;

2)MGR无法使用复制事件检测
RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none;

3)MGR的验证过程不考虑table locks 和named locks。

不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作;

4)不支持serializable(序列化)隔离级别;

5)多主模式下,MGR不支持同时不同服务器上的同一个对象的的DDL和DML
DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一;

6)多主模式下,MGR不支持级联约束的外键索引
多主模式下不支持外键,单主模式下支持外键;

7)多主模式下,SELECT .. FOR UPDATE语句会引发死锁

8)MGR不支持复制过滤(Replication Filters)

9)MGR最多9个节点,超过9台无法加入集群

10)事务大小的限制

一个成员的独立事务如果过大可能会导致无法在5s内传输到各个节点,这时可能会提出该成员

如果我们不设置单独参数限定大小的话,默认为slave_max_allowed_packet参数的大小,默认是1G

我们可以使用如下方法限定MGR中事务的大小

  • 如果可以减少你事务的大小
  • 设定group_replication_transaction_size_limit参数,5.7中该参数为0,8.0为143M
  • group_replication_compression_threshold 设定消息大小进行压缩的大小,默认为1M

二、MGR单主(Single-Primary)模式部署

MGR建议组内成员间的通讯使用专用网络,类似RAC的private ip

所以这里其实是建议分配三个物理IP,三个私有IP。私有IP用于各个节点的互联,一般是万兆网卡。


1、环境准备

1.1、关闭防火墙和selinux

systemctl stop firewalld && systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl status firewalld

1.2、配置主机名

cat /etc/hosts
=================================
xx.xx.116    mgr_node1  ZCAPZC
xx.xx.161    mgr_node2  JKWMAPZC
xx.xx.173    mgr_node3  EPMSAP
=================================
hostnamectl  set-hostname mgr_node1

1.3、安装数据库

这里通过一键部署脚本来安装,就不写过程了,有兴趣的话可以看头条的置顶文章。

1.4、初始my.cnf修改

修改每一个MySQL节点的配置文件 my.cnf ,增加如下参数,并重启数据库实例

[mysqld]
####################MGR 参数#################################################
master-info-repository=TABLE	#复制元数据存储在系统表而不是文件
relay-log-info-repository=TABLE	#中继日志信息写入到表而不是文件
gtid_mode=on					#开启全局事务ID
enforce_gtid_consistency=on		#开启全局事务ID强一致性
slave_preserve_commit_order=on	#控制从库并行reply时事务提交的顺序
binlog_checksum=NONE			#禁用二进制日志时间校验和
transaction_write_set_extraction=XXHASH64	#以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。

2、创建复制账号

在mgr1/mgr2/mgr3上建立复制账号

set sql_log_bin=0; #设为0后,在Master数据库上执行的语句都不记录binlog
set global validate_password_policy=0;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'xxx34';
CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='xxx34' FOR CHANNEL 'group_replication_recovery';
set sql_log_bin=1;


3、安装group replication插件

在mgr1、mgr2、mgr3上依次安装group replication插件

#安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

#在mgr1使用SELECT UUID()生成一个UUID。
select uuid();


4、再次修改my.cnf配置后重启数据库

注意:写入 my.cnf 文件时,group_replication 开头的参数应该增加 loose- 开头,例如 loose-group_replication_group_name

#mgr1上的my.cnf配置
#######################################MGR配置##########################################
server-id=1    
binlog_format=row
log-slave-updates
lower_case_table_names=1  #忽略大小写
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master-info-repository=TABLE	#复制元数据存储在系统表而不是文件
relay-log-info-repository=TABLE	#中继日志信息写入到表而不是文件
gtid_mode=on					#开启全局事务ID
enforce_gtid_consistency=on		#开启全局事务ID强一致性
slave_preserve_commit_order=on	#控制从库并行reply时事务提交的顺序
binlog_checksum=NONE			#禁用二进制日志时间校验和
transaction_write_set_extraction=XXHASH64	#以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。
loose-group_replication_group_name = "25009bc8-f67a-11ea-8e19-005056bf82fa"  #组的名字可以随便起,必须是有效的UUID,但不能用主机的GTID! 所有节点的这个组名必须保持一致!在二进制日志中为组复制事件设置GTID时,将在内部使用此UUID。使用SELECT UUID()生成一个UUID。                                                                                                                                                    
loose-group_replication_start_on_boot = off #表示组复制是否随实例启动而启动
loose-group_replication_local_address = "xx.116:13306"  #不同节点配置不同节点本身的IP地址和端口,区分MYSQL自身的3306端口
loose-group_replication_group_seeds = "xx.116:13306,xx.161:13306,xx.173:13306" #表示当集群有新成员加入时,可以从哪些节点(IP:Port)获取需要的数据进行 recovery
loose-group_replication_ip_whitelist="172.xx.xx.0/24"  #IP白名单,确定可以接受哪个主机的组通信系统连接
loose-group_replication_bootstrap_group = off  #只用于集群初始化的时候,主节点必须执行,其他节点不需要执行
loose-group_replication_single_primary_mode = true  #启动Single-Primary模式
loose-group_replication_enforce_update_everywhere_checks = false  #在单主模式下该参数必须被设置为 FALSE,当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave谁作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,在group_replication_member_weight值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
loose-group_replication_allow_local_disjoint_gtids_join=OFF  #关闭兼容加入组
loose-group_replication_member_weight=90   #设置此从参数来控制单主模式切换的顺序,前提MGR多节点的版本为统一版本
#实践总结
loose-group-replication_unreachable_majority_timeout=5 #MGR节点由ONLINE状态进入UNREACHABLE状态后(一般是由于网络抖动、节点异常等引起),等待相应的时间,如果仍保持UNREACHABLE,则将节点置为ERROR状态,即这个参数是UNREACHABLE状态的一个timeout,单位秒
loose-group_replication_compression_threshold=131072  #设定消息大小进行压缩的大小,默认为1M,当复制组间通信的event超过这一阈值时,启用LZ4压缩,以减小通信量。
loose-group_replication_transaction_size_limit=20971520 #该参数限制了事务大小,超出限制事务回滚不会广播。事务消息就是 writeset,其大小是由事务变更行数、行长度、唯一索引数量等因素决定。为了增强对大事务的处理能力,8.0.16 支持了消息分片机制,通过 group_replication_communication_max_message_size 参数控制消息分片大小,若消息超过该限制会自动分包广播,到达其他节点后自动合并起来,此参数不能大于 slave_max_allowed_packet 值,默认是 10MB,最大上限 1GB。


 
#mgr2上的my.cnf配置
#######################################MGR配置##########################################
server-id=2
binlog_format=row
log-slave-updates
lower_case_table_names=1  #忽略大小写
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master-info-repository=TABLE	#复制元数据存储在系统表而不是文件
relay-log-info-repository=TABLE	#中继日志信息写入到表而不是文件
gtid_mode=on					#开启全局事务ID
enforce_gtid_consistency=on		#开启全局事务ID强一致性
slave_preserve_commit_order=on	#控制从库并行reply时事务提交的顺序
binlog_checksum=NONE			#禁用二进制日志时间校验和
transaction_write_set_extraction=XXHASH64	#以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。
loose-group_replication_group_name = "25009bc8-f67a-11ea-8e19-005056bf82fa" #组的名字可以随便起,必须是有效的UUID,但不能用主机的GTID! 所有节点的这个组名必须保持一致!在二进制日志中为组复制事件设置GTID时,将在内部使用此UUID。使用SELECT UUID()生成一个UUID。
loose-group_replication_start_on_boot = off  #表示组复制是否随实例启动而启动
loose-group_replication_local_address = "xx.161:13306" #不同节点配置不同节点本身的IP地址和端口,区分MYSQL自身的3306端口
loose-group_replication_group_seeds = "xx.116:13306,xx.161:13306,xx.173:13306" #表示当集群有新成员加入时,可以从哪些节点(IP:Port)获取需要的数据进行 recovery
loose-group_replication_ip_whitelist="172.xx.xx.0/24"  #IP白名单,确定可以接受哪个主机的组通信系统连接
loose-group_replication_bootstrap_group = off  #只用于集群初始化的时候,主节点必须执行,其他节点不需要执行
loose-group_replication_single_primary_mode = true  #启动Single-Primary模式
loose-group_replication_enforce_update_everywhere_checks = false  #在单主模式下该参数必须被设置为 FALSE,当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave谁作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,在group_replication_member_weight值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
loose-group_replication_allow_local_disjoint_gtids_join=OFF  #关闭兼容加入组
loose-group_replication_member_weight=80   #设置此从参数来控制单主模式切换的顺序,前提MGR多节点的版本为统一版本
#实践总结
loose-group-replication_unreachable_majority_timeout=5 #MGR节点由ONLINE状态进入UNREACHABLE状态后(一般是由于网络抖动、节点异常等引起),等待相应的时间,如果仍保持UNREACHABLE,则将节点置为ERROR状态,即这个参数是UNREACHABLE状态的一个timeout,单位秒
loose-group_replication_compression_threshold=131072  #设定消息大小进行压缩的大小,默认为1M,当复制组间通信的event超过这一阈值时,启用LZ4压缩,以减小通信量。
loose-group_replication_transaction_size_limit=20971520 #该参数限制了事务大小,超出限制事务回滚不会广播。事务消息就是 writeset,其大小是由事务变更行数、行长度、唯一索引数量等因素决定。为了增强对大事务的处理能力,8.0.16 支持了消息分片机制,通过 group_replication_communication_max_message_size 参数控制消息分片大小,若消息超过该限制会自动分包广播,到达其他节点后自动合并起来,此参数不能大于 slave_max_allowed_packet 值,默认是 10MB,最大上限 1GB。



#mgr3上的my.cnf配置
#######################################MGR配置##########################################
server-id=3
binlog_format=row
log-slave-updates
lower_case_table_names=1  #忽略大小写
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master-info-repository=TABLE	#复制元数据存储在系统表而不是文件
relay-log-info-repository=TABLE	#中继日志信息写入到表而不是文件
gtid_mode=on					#开启全局事务ID
enforce_gtid_consistency=on		#开启全局事务ID强一致性
slave_preserve_commit_order=on	#控制从库并行reply时事务提交的顺序
binlog_checksum=NONE			#禁用二进制日志时间校验和
transaction_write_set_extraction=XXHASH64	#以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。
loose-group_replication_group_name = "25009bc8-f67a-11ea-8e19-005056bf82fa" #组的名字可以随便起,必须是有效的UUID,但不能用主机的GTID! 所有节点的这个组名必须保持一致!在二进制日志中为组复制事件设置GTID时,将在内部使用此UUID。使用SELECT UUID()生成一个UUID。
loose-group_replication_start_on_boot = off  #表示组复制是否随实例启动而启动
loose-group_replication_local_address = "xx.173:13306" #不同节点配置不同节点本身的IP地址和端口,区分MYSQL自身的3306端口
loose-group_replication_group_seeds = "xx.116:13306,xx161:13306,xx.173:13306" #表示当集群有新成员加入时,可以从哪些节点(IP:Port)获取需要的数据进行 recovery
loose-group_replication_ip_whitelist="172.xx.0/24"  #IP白名单,确定可以接受哪个主机的组通信系统连接
loose-group_replication_bootstrap_group = off  #只用于集群初始化的时候,主节点必须执行,其他节点不需要执行
loose-group_replication_single_primary_mode = true  #启动Single-Primary模式
loose-group_replication_enforce_update_everywhere_checks = false  #在单主模式下该参数必须被设置为 FALSE,当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave谁作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,在group_replication_member_weight值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
loose-group_replication_allow_local_disjoint_gtids_join=OFF  #关闭兼容加入组
loose-group_replication_member_weight=60   #设置此从参数来控制单主模式切换的顺序,前提MGR多节点的版本为统一版本
#实践总结
loose-group-replication_unreachable_majority_timeout=5 #MGR节点由ONLINE状态进入UNREACHABLE状态后(一般是由于网络抖动、节点异常等引起),等待相应的时间,如果仍保持UNREACHABLE,则将节点置为ERROR状态,即这个参数是UNREACHABLE状态的一个timeout,单位秒
loose-group_replication_compression_threshold=131072  #设定消息大小进行压缩的大小,默认为1M,当复制组间通信的event超过这一阈值时,启用LZ4压缩,以减小通信量。
loose-group_replication_transaction_size_limit=20971520 #该参数限制了事务大小,超出限制事务回滚不会广播。事务消息就是 writeset,其大小是由事务变更行数、行长度、唯一索引数量等因素决定。为了增强对大事务的处理能力,8.0.16 支持了消息分片机制,通过 group_replication_communication_max_message_size 参数控制消息分片大小,若消息超过该限制会自动分包广播,到达其他节点后自动合并起来,此参数不能大于 slave_max_allowed_packet 值,默认是 10MB,最大上限 1GB。

5、启动mgr集群

#mgr1上建立基本主库master库:
#设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。  
SET GLOBAL group_replication_bootstrap_group = ON;  
START GROUP_REPLICATION;  
select * from performance_schema.replication_group_members; 

 
#mgr2上启动group_replication: 
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
select * from performance_schema.replication_group_members;

#mgr3上启动group_replication:
set global group_replication_allow_local_disjoint_gtids_join=ON;  
start group_replication;  
select * from performance_schema.replication_group_members;
   
#在mgr1上查看group_replication成员,会有mgr2和mgr3的显示,而且已经是ONLINE了  
mysql> select * from performance_schema.replication_group_members;


都加入节点后:


观察日志:


6、如何找出 Primary 成员

集群搭建成功之后,可以通过查看视图找出 Primary 成员;或者使用 show variables like ‘%read_only%’; 因为 MGR 默认单主模式,secondary 节点会自动开启 read only 模式

select VARIABLE_VALUE from performance_schema.global_status where VARIABLE_NAME='group_replication_primary_member';
#查看 Primary 成员
select *from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');




还有部署过程中碰到的一些报错,有点多,只能单独放一篇介绍了...


最近发表
标签列表