环境:centos7 、 Mysql8
准备三台服务器(2核 4G)
10.200.1.77 、 10.200.1.78 、 10.200.1.79
开放 3306 、 24901 端口
确保三台服务器所有端口可相互访问
1、配置host:
三台上都配置etc/hosts:
10.200.1.77 n0
10.200.1.78 n1
10.200.1.79 n2
三台都关闭selinux
setenforce 0
三台分别执行:
n0:
hostnamectl set-hostname n0
n1:
hostnamectl set-hostname n1
n2:
hostnamectl set-hostname n2
2、Centos7安装Mysql8
在https://dev.mysql.com/downloads/repo/yum/中找到对应版本的rpm文件下载路径
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
yum install -y mysql80-community-release-el7-7.noarch.rpm
yum install mysql-community-server -y
3、MySQL配置文件:
将n0作为主服务,/etc/my.cnf中添加配置:
#设置MySOL插件所在目录,因为MGR基于插件,所以必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
#服务器编号,Master=1
server_id=1
#开启binlog的GTID模式
gtid_mode=ON
#开启后MySOL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
#关闭binlog校验
binlog_checksum=NONE
#定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为XXHASH64
transaction_write_set_extraction=XXHASH64
#确定组复制恢复时是否应该应用SSL,通常设置为“开,但默认设置为“关”
loose-group_replication_recovery_use_ssl=ON
#该服务器的实例所在复制组的名称,必须是有效的UUID,所有节点必须相同
loose-group_replication_group_name="8db47ee5-70b2-49d0-9678-538232393513"
#确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF
#大坑2:
#为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
#很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
#所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="n0:24901"
#用于建立新成员到组的连接组成员列表
#这个列表指定为由分隔号间隔的组成员网络地址列表,类似host1:port1、host2:port2的格式
#同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
#配置此服务器为引导组,这个选项必须仅在一台服务器上设置
#并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF
n1从服务配置:
plugin_dir=/usr/lib64/mysql/plugin
#设置唯一的服务器编号
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#这个参数决定primary节点到secondary节点的请求是否为基于RSA密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="8db47ee5-70b2-49d0-9678-538232393513"
loose-group_replication_start_on_boot=OFF
#设置本机地址n1:24901
loose-group_replication_local_address="n1:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
n2从服务配置:
plugin_dir=/usr/lib64/mysql/plugin
#设置唯一的服务器编号
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#这个参数决定primary节点到secondary节点的请求是否为基于RSA密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="8db47ee5-70b2-49d0-9678-538232393513"
loose-group_replication_start_on_boot=OFF
#设置本机地址n1:24901
loose-group_replication_local_address="n2:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
4、启动MySQL(三台服务分别执行)
service mysqld start;
查看初始密码:
cat /var/log/mysqld.log |grep password
登陆Mysql
mysql -uroot -p'初始密码'
配置账号
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'itdeve'; #更新一下用户的密码
FLUSH PRIVILEGES; #刷新权限
create user 'root'@'%' identified by 'xxxxxx';
grant all privileges on *.* to 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES; #刷新权限
create user 'rpl_user'@'%' identified by 'xxxxxx';
grant REPLICATION SLAVE on *.* to 'rpl_user'@'%';
FLUSH PRIVILEGES; #刷新权限
// 如果报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
先把密码改成复制的,再使用以下:
mysql> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password.length=8;
Query OK, 0 rows affected (0.00 sec)
注意!!!一定要RESET MASTER,删除已产生的Binlog(原因:之前的Binglog中包含创建用户这种高权限操作,而主从同步用的rpl_user账户是没有权限执行的,RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态,利用RESET MASTER删除这些无法执行的binlog,就没问题了)
RESET MASTER;
安装插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
查看插件目录
show global variables like 'plugin_dir' ;
查看插件
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication' \G;
5、配置MRG
在主服务n0中执行:
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
在从服务n1、n2中分别执行:
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="itdeve" FOR CHANNEL 'group_replication_recovery';
start group_replication;
查看同步状态
SELECT * FROM performance_schema.replication_group_members;
6、测试
1)在n0写入数据,在n1、n2查看,数据已经同步
2)主服务停止
停止n0的MySQL服务,在n1上查看同步状态,此时应该看不到n0了,n1应该变成了主服务
service stop mysql
重新启动n0,并在n0上执行
start group_replication;
再查看同步状态,此时n0已经出现,但状态为RECOVERING,表示此时n0正常同步恢复数据
等待一段时间状态恢复为ONLINE,即集群状态恢复正常
此时n1成为主服务,n0、n2为从服务
3)数据不一致处理
重启n0,先不加入集群中,在n0中进行数据修改,此时两边的数据已经不一致
此时再把n0加入集群报错,查看日志提示两侧事务不一致
解决办法:
先重启异常的mysql服务,确保数据和正常服务一致
停止服务同步
stop group_replication;
RESET binlog
RESET MASTER;
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="itdeve" FOR CHANNEL 'group_replication_recovery';
start group_replication;
查看只读状态(正常状态下主节点的global read_only 和 global super_read_only都是off,从节点的都是ON)
show global variables like "%read_only%";
先将global read_only 和 global super_read_only 改为off:
set global read_only=off;
set global super_read_only=off;
手动修改数据,确保数据和正常服务的保持一致,此步需要根据实际情况自行处理
再将global read_only 和 global super_read_only 改为on:
set global read_only=on;
set global super_read_only=on;
在正常主节点自行执行以下命令,记录gtid_executed
show global variables like '%gtid%';
在异常节点执行:
reset master;
show global variables like '%gtid%';
stop group_replication;
set global gtid_purged='正常节点的gtid_executed的值';
重新加入组
change master to master_user='复制组名',master_password='*********' for channel 'group_replication_recovery';
#查看当前的gtid_purged是否和主节点一致
show global variables like '%gtid%';
启动同步
START GROUP_REPLICATION;
查看状态:
select * from performance_schema.replication_group_members;
4)修改主节点
在主节点上查看集群状态,执行
SELECT * FROM performance_schema.replication_group_members;
在主节点上执行修改主节点命令,指定想要切换的服务的MEMBER_ID:
select group_replication_set_as_primary("MEMBER_ID");
5)重启MGR
重启所有节点后,先登录主节点,执行
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
此时主节点已经启动成功,再依次登录从节点,执行
start group_replication;