MGR搭建部署
[TOC]
一、准备工作
MGR(MySQL Group Replication)是MySQL 5.7.17 版本引进来的一个数据库高可用架构,解决了传统异步复制和半同步复制的缺陷(主从数据一致性的问题),MGR依靠分布式一致性协议PAXOS,实现了主从数据库的一致性。
搭建MGR的前提条件
- 存储引擎必须是Innodb,并且每张表一定要有主键,用于解决write冲突
- 必须打开GTID特性,binlog日志格式必须设置为ROW
- 目前一个MGR集群组最多支持9个节点
- 多主模式不支持SERIALIZABLE事物隔离级别
机器分配
主机名 | 主机ip | OS版本 | MySQL版本 | 端口 | server-id | 权重 |
---|---|---|---|---|---|---|
mgr1 | 192.168.66.150 | Centos 7.6 x64 | mysql 8.0.20 | 3406 | 661503406 | 50 |
mgr2 | 192.168.66.151 | Centos 7.6 x64 | mysql 8.0.20 | 3406 | 661513406 | 40 |
mgr3 | 192.168.66.152 | Centos 7.6 x64 | mysql 8.0.20 | 3406 | 661523406 | 30 |
新主选举时,权重越大,优先级越高;若权重相等则服务器server_uuid排序在最前的被选为主节点。
修改机器名
以 mgr1 为例:
HOST_NAME=mgr1
sed -i "/HOSTNAME/c HOSTNAME=$HOST_NAME" /etc/sysconfig/network
echo ${HOST_NAME} > /etc/hostname
hostname ${HOST_NAME}
hostname
创建hostname和ip的映射
在三台数据库服务器上都设置:
echo "192.168.66.150 mgr1" >> /etc/hosts
echo "192.168.66.151 mgr2" >> /etc/hosts
echo "192.168.66.152 mgr3" >> /etc/hosts
二、安装mysql
基础包
yum install -y lrzsz wget telnet net-tools ntpdate
开始安装
cd /opt
wget -c --limit-rate=1m http://iso.sqlfans.cn/mysql/percona-server-8.0.32-24.tar.gz
wget -c --limit-rate=1m http://iso.sqlfans.cn/mysql/config/8.0/my_innodb.cnf
wget -c --limit-rate=1m http://iso.sqlfans.cn/mysql/install_percona_8032.sh
bash install_percona_8032.sh /opt /data 3406
查询目前拥有的用户
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select host,user,plugin,account_locked from mysql.user;"
三、MGR搭建-单主模式
通用配置
禁用非InnoDB的存储引擎
在MGR中,必须使用InnoDB存储引擎,使用其他存储引擎可能会导致MGR发生错误。设置系统变量disabled_storage_engines以防止其他存储引擎被使用。
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
关于my.cnf的基本配置
基本配置
# Basic Configure
server_id=xxx
gtid_mode=ON //启用GTID
enforce_gtid_consistency=ON //强制GTID的一致性
master_info_repository=TABLE //将master.info元数据保存在系统表中
relay_log_info_repository=TABLE //将relay.info元数据保存在系统表中
log_bin=binlog //开启二进制日志记录
binlog_format=ROW //以行的格式记录
log_slave_updates=ON //级联复制
binlog_checksum=NONE //禁用二进制日志事件校验
确认
cat /data/mysql_3406/my_3406.cnf | egrep "(server|gtid|repository|binlog|updates)"
关于my.cnf的额外配置
########################## MGR ##########################
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.66.xxx:3406"
loose-group_replication_group_seeds= "192.168.66.150:3406,192.168.66.151:3406,192.168.66.152:3406"
loose-group_replication_bootstrap_group=off
loose-group_replication_member_weight=50
loose-group_replication_single_primary_mode=TRUE # 是否启动单主模式
loose-group_replication_enforce_update_everywhere_checks=FALSE # 是否启动多主模式
- loose-group_replication_group_name //mgr的组名,必须是一个有效的uuid,所有节点相同,可修改,只要格式对
- loose-group_replication_local_address //本地IP地址字符串,只能用于组内节点之间的连接,不能开放给上层应用
- loose-group_replication_group_seeds //组中成员访问表
- loose-group_replication_member_weight //新主选举时,权重越大,优先级越高
- loose-group_replication_single_primary_mode //TRUE(默认)表示的单主模式,FALSE表示多主模式
第一个节点配置
1.修改my.cnf配置并重启mysqld
server_id=661503406
loose-group_replication_local_address= "192.168.66.150:3406"
loose-group_replication_member_weight=50
重启mysqld服务
mysqladmin -uroot -p -S /tmp/mysql_3406.sock shutdown
/opt/mysql/bin/mysqld_safe --defaults-file=/data/mysql_3406/my_3406.cnf &
2.设置复制账号权限
#SET SQL_LOG_BIN=0;
CREATE USER dba_repl@'%' IDENTIFIED BY 'MA6RuouuZZn4x_Hd';
GRANT REPLICATION SLAVE ON *.* TO 'dba_repl'@'%';
FLUSH PRIVILEGES;
#SET SQL_LOG_BIN=1;
3.指定恢复渠道channel
CHANGE MASTER TO MASTER_PORT=3406, MASTER_USER='dba_repl', MASTER_PASSWORD='MA6RuouuZZn4x_Hd' FOR CHANNEL 'group_replication_recovery';
4.安装组复制插件并确认
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;
SELECT PLUGIN_NAME,PLUGIN_STATUS,PLUGIN_TYPE,PLUGIN_LIBRARY,PLUGIN_LICENSE FROM information_schema.plugins WHERE PLUGIN_NAME='group_replication';
5.开启组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
- 设置 group_replication_bootstrap_group=ON 是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置
- 设置 global group_replication_bootstrap_group=off 关闭组复制引导
6.查看mgr集群的服务器信息
SELECT * FROM performance_schema.replication_group_members;
第2个节点配置
1.修改my.cnf配置并重启mysqld
server_id=661513406
loose-group_replication_local_address= "192.168.66.151:3406"
loose-group_replication_member_weight=40
重启mysqld服务
mysqladmin -uroot -p -S /tmp/mysql_3406.sock shutdown
/opt/mysql/bin/mysqld_safe --defaults-file=/data/mysql_3406/my_3406.cnf &
2.设置复制账号权限
#SET SQL_LOG_BIN=0;
CREATE USER dba_repl@'%' IDENTIFIED BY 'MA6RuouuZZn4x_Hd';
GRANT REPLICATION SLAVE ON *.* TO 'dba_repl'@'%';
FLUSH PRIVILEGES;
#SET SQL_LOG_BIN=1;
3.指定恢复渠道channel
CHANGE MASTER TO MASTER_USER='dba_repl', MASTER_PASSWORD='MA6RuouuZZn4x_Hd', FOR CHANNEL 'group_replication_recovery';
4.安装组复制插件并确认
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;
5.加入组复制
这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将第二个节点添加进去即可
SET GLOBAL group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;
6.查看mgr集群的服务器信息
SELECT * FROM performance_schema.replication_group_members;
第3个节点配置
节点3的配置与节点2的配置几乎一样,只需修改 my.cnf 中 server-id 和 loose-group_replication_local_address 即可。
四、测试
1.在节点1上创建数据
create database db1;
create table db1.table1(id int key,name varchar(20));
insert into db1.table1 values(1,'zhangsan');
2.节点2上查看
select * from db1.table1;
3.节点3上查看
select * from db1.table1;
五、切换演练
如何区分主从节点
- 查看read_only参数,若为OFF则是主库,若为ON则是从库;
- 单主模式下,只有一个节点可以读写,其他节点提供只读服务;
show variables where variable_name in ('read_only');
模拟宕机切换
- 在主节点mgr1上重启 GROUP_REPLICATION,则组复制会根据权重重新选择新的主master
- 当节点 mgr1 重新加入后,将作为从服务器slave
STOP GROUP_REPLICATION;
START GROUP_REPLICATION;
show variables where variable_name in ('read_only');
相关状态查看
#设置白名单
SET GLOBAL group_replication_ip_whitelist="192.168.0.0/16,127.0.0.1";
#查看当前服务器的组复制集群参数设置列表
show variables like 'group_replication%';
#1、当前组成员列表
select * from performance_schema.replication_group_members;
#2、当前节点详细日志应用信息
select * from performance_schema.replication_group_member_stats;
#3、当前复制渠道连接信息
select * from performance_schema.replication_connection_status;
#4、当前复制渠道应用信息
select * from performance_schema.replication_applier_status;
#5、当前主master
select a.variable_value,b.member_host,b.member_port,member_state from performance_schema.global_status a ,performance_schema.replication_group_members b where a.variable_value=b.member_id and variable_name= 'group_replication_primary_member';
六、多主模式
在创建时就启用多主模式
在创建时就启用多主模式只需在修改配置文件/etc/my.cnf时多加两行参数。其余保持不变
loose-group_replication_single_primary_mode=off //关闭单master模式
loose-group_replication_enforce_update_everywhere_checks=ON //多主一致性检查
由单主模式改为多主模式
由单主改为多主时,一样需要所有服务器配置信息增加两行参数,为了下次开启就是多主模式
loose-group_replication_single_primary_mode=off //关闭单master模式
loose-group_replication_enforce_update_everywhere_checks=ON //开启多主一致性检查
然后全部服务器停止组复制(GROUP_REPLICATION)集群,并设置参数
stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off; //关闭单主模式
set global group_replication_enforce_update_everywhere_checks=ON; //开启多主一致性检查
选择其中一台引导组复制(GROUP_REPLICATION)集群
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
剩下的开启组复制(GROUP_REPLICATION)即可
start group_replication;
最后查看非引导组复制的服务器
select * from performance_schema.replication_group_members;
七、主节点选举策略
单主模式
单主模式下,只有一个节点可以读写,其他节点提供只读服务。
单主模式下,当主节点宕掉,其他节点自动会根据服务器的server_uuid 变量和group_replication_member_weight变量值,选择下一个slave作为主节点。
- group_replication_member_weight值最高的成员被选为新的主节点,该参数默认为50,可以在节点上设置不同值;
- 在group_replication_member_weight值相同的情况下,group根据数据字典中server_uuid排序,server_uuid排序在最前的被选择为主节点。
多主模式
多主模式下,在组复制中通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案,同时增加了certify的概念,负责检查事务是否允许提交,是否与其它事务存在冲突,Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,但是read-write(RW)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证可以立即执行,当一个事务在一个节点上提交之前,会在组内自动进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务,然后为该事物建立一个全局的排序,最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致。
- 在多主模式下,该组的所有成员都设置为读写模式。
- 在多主模式下,不支持SERIALIZABLE事务隔离级别,且不能完全支持级联外键约束。
附录
- 参考:MGR的搭建部署
- 参考:MGR集群搭建
- 参考:MySQL MGR搭建