概述
官网 https://dev.mysql.com/doc/refman/5.7/en/group-replication.html
MySQL异步复制
master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不care。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。
假设master发生宕机并且binlog还没来得及被slave接收,而切换程序将slave提升为新的master,就会出现数据不一致的情况!另外,在高并发的情况下,传统的主从复制,从节点可能会与主产生较大的延迟(当然mysql后续版本陆续做了优化,推出了并行复制,以此降低异步复制的延迟)
MySQL半同步复制
基于传统异步存在的缺陷,mysql在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:
MySQL组复制
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
一个复制组由若干个节点(数据库实例)组成,组内各个节点维护各自的数据副本(Share Nothing),通过一致性协议实现原子消息和全局有序消息,来实现组内实例数据的一致。
MGR组复制模式
组复制可以在两种模式下运行:
- 单主模式下,组复制具有自动选主功能,每次只有一个 Server成员接受更新,其它成员只提供读服务。
- 多主模式下,所有的Server 成员都可以同时接受更新,没有主从之分,成员角色是完全对等的。
MGR的解决方案现在具备的特性
- 数据一致性保障:确保集群中大部分节点收到日志
- 多节点写入支持:多写模式下支持集群中的所有节点都可以写入
- Fault Tolerance: 确保系统发生故障(包括脑裂)依然可用,双写对系统无影响
MGR当前的限制
- 仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
- 必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
- COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
- 目前一个MGR集群最多支持9个节点
- 不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
- 二进制日志不支持binlog event checksum
MGR的安装
OS: Centos7.5
MySQL: 5.7.24
注意:一下配置是单主模式
1、关闭防火墙、SELinux,配置hosts(所有节点)
systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config,修改后重启服务器
SELINUX=disabled
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.100 mgr1
192.168.56.101 mgr2
192.168.56.102 mgr3
2、安装mysql(所有节点)
rpm -e 删除mariadb-libs
rpm -ivh mysql-community-common-5.7.24-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.24-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.24-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.24-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.24-1.el7.x86_64.rpm
3、修改my.cnf配置文件(所有节点)
[root@mgr1 ~]# cat /etc/my.cnf | grep -vE "^#"
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server = utf8
collation-server = utf8_unicode_ci
lower_case_table_names = 1
explicit_defaults_for_timestamp = true
server_id=100
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="25aa5618-e940-11e8-a6f6-0800273cba9a"
loose-group_replication_start_on_boot=off #插件在server启动时不自动启动组复制
loose-group_replication_local_address= "192.168.56.100:24901"
loose-group_replication_group_seeds= "192.168.56.100:24901,192.168.56.101:24901,192.168.56.102:24901"
loose-group_replication_bootstrap_group=off
#loose-group_replication_single_primary_mode = off #关闭单主模式的参数
#loose-group_replication_enforce_update_everywhere_checks = on
注意:不同节点红色标注的参数需修改。该配置为最简单
重点参数详解
- 开启GTID功能gtid_mode = ON,enforce_gtid_consistency = ON
- MGR在当前MySQL版本中,必须要设置binlog_checksum=none,并且binlog_format=row
- MGR需要多源复制功能,所以需要将主从库之间的信息记录到表中。设置master_info_repository = TABLE和relay_log_info_repository = TABLE
- MGR中开启主键信息采集功能:transaction_write_set_extraction= XXHASH64
- MGR中需要设置组的名字,该group_replication_group_name是通过select uuid()来生成的。注意所有节点该值需一样
- MGR中本地成员的地址由该参数group_replication_local_address决定,节点之间此配置中的端口号进行通信。
- MGR中其他成员的地址由这个参数group_replication_group_seeds决定
- MGR采取多主模式时,需要让该参数:group_replication_single_primary_mode=off(默认为ON,为单主模式)。
- group_replication_bootstrap_group 是否是Group Replication的引导节点,初次搭建集群的时候需要有一个节点设置为ON来启动Group Replication group_replication_bootstrap_group 是否是Group Replication的引导节点,初次搭建集群的时候需要有一个节点设置为ON来启动Group Replication
- group_replication_start_on_boot 是否随mysql启动Group Replication
- loose-group_replication_single_primary_mode 指定复制模式,默认值为ON,即单主模式
这里再强调一个参数:group_replication_auto_increment_increment
该参数代表自增属性,默认值为7。我们要保证每个成员的该值相同,并且建议该参数的设置尽量比组内成员的个数大一些,方便后期集群的扩展。
4、启动mysql,并初始root密码
systemctl start mysqld
根据/var/log/mysqld.log日志中临时密码,修改root密码
grep password /var/log/mysqld.log
mysql -uroot -p
set password = password('Root@123456');
FLUSH PRIVILEGES;
5、初始引导节点(此以mgr1为第一个节点)
5.1 创建replication用户
此需要关闭binlog,使得创建用户不记录到binlog中
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'Repl@123456';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
5.2 change master
CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery';
5.3 安装MGR插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.11 sec)
mysql> show plugins ; ##检查插件
5.4 执行初始引导操作
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;
5.5 创建测试数据
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
6、添加其他节点到集群
6.1 创建replication用户
此需要关闭binlog,使得创建用户不记录到binlog中
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'Repl@123456';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
6.2 change master
CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery';
6.3 安装MGR插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.11 sec)
mysql> show plugins ; ##检查插件
6.4 添加节点到复制组
set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;
6.5 检查节点状态
SELECT * FROM performance_schema.replication_group_members;
6.6 新节点默认是只读
mysql> show variables like '%read_only%';
6.6 同理增加其他节点
6.7 重启各个节点
测试时发现,从节点直接重启,重新加入集群如需要设置强制加入集群参数,而如果重启主节点且当前节点变过主节点后则不需要加参数直接启动即可。
group_replication_allow_local_disjoint_gtids_join
故先逐个重启主节点,注意主节点重启可能需要change master
7、集群管理
7.1 查看当前主节点
SHOW STATUS LIKE 'group_replication_primary_member' ;
此时如果关闭主节点,则其他节点自动会转换为主节点。
7.2 启动和关闭复制组
START GROUP_REPLICATION;
STOP GROUP_REPLICATION;
7.3 设置自启动复制组
loose-group_replication_start_on_boot=on
该参数改为ON
7.4 查看当前组成员
SELECT * FROM performance_schema.replication_group_members;
7.5 设置白名单
如果未设置group_replication_ip_whitelist,则该值为AUTOMATIC,mysql会自动添加本机的私有IP地址到白名单中,且mysqld.log日志中出现如下信息
[Note] Plugin group_replication reported: '[GCS] Added automatically IP ranges 10.0.2.9/24,127.0.0.1/8,192.168.56.100/24 to the whitelist
3个节点都需要添加
STOP GROUP_REPLICATION;
SET GLOBAL group_replication_ip_whitelist="127.0.0.1/32,192.168.56.0/24";
START GROUP_REPLICATION;
8、MGR多主模式
注意:单主模式和多主模式只是配置文件的区别,其他一样
8.1 所有节点停止GROUP_REPLICATION,并修改参数
STOP GROUP_REPLICATION;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
修改/etc/my.cnf配置文件,防止重启失效,添加如下参数
loose-group_replication_single_primary_mode = off #关闭单主模式的参数
loose-group_replication_enforce_update_everywhere_checks = on
不支持串行的隔离级别。单个MySQL服务器中,通过锁的方式来实现串行化的隔离级别。而多主模式时,多个成员之间的并发操作无法通过锁来实现串行的隔离级别;
不支持外键的级联操作;
参数:group_replication_enforce_update_everywhere_checks=TRUE 是用来控制是否做以上限制的检测,如果开启了这个参数,当发现这些情况时就会报错;
8.2 检查验证
SELECT * FROM performance_schema.replication_group_members;
SHOW STATUS LIKE 'group_replication_primary_member' ;
show variables like '%read_only%';
8.3 所有节点宕机恢复
任选一个节点
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
其他节点
START GROUP_REPLICATION;
9、 其他
group_replication_recovery_retry_count:加入MGR尝试次数
group_replication_recovery_reconnect_interval : 连接间隔默认1分钟
测试案例查看
https://blog.csdn.net/Mlztesoft/article/details/79927425
遇到问题
1、loose-group_replication_group_name该为MGR的名称,所有节点需一样
2、添加节点需设置set global group_replication_allow_local_disjoint_gtids_join=ON;
3、需设置/etc/hosts文件
最后
以上就是愉快招牌为你收集整理的MySQL复制介绍及MGR安装与配置MGR的安装遇到问题的全部内容,希望文章能够帮你解决MySQL复制介绍及MGR安装与配置MGR的安装遇到问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复