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

附录

Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2024-09-07 22:48:36

results matching ""

    No results matching ""