欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL5.7 MGR 集群搭建

程序员文章站 2022-03-10 16:09:07
MGR 介绍环境准备创建复制环境MGR 介绍MySQL Group Replication(简称 MGR)是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案。MySQL 组复制提供了高可用、高扩展、高可靠的 MySQL 集群服务。1. 高一致性,基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;(paxos协议将所有节点都写入同一个值,且被写入后不再更改。)2. 高容错性,只要不是大多数节点坏掉就可以继续工作,有.....

MGR 介绍
环境准备
创建复制环境

MGR 介绍

MySQL Group Replication(简称 MGR)是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案。MySQL 组复制提供了高可用、高扩展、高可靠的 MySQL 集群服务。

1.  高一致性,基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;(paxos协议将所有节点都写入同一个值,且被写入后不再更改。)
2.  高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
3.  高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
4.  高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有 server 都可以同时处理更新操作。
MGR 是 MySQL 数据库未来发展的一个重要方向
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
MGR 使用限制:
1)RP 和普通复制 binlog 校验不能共存,需设置--binlog-checksum=none
2)不支持 gap lock(间隙锁),隔离级别需设置为 read_committed
3)不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入 mysqldump 全表备份恢复操作
4)不支持 serializable(序列化)隔离级别
5)DDL 语句不支持原子性,不能检测冲突,执行后需自行校验是否一致
不支持外键:多主不支持,单主模式不存在此问题
最多支持 9 个节点:超过 9 台 server 无法加入组

环境准备

数据库服务器规划

ip地址 主机名 数据库 端口号 server id  操作系统
192.168.0.60 centos-60 mysql-5.7.25 3306 100 centos 7.6
192.168.0.70 centos-70 mysql-5.7.25 3306 101 centos 7.6
192.168.0.80 centos-80 mysql-5.7.25 3306 102 centos 7.6

安装 MySQL 5.7
 

tar xvf mysql-5.7.tar.gz
yum -y install ./mysql*.rpm
systemctl start mysqld
vim /etc/my.cnf
validate-password=OFF
systemctl restart mysqld
grep 'password' /var/log/mysqld.log
mysql -u root -p'临时密码'
set password for root@localhost = password('123456');
flush privileges;
exit
scp mysql*.rpm root@192.168.0.70:/root
scp mysql*.rpm root@192.168.0.80:/root

设置 hostname 和 IP 映射

在三台数据库服务器上都设置:
vim /etc/hosts
MySQL5.7 MGR 集群搭建

创建复制环境

60执行以下命令
vim /etc/my.cnf
 

[mysqld]
# Group Replication
validate-password=off
server_id = 100 #服务 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 = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加
入的组名
loose-group_replication_start_on_boot = off #不自动启用组复制集群
loose-group_replication_local_address = 'centos-60:33061' #以本机端口 33061 接受来自
组中成员的传入连接
loose-group_replication_group_seeds  =  'centos-60:33061,centos-70:33062,
centos-80:33063' #组中成员访问表
loose-group_replication_bootstrap_group = off #不启用引导组

重启 MySQL 服务
systemctl restart mysqld
服务器 xuegod63.cn 上建立复制账号
mysql -u root -p123456
set SQL_LOG_BIN=0; #停掉日志记录
grant replication slave on *.* to repl@'192.168.0.%' identified by '123456';
flush privileges;
set SQL_LOG_BIN=1; #开启日志记录
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #构建 group replication 集群
install plugin group_replication soname 'group_replication.so'; #在 MySQL 服务器 xuegod63.cn 上安装 group replication 插件
show plugins;  #查看 group replication 组件
set global group_replication_bootstrap_group=ON; #为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。
start group_replication;
set global group_replication_bootstrap_group=OFF;
select * from performance_schema.replication_group_members; #查看 mgr 的状态
测试服务器
create database test;
use test;
create table t1 (id int primary key,name varchar(20)); #注意创建主键
insert into t1 values (1,'man');
select * from t1;
show binlog events;
MySQL5.7 MGR 集群搭建
 

