目录
MHA vs MGR谁更合适用在生产系统
教程
MySQL 5.7 基于组复制(MySQL Group Replication)
细节
总结
主要依赖MySQL的插件:group_replication.so
。MySQL可能在5.7.20以后才有这个插件,所以建议安装5.7.20以上的版本。
MGR的特性
高一致性。基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
高容错性。只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
高扩展性。节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
高灵活性。有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
搭建MGR的基础结构要求和使用限制(重点)
基础结构要求:
1.引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查;
2.每个表必须有主键,在进行事务冲突检测时需要利用主键值对比;
3.必须开启binlog且为row格式;
4.开启GTID,且主从状态信息存于表中(--master-info-repository=TABLE
、--relay-log-info-repository=TABLE
),--log-slave-updates
打开;
5.一致性检测设置--transaction-write-set-extraction=XXHASH64
。
使用限制:
1.RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none
;
2.不支持gap lock(间隙锁),隔离级别需设置为read_committed;
3.不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作;
4.不支持serializable(序列化)隔离级别;
5.DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一;
6.多主模式下不支持外键,单主模式下支持外键;最多9个节点,超过9台无法加入集群。
搭建流程(单写模式)
所有MySQL
修改mysql.cnf
1 |
vi /etc/mysql/conf.d/mysql.cnf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 配置(记得把注释去掉) [mysqld] server-id=1 # (根据节点修改)Mysql服务ID gtid-mode=on # 全局事务 enforce-gtid-consistency=on # 强制GTID的一致性 master-info-repository=TABLE # 将master.info元数据保存在系统表中 relay-log-info-repository=TABLE # 将relay.info元数据保存在系统表中 binlog-checksum=none # 禁用二进制日志事件校验 log-slave-updates=on # 级联复制 log-bin=binlog # 开启二进制日志记录 binlog-format=ROW # 以行的格式记录 transaction-write-set-extraction=XXHASH64 # 使用哈希算法将其编码为散列 loose-group_replication_group_name='d7554cee-bc3f-11eb-bdca-0242ac16210a' # 加入的组名,可以修改,只要格式对 loose-group_replication_start_on_boot=off # 不自动启用组复制集群 loose-group_replication_local_address='mysql_m1:33061' # (根据节点修改)除3306以外的端口。以本机端口3306接受来自组中成员的传入连接 loose-group_replication_group_seeds='mysql_m1:33061,mysql_s1:33062,mysql_s2:33063' # 除3306以外的端口。组中成员访问表 loose-group_replication_bootstrap_group=off # 不启用引导组 loose-group_replication_member_weight=50 # 权重:新主选举时的优先级参照,越大,优先级越高 |
执行SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 创建用于复制的账户,并赋予复制的权限 SET SQL_LOG_BIN=0; create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%' with grant option; flush privileges; reset master; SET SQL_LOG_BIN=1; # 修改master信息,构建组复制(group replication)集群信息 change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; # 开启组复制插件 install PLUGIN group_replication SONAME 'group_replication.so'; # 查看插件是否开启 show plugins; |
1 2 3 4 5 |
+----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ |
master MySQL
1 2 3 4 |
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; SELECT * FROM performance_schema.replication_group_members; |
1 2 3 4 5 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | c9e3662b-9020-11e9-94aa-000c29721e89 | youxi1 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ |
slave MySQL
1 2 3 |
set global group_replication_allow_local_disjoint_gtids_join=ON; start group_replication; select * from performance_schema.replication_group_members; |
1 2 3 4 5 6 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 8fbf8b41-84fe-11e9-897e-000c29f27e52 | youxi2 | 3306 | ONLINE | | group_replication_applier | c9e3662b-9020-11e9-94aa-000c29721e89 | youxi1 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ |
搭建流程(多写模式)
只需要在mysql.cnf加上两行配置:
1 |
vi /etc/mysql/conf.d/mysql.cnf |
1 2 |
loose-group_replication_single_primary_mode=off #关闭单主模式的参数(本例测试时多主模式,所以关闭该项) loose-group_replication_enforce_update_everywhere_checks=on #开启多主模式的参数 |
区分主从服务器
MGR区分主从服务器使用show variables like '%read_only%';
查看read_only相关参数。如果是主服务器(youxi1),会显示如下:
1 2 3 4 5 6 7 8 9 10 |
mysql> show variables like '%read_only%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ |
如果是从服务器(youxi2)会显示如下:
1 2 3 4 5 6 7 8 9 10 |
mysql> show variables like '%read_only%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | ON | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ |