网站首页 > 数据编程 正文
概述
前面说了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');
还有部署过程中碰到的一些报错,有点多,只能单独放一篇介绍了...
- 上一篇: 超详细的MGR常见报错汇总 mgr文件
- 下一篇: 一篇文带你解决mysql的主从复制延迟问题
猜你喜欢
- 2024-10-01 MYSQL进阶优化之配置文件调优分享!
- 2024-10-01 使用RDS和本地mysql做主从同步,实现多服务器数据同步
- 2024-10-01 MySQL5.7在线无锁添加Slave节点—xtrabackup在线备份方式
- 2024-10-01 分分钟搭建MySQL GR测试环境 mysqlmgr搭建
- 2024-10-01 MySQL 8.0 高可用集群之MGR(组复制)
- 2024-10-01 没有宫廷内斗,数据库界的延禧攻略
- 2024-10-01 云计算实战:主从复制 主从复制是集群吗
- 2024-10-01 MySQL主从复制,你还不了解吗? mysql 主从复制
- 2024-10-01 实战:MySQL 5.7多源复制单slave 多master
- 2024-10-01 mysql的主从复制延迟问题——看这一篇就够了
- 最近发表
- 标签列表
-
- 快照读和当前读 (52)
- mysqlipv6 (52)
- oraclepdb (60)
- cad2020破解 (52)
- jdbcoracleurl (54)
- vncviewermac (62)
- sqlservermax (58)
- mysqlcanal (61)
- mysql:commandnotfound (56)
- mysqlexplainfiltered (56)
- python位运算符 (59)
- sqlserver模糊查询 (53)
- ethtool-g (50)
- linuxfind-name模糊查询文件 (60)
- centos7systemctl (76)
- mysqlgt (55)
- nc命令 (66)
- dockerfilecp (55)
- rockstor (50)
- permitrootlogin (55)
- modifycolumn (52)
- 单行子查询返回多个行解决办法 (58)
- mysql字符串函数 (53)
- ssh-2.0-openssh_7.4 (56)
- maxsurge (52)