MGR缺点和限制:
对网络稳定性要求很高,至少是同机房做。
稳定性相对较弱。
不支持binlog checksum
不支持savepoint
不支持gap locks
不支持lock tables, unlock tables
多主模式不支持多节点同时对一个表进行DDL vs DDL/DML
多主模式不支持SERIALIZABLE隔离级别
多主模式不支持多级关联外键
qabb-qa-mysql-test0 10.9.95.110
qabb-qa-mysql-test1 10.9.78.64
qabb-qa-mysql-test2 10.9.118.252
端口 3306 ,集群通信端口 13306
部署mysql
sudo salt-call state.sls role.percona-server
sudo salt-call state.sls role.percona-server
我自己的环境是利用salt安装,读者朋友可以根据自己的环境来自行安装。
配置文件
这里列出来核心的参数,其他参数和正常的主从无差别。大家可以自行准备。
log_slave_updates = 1
binlog_format = row
performance_schema = ON
binlog_checksum = NONE
#GTID
master_info_repository = 'TABLE'
relay_log_info_repository = 'TABLE'
gtid_mode = ON
enforce_gtid_consistency = ON
#MGR
transaction_write_set_extraction=XXHASH64 #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off #设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "10.9.95.110:13306" #host:port,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds="10.9.95.110:13306,10.9.78.64:13306,10.9.118.252:13306"
loose-group_replication_bootstrap_group= off #配置是否自动引导组
其中
loose 前缀的意义在于第一次启动时还没加载组复制的plugin,可以让mysql server忽略该参数,继续启动。
group_replication_group_name 表示MGR复制组的名字。可以手工指定,但是必须符合uuid的格式。
group_replication_bootstrap_group为on时表示该实例是整个集群的引导组。需要特别注意,引导的实例只需要一个,所以集群内其他实例都不需要开启这个参数,默认为off。只有第一次初始化集群或者整个集群重启时需要再set global来开启.
loose-group_replication_start_on_boot 为false时组复制不随实例启动。
loose-group_replication_local_address [host|ip]:port,其中port是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds 需要接受本MGR实例控制的实例 [host|ip]:port,其中port是MGR的端口,不是数据库的端口
group_replication_single_primary_mode 决定是否为单主模式(ON)还是多主模式(OFF) 单主模式要求过半数节点写入成功之后,主库才返回成功。多主模式可以提高性能,但是事务冲突的概率也更高。
loose-group_replication_enforce_update_everywhere_checks多主模式下,强制检查每一个实例是否允许写操作,如果是单主模式,可以设置为off。
loose 前缀的意义在于第一次启动时还没加载组复制的plugin,可以让mysql server忽略该参数,继续启动。
group_replication_group_name 表示MGR复制组的名字。可以手工指定,但是必须符合uuid的格式。
group_replication_bootstrap_group为on时表示该实例是整个集群的引导组。需要特别注意,引导的实例只需要一个,所以集群内其他实例都不需要开启这个参数,默认为off。只有第一次初始化集群或者整个集群重启时需要再set global来开启.
loose-group_replication_start_on_boot 为false时组复制不随实例启动。
loose-group_replication_local_address [host|ip]:port,其中port是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds 需要接受本MGR实例控制的实例 [host|ip]:port,其中port是MGR的端口,不是数据库的端口
group_replication_single_primary_mode 决定是否为单主模式(ON)还是多主模式(OFF) 单主模式要求过半数节点写入成功之后,主库才返回成功。多主模式可以提高性能,但是事务冲突的概率也更高。
loose-group_replication_enforce_update_everywhere_checks多主模式下,强制检查每一个实例是否允许写操作,如果是单主模式,可以设置为off。
mkdir -p /data/my3306/{data,run,tmp,log};
chown -R mysql:mysql /data/my3306/;
/opt/mysql/bin/mysqld --defaults-file=/data/my3306/my.cnf --initialize-insecure
/opt/mysql/bin/mysqld --defaults-file=/data/my3306/my.cnf --initialize-insecure
使用 initialize-insecure 选项是为了测试,生产环境大家需要注意安全性。
2.3 配置mgr 第一个结点
### 创建核心用户
set sql_log_bin=0;
CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
GRANT PROXY ON ''@'' TO 'root'@'127.0.0.1' WITH GRANT OPTION;
create user replicuser@'%';
grant replication slave,replication client on *.* to replicuser@'%' identified by 'replicuser';
set sql_log_bin=1;
###
change master to master_user='replicuser',master_password='replicuser' for channel 'group_replication_recovery';
### 安装组复制插件。
install plugin group_replication SONAME 'group_replication.so';
### 启动组复制
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
### 检查节点是否加入
SELECT * FROM performance_schema.replication_group_members;
对应的日志 内容
第二个节点和第三个节点执行如下操作
set sql_log_bin=0;
CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
GRANT PROXY ON ''@'' TO 'root'@'127.0.0.1' WITH GRANT OPTION;
create user replicuser@'%';
grant replication slave,replication client on *.* to replicuser@'%' identified by 'replicuser';
set sql_log_bin=1;
change master to master_user='replicuser',master_password='replicuser' for channel 'group_replication_recovery';
install plugin group_replication SONAME 'group_replication.so';
###
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
SELECT * FROM performance_schema.replication_group_members;
在第二第三节点执行 start group_replication;命令之后,日志输出如下,新的节点已经加入到集群组中了。
[Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test1:3306'
[Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test2:3306'
[Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test1:3306'
[Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test2:3306'
安装成功之后,查看集群的状态。
这里对结果做个说明:
CHANNEL_NAME:显示的值永远为group_replication_applier
MEMBER_ID :实例节点的serer_uuid值
MEMBER_PORT :实例节点服务端口,取值为server_port指定的端口
MEMBER_HOST :如果没有配置report_host选项,那么取值为机器的hostname,可以通过report_host配置指定具体的IP
MEMBER_STATE : 节点状态
ONLINE 表示该节点可正常提供服务
RECOVERING 表示该节点正在从其他节点恢复数据
OFFLINE 表示MGR插件已经加载,但是该节点不属于任何一个GR组
ERROR 表示该节点在recovery阶段出现错误或者从其他节点同步状态中出现错误
UNREACHABLE 表示该节点处于不可达状态,无法与之发生网络通讯
在主节点创建数据库和表 并插入数据。
mytest [RW][TEST::3306] 03:26:25 >create table x(
id int not null auto_increment primary key ,
a int default 0 ) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mytest [RW][TEST::3306] 03:26:58 >insert into x(a) values(1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
第二节点查询数据,与主节点数据一致。
三 小结
本文算是初试牛刀的how to文档,没有什么特别深刻的技术含量,不过也算是入坑MGR了。目前接触的DBA同行有些对技术追求的比较快,已经在线上大规模使用MGR了,也从侧面说明MGR可以在生产使用。随着官方的推进,未来MGR 会成为一种可靠的技术选项。
参考文章
https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
最后,给大家介绍一个好课。
由知数堂联合冯光普老师共同打造的《深入浅出MySQL Group Replication》课程上线了。
本课程分成基础、进阶、实践三大模块,系统全面地从基本原理、实现细节、实践指导等多方面学习掌握MGR各个知识点,课程中还介绍了MGR的特性及限制、适用场景、冲突检测原理、流控机制、性能优化等内容。本课程系业界首发,可通过知数堂在线课堂在线学习。原价68元,现在报名可享受首月特价仅需48元。
冯老师是某大型电商数据库负责人,保障线上数据库集群的稳定高效运行,并负责数据库自动化运维平台建设,热衷开源数据库技术分享及交流。