MGR搭建部署


一、准备工作

MGR(MySQL Group Replication)是MySQL 5.7.17 版本引进来的一个数据库高可用架构,解决了传统异步复制和半同步复制的缺陷(主从数据一致性的问题),MGR依靠分布式一致性协议PAXOS,实现了主从数据库的一致性。

搭建MGR的前提条件

  • 存储引擎必须是Innodb,并且每张表一定要有主键,用于解决write冲突
  • 必须打开GTID特性,binlog日志格式必须设置为ROW
  • 目前一个MGR集群组最多支持9个节点
  • 多主模式不支持SERIALIZABLE事物隔离级别

机器分配

主机名主机ipOS版本MySQL版本端口server-id权重
mgr1192.168.66.150Centos 7.6 x64mysql 8.0.20340666150340650
mgr2192.168.66.151Centos 7.6 x64mysql 8.0.20340666151340640
mgr3192.168.66.152Centos 7.6 x64mysql 8.0.20340666152340630
新主选举时,权重越大,优先级越高;若权重相等则服务器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
group_replication_group_name='ce9be252-2b71-11e6-b8f4-00212844f856'
group_replication_start_on_boot=off
group_replication_local_address='192.168.2.13:33061'
group_replication_group_seeds='192.168.2.11:33061,192.168.2.12:33061,192.168.2.13:33061'
group_replication_bootstrap_group=off
group_replication_member_weight=30
group_replication_single_primary_mode=TRUE  # 是否启动单主模式
group_replication_enforce_update_everywhere_checks=FALSE  # 是否启动多主模式
group_replication_recovery_get_public_key=ON #设置自动获取公钥
  • 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.设置复制账号权限

root登录

mysql -uroot -pQ8yWuLJ1q_Sth9fA -P3306 --socket=/tmp/mysql_3306.sock
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;
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 即可。

如果从节点事务和主节点不一样

停止从节点
STOP GROUP_REPLICATION;
清除从节点的旧数据及GTID信息
RESET MASTER; – 清除所有二进制日志和GTID信息
RESET SLAVE ALL; – 清除所有复制通道信息
主节点备份
mysqldump --all-databases --single-transaction --routines --events -u root -pQ8yWuLJ1q_Sth9fA -S /tmp/mysql_3306.sock > full_backup.sql
从节点恢复
mysql -u root -pQ8yWuLJ1q_Sth9fA -S /tmp/mysql_3306.sock < full_backup.sql
配置从节点的GTID_PURGED以匹配主节点
在主节点查询当前GTID_EXECUTED:
SELECT @@GLOBAL.GTID_EXECUTED;
在从节点设置相同的GTID:
RESET MASTER;
SET @@GLOBAL.GTID_PURGED = '主节点的GTID_EXECUTED值';

四、测试

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事务隔离级别,且不能完全支持级联外键约束。

附录

comments powered by Disqus