70执行以下命令
/etc/my.cnf
[mysqld]
# Group Replication
validate-password=off
server_id = 101 #注意服务 ID 不一样
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = 'centos-70:33062' #注意地址不一样
loose-group_replication_group_seeds  =  'centos-60:33061,  centos-70:33062,centos-80:33063'
loose-group_replication_bootstrap_group = off
重启 MySQL 服务
systemctl restart mysqld
用户授权
mysql -u root -p123456
set SQL_LOG_BIN=0; #停掉日志记录
grant replication slave on *.* to repl@'192.168.0.%' identified by '123456';
flush privileges;
set SQL_LOG_BIN=1; #开启日志记录
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #构建 group replication 集群
install PLUGIN group_replication SONAME 'group_replication.so'; #安装 group replication 插件
把实例添回到之前的复制组
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
select * from performance_schema.replication_group_members; #查看复制组状态
select * from test.t1; #查看数据库发现 test 库和 t1 表已经同步

80执行以下命令
/etc/my.cnf
[mysqld]
# Group Replication
validate-password=off
server_id = 102 #注意服务 id 不一样
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = 'centos-80:33063' #注意地址不一样
loose-group_replication_group_seeds  ='centos-60:33061,centos-70:33062,centos-80:33063'
loose-group_replication_bootstrap_group = off

重启 MySQL 服务
systemctl restart mysqld
用户授权:
mysql -u root -p123456
set SQL_LOG_BIN=0; #停掉日志记录
grant replication slave on *.* to repl@'192.168.0.%' identified by '123456';
flush privileges;
set SQL_LOG_BIN=1; #开启日志记录
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #构建 group replication 集群
install PLUGIN group_replication SONAME 'group_replication.so';  #安装 group replication 插件
把实例添回到之前的复制组
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
select * from performance_schema.replication_group_members; #查看复制组状态
MySQL5.7 MGR 集群搭建
show global status like 'group_replication_primary_member'; #查看复制组中主库是谁
MySQL5.7 MGR 集群搭建
show variables like 'group_replication%'; #查看集群参数设置列表
以上单 master 节点的集群就搭建完毕!
经过测试,60主库可读写,70-80从库只读。60主库停止mysql服务,70成为主库,80仍为从库。70主库插入新数据,80从库同步更新。60重新启动mysql服务,并start group_replication;60同步更新数据并成为了从库,70仍为主库

多主 master 模式

group_replication_enforce_update_everywhere_checks=ON #多主模式下各个节点严格一致性检查
group_replication_single_primary_mode=OFF #关闭单主模式
read_only、super_read_only 这两个参数,多主模式下的服务器需要修改这两个配置为OFF(作为从库的值是ON)
show variables like "%read_only%";
show variables like "%group_replication_enforce_update_everywhere_checks%";
show variables like "%group_replication_single_primary_mode%";
在原来单主模式的主节点执行操作如下:
stop group_replication;
set global group_replication_enforce_update_everywhere_checks=ON;
set global group_replication_single_primary_mode=OFF;
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
而对于其他的节点,执行下面的操作即可
stop group_replication;
set global group_replication_allow_local_disjoint_gtids_join=ON;(即使含有组中不存在的事务,也允许当前 server 加入组)
set global group_replication_enforce_update_everywhere_checks=ON;
set global group_replication_single_primary_mode=off;
start group_replication;
直接搭建多主 master 模式
vim /etc/my.cnf
# Group Replication
server_id = 100 #服务 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 = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的组名
loose-group_replication_start_on_boot = off #不自动启用组复制集群
loose-group_replication_local_address = 'centos-60:33061' #以本机端口 33061 接受来自组中成员的传入连接
loose-group_replication_group_seeds  ='centos-60:33061,centos-70:33062,centos-80:33063' #组中成员访问表
loose-group_replication_bootstrap_group = off #不启用引导组
group_replication_single_primary_mode = off #关闭单主模式
group_replication_enforce_update_everywhere_checks = ON #多主一致性检查
如果日志不一致(先停止集群 reset master 清空日志)

本文地址:https://blog.csdn.net/workey/article/details/108874080

相关标签: linux