mgr未同步 mysql_MySQL复制(十八) 官方的分布式解决方案MGR!

MySQL从5.7.17通过引入组复制[1]的架构,通过在MySQL 8.0的不断优化,提高了MGR的可用性,很多企业或团队都已经在项目中使用(可参考:MySQL Group Replication性能测试,星辰大海还是前路茫茫?[2],Galera将死——MySQL Group Replication正式发布[3])。

组复制实现

MGR是MySQL原生的高可用和可扩展解决方案,以插件的方式实现分布式下数据最终一致性,主要特点:

  • 一致性和容错性
    • 使用分布式协议(类Paxos)实现容错和多节点协调
    • 自动检测节点状态,能自动选举
  • 扩展性
    • 支持节点的新增和删除,并能实现数据同步
    • 支持单个Primary和多个Primary模式(单节点写或多节点写)

MGR架构:73c3c13ae733357f79945403c350e244.png对写的事务,需要组内进行验证是否有冲突,投票决定能否提交。

多组模式下故障切换:0f9cdd08da907de57c0bce295a15bf9c.png可以结合MySQL Router中间件实现故障的屏蔽。

配置组复制

复制相关配置

server_id=1 #每个成员唯一
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #8.0.21 支持CRC32
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

组复制相关配置(8.0.16+)

transaction_write_set_extraction=XXHASH64 # 对每个事务的写集,使用XXHASH64算法进行编码
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #集群组名称
loose-group_replication_start_on_boot=off #是否随服务开启自动组复制
loose-group_replication_local_address= "10.xx.xx.1:24901" #集群本地端口,跟其他成员通信
loose-group_replication_group_seeds= "10.xx.xx.1:24901,10.xx.xx.2:24901,10.xx.xx.3:24901" #需要加入复制组的成员列表
loose-group_replication_bootstrap_group= off #节点是否为主节点,一个复制组只能有一个
group_replication_message_cache_size=1073741824
group_replication_autorejoin_tries=3
group_replication_member_expel_timeout=5

复制账号

组复制使用异步复制协议完成分布式恢复,在加入组时,需要先进行恢复,每个成员都需要创建。

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'xx';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='xx' FOR CHANNEL 'group_replication_recovery';

启动组复制

-- `安装插件`
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

-- `开启组复制,bootstrap仅仅在单台服务器做一次`
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

-- `查看复制组状态`
SELECT * FROM performance_schema.replication_group_members;

往组里面添加成员

相关步骤:

  • 配置binlog和gr相关选项
  • 创建复制组恢复相关账号
  • 安装gr插件
  • 开启组复制(START GROUP_REPLICATION;),加入到组

监控组复制

相关元数据表:

  • performance_schema.replication_group_member_stats
  • performance_schema.replication_group_members
  • performance_schema.replication_connection_status
  • performance_schema.replication_applier_status

组复制维护

  • 多主和单主模式
    • 默认为单主模式
    • 不管哪种模式,MGR不处理客户端侧的fail-over
    • 当在多主模式下,事务隔离级别不能为SERIALIZABLE,表不能有外键,选项 group_replication_enforce_update_everywhere_checks控制是否开启检查
    • 当单主模式下,需关闭 group_replication_enforce_update_everywhere_checks
  • 单主模式下
    • bootstrap的节点为读写模式,其他节点自动设置为read_only,包括super_read_only
    • 查找当前primary
      •  SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member';

组复制限制和要求[4]

  • 要求
    • 必须使用Innodb存储引擎,事务在提交时检查冲突,如果出现冲突,其他事务需要回滚,需要支持事务的存储引擎
    • 主键,在进行事务冲突检查时用于标识每个事务修改的行
    • 启用二进制日志(binlog)
    • slave记录binlog(log_slave_updates),需要用于恢复等
    • 使用row格式的binlog,从日志中提取信息进行冲突检测
    • 开启GTID,以标识事务唯一性
    • 存储复制信息到TABLE(master_info_repository=TABLE,relay_log_info_repository=TABLE)
    • 提取事务写集(transaction_write_set_extraction=XXHASH64),用于检测冲突
  • 限制
    • MGR跟复制事件checksum不兼容(binlog_checksum=NONE),8.0.21开始支持CRC32
    • 不支持GAP锁,除非使用RR隔离级别,GR推荐使用RC事务隔离级别
    • 不支持表锁(LOCK TABLES)和GET_LOCK()
    • 不支持保存点,链式事务
    • 多PRIMARY组复制环境,不支持SERIALIZABLE事务隔离级别
    • 在不同服务器执行同一个对象的DDL语句,将不能检测到冲突
    • 在多PRIMARY环境,不支持级联约束外键,因为不能确定冲突检查,在多PRIMARY环境,使用参数group_replication_enforce_update_everywhere_checks=ON避免未检测到的冲突
    • 一个组最多9台server

参考资料

[1]

Group Replication: https://dev.mysql.com/doc/refman/8.0/en/group-replication.html

[2]

MySQL Group Replication性能测试,星辰大海还是前路茫茫?: http://www.innomysql.com/article/25840.html

[3]

Galera将死——MySQL Group Replication正式发布: http://mp.weixin.qq.com/s/Tr_O1DNKDA6CXZS4IV1Bdw

[4]

Requirements and Limitations: https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements-and-limitations.html

8b9700cc79337094707e554182604edd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值