MySQL组复制(单主)部署及运维

环境: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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值