MySQL Group Replication实践
Group Replication直接翻译过来就是组复制,是基于组的复制(Group-based Replication)技术,和galera集群可以相提并论,在应用场景中可以实现高可用。
Replication-group(复制组)是由能够相互通信的多个服务器(节点)组成的。一个Replication-group就是一组节点,每个节点都可以独立执行事务,而读写事务则会在于group内的其他节点进行协调之后再commit。
2016年12月12日,在MySQL 5.7.17中,Group Replication GA。
下载最新的MySQL5.7.17版本,进行测试:
准备工作,GroupReplication有很多限制,需要将以下几个参数加入到配置文件中。
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
transaction_write_set_extraction = XXHASH64
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = ON
也可以启动后通过set global这种方式来设置,其中gtid_mode和enforce_gtid_consistency为不可动态动态修改参数
$ mysqld --defaults-file=mysql4307.cnf --initialize-insecure #初始化数据库并且不生成密码
$ mysqld --defaults-file=mysql4307.cnf & #启动数据库
$ uuidgen #生成uuid,用作后面group_replication_name
929c33d5-bdd8-44fa-87be-ae9f8e96d0f2
在第一个节点上操作:
mysql> INSTALL PLUGIN group_replication SONAME "group_replication.so";
mysql> SET GLOBAL group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”;
mysql> SET GLOBAL group_replication_local_address = "192.168.1.1:13306";
mysql> SET GLOBAL group_replication_bootstrap_group = ON; #只在第一个节点设置,集群启动后需要将该参数关闭
mysql> START GROUP_REPLICATION;
mysql> GRANT replication_slave on *.* to repl@’%’ identified by‘repl4slave’; FLUSH PRIVILEGES;
在第后续节点上操作:
mysql> INSTALL PLUGIN group_replication SONAME "group_replication.so";
mysql> SET GLOBAL group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”;
mysql> SET GLOBAL group_replication_local_address = "192.168.1.2:13306";
mysql> SET GLOBAL group_replication_group_seeds = "192.168.1.1:13306";
mysql> CHANGE MASTER TO MASTER_USER="repl",MASTER_PASSWORD="repl4slave" FOR CHANNEL"group_replication_recovery";
mysql> START GROUP_REPLICATION;
如果无法启动,请查看错误日志,里面说明的相关原因。
为了方便,我们可以把参数写入到配置文件中,可以省去多数配置步骤。
plugin-load = group_replication.so
group_replication_single_primary_mode = OFF
group_replication_start_on_boot = OFF
group_replication_group_name = "929c33d5-bdd8-44fa-87be-ae9f8e96d0f2”
group_replication_local_address = '10.11.8.39:24902'
group_replication_group_seeds = '10.11.8.38:24901,10.11.8.39:24901'
说明:
group_replication_single_primary_mode 是否只有一个主可写,设置为ON时,其它节点不可写
group_replication_start_on_boot 是否在mysql启动时同时启动Group Replication
group_replication_bootstrap_group 是否为Group Replication的引导节点,集群中第一个节点需要设置为ON来启动Group Replication
经过测试,也是操作失误,发现了一个问题,就是用CRT同时向2个实例中发送命令,drop database xxx,竟然2个实例中数据库全部删除,随之就开始报错,无法进行同步。同时也找出了在出错时,没有重要数据情况下或数据库量少,快速恢复但为集群的办法(请勿在生产环境中使用,后果自负)。
mysql> stop group_replication;
mysql> reset master;
mysql> start group_replication;
$ mysql < backup.sql