MySQL复制介绍及MGR安装与配置

官网 https://dev.mysql.com/doc/refman/5.7/en/group-replication.html

MySQL异步复制

master事务的提交不需要经过slave的确认,slave是否接收到masterbinlogmaster并不careslave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。

https://images2017.cnblogs.com/blog/1075436/201712/1075436-20171215144800996-802541694.jpg

假设master发生宕机并且binlog还没来得及被slave接收,而切换程序将slave提升为新的master,就会出现数据不一致的情况!另外,在高并发的情况下,传统的主从复制,从节点可能会与主产生较大的延迟(当然mysql后续版本陆续做了优化,推出了并行复制,以此降低异步复制的延迟)

MySQL半同步复制

基于传统异步存在的缺陷,mysql5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:

https://images2017.cnblogs.com/blog/1075436/201712/1075436-20171215144932949-1766188444.jpg

MySQL组复制

基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。

由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。

引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。

https://images2017.cnblogs.com/blog/1075436/201712/1075436-20171215144947855-1672756986.jpg

一个复制组由若干个节点(数据库实例)组成,组内各个节点维护各自的数据副本(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

 

注意:不同节点红色标注的参数需修改。该配置为最简单

重点参数详解

  1. 开启GTID功能gtid_mode = ON,enforce_gtid_consistency = ON
  2. MGR在当前MySQL版本中,必须要设置binlog_checksum=none,并且binlog_format=row
  3. MGR需要多源复制功能,所以需要将主从库之间的信息记录到表中。设置master_info_repository = TABLE和relay_log_info_repository = TABLE
  4. MGR中开启主键信息采集功能:transaction_write_set_extraction= XXHASH64
  5. MGR中需要设置组的名字,该group_replication_group_name是通过select uuid()来生成的。注意所有节点该值需一样
  6. MGR中本地成员的地址由该参数group_replication_local_address决定,节点之间此配置中的端口号进行通信。
  7. MGR中其他成员的地址由这个参数group_replication_group_seeds决定
  8. MGR采取多主模式时,需要让该参数:group_replication_single_primary_mode=off(默认为ON,为单主模式)。
  9. group_replication_bootstrap_group 是否是Group Replication的引导节点,初次搭建集群的时候需要有一个节点设置为ON来启动Group Replication group_replication_bootstrap_group 是否是Group Replication的引导节点,初次搭建集群的时候需要有一个节点设置为ON来启动Group Replication
  10. group_replication_start_on_boot 是否随mysql启动Group Replication
  11. 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)