MySQL 5.7.17 Group Replication 初始

时间:2022-06-19 18:27:53

1,关于 Group Replication

基于组的复制(Group-based Replication)是一种被使用在容错系统中的技术。Replication-group(复制组)是由能够相互通信的多个服务器(节点)组成的。

在通信层,Group replication实现了一系列的机制:比如原子消息(atomic message delivery)和全序化消息(totalordering of messages)。

这些原子化,抽象化的机制,为实现更先进的数据库复制方案提供了强有力的支持。

 

MySQL Group Replication正是基于这些技术和概念,实现了一种多主全更新的复制协议。

简而言之,一个Replication-group就是一组节点,每个节点都可以独立执行事务,而读写事务则会在于group内的其他节点进行协调之后再commit。

因此,当一个事务准备提交时,会自动在group内进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务。

这种原子广播的方式,使得这个事务在每一个节点上都保持着同样顺序。

这意味着每一个节点都以同样的顺序,接收到了同样的事务日志,所以每一个节点以同样的顺序重演了这些事务日志,最终整个group保持了完全一致的状态。

 

然而,不同的节点上执行的事务之间有可能存在资源争用。这种现象容易出现在两个不同的并发事务上。

假设在不同的节点上有两个并发事务,更新了同一行数据,那么就会发生资源争用。

面对这种情况,Group Replication判定先提交的事务为有效事务,会在整个group里面重演,后提交的事务会直接中断,或者回滚,最后丢弃掉。

 

因此,这也是一个无共享的复制方案,每一个节点都保存了完整的数据副本。看如下图片01.png,描述了具体的工作流程,能够简洁的和其他方案进行对比。这个复制方案,在某种程度上,和数据库状态机(DBSM)的Replication方法比较类似。

 MySQL 5.7.17 Group Replication 初始



2,安装mysql5.7.17

官方下载地址:http://dev.mysql.com/downloads/mysql/,不过官方只保留最新的version,5.7.17这个url地址不一定长期有效,所以,需要的不一定有,我这里在百度云盘保留了下来,版本是5.7.17,可以随时去下载使用,分享地址:链接:http://pan.baidu.com/s/1jIhqSXw 密码:ifx5

 

安装过程参考我的blog地址:http://blog.csdn.net/mchdba/article/details/53889781,大概变化的地方就是my.cnf里面的server-id需要修改。

 

在三台db服务器上面设置/etc/hosts映射,如下:

192.168.136.130    db1                                                                                        

192.168.136.133    db2

192.168.136.134    db3

 

 

安装的数据库服务器:

数据库服务器地址

端口

数据目录

Server-id

192.168.136.130(db1)

3317

/data/mysql/data

120136130

192.168.136.133(db2)

3317

/data/mysql/data

120136133

192.168.136.134(db3)

3317

/data/mysql/data

120136134

 

 

 


3,搭建gtid复制:

在3台my.cnf上面配置gtid:

[mysqld]

gtid_mode=ON

log-slave-updates=ON

enforce-gtid-consistency=ON

 

 

在3台mysql实例上db1、db2、db3分配账号:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'rlpbright_1927@ys';

Query OK, 0 rows affected, 1 warning (0.00 sec)

 

mysql>

 

 

在db2、db3上搭建gtid服务:

mysql> change master to master_user='repl', master_password='rlpbright_1927@ys', master_host='db1',master_port=3317, master_auto_position=1;

Query OK, 0 rows affected, 2 warnings (0.02 sec)

 

mysql> start slave;

Query OK, 0 rows affected (0.04 sec)

 

mysql>

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: db1

                  Master_User: repl

                  Master_Port: 3317

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 445

               Relay_Log_File: mysql-relay-bin.000002

                Relay_Log_Pos: 414

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

………………………………..

 

 

 


4,开启Group Replication

有了gtid之后,开启group replication就方便多了。首先需要安装group replication插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

Query OK, 0 rows affected (0.03 sec)

 

 

mysql> show plugins;

+----------------------------+----------+--------------------+----------------------+---------+

| Name                       | Status   | Type               | Library              | License |

+----------------------------+----------+--------------------+----------------------+---------+

| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

…………

| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |

+----------------------------+----------+--------------------+----------------------+---------+

45 rows in set (0.00 sec)

 

配置参数,db1(master)上:

mysql> set @@global.transaction_write_set_extraction = XXHASH64

mysql> set @@global.group_replication_start_on_boot = OFF

mysql> set @@global.group_replication_bootstrap_group = OFF

mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

mysql> set @@global.group_replication_local_address = 'db1:6606'

mysql> set @@global.group_replication_group_seeds = 'db2:6607,db3:6608'

 

配置参数,db2(slave1)上:

mysql> set @@global.transaction_write_set_extraction = XXHASH64

mysql> set @@global.group_replication_start_on_boot = OFF

mysql> set @@global.group_replication_bootstrap_group = OFF

mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

mysql> set @@global.group_replication_local_address = 'db2:6607'

mysql> set @@global.group_replication_group_seeds = 'db111:6606,127.0.0.1:db3'

 

配置参数,db3(slave2)上:

mysql> set @@global.transaction_write_set_extraction = XXHASH64

mysql> set @@global.group_replication_start_on_boot = OFF

mysql> set @@global.group_replication_bootstrap_group = OFF

mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6

mysql> set @@global.group_replication_local_address = 'db3:6608'

mysql> set @@global.group_replication_group_seeds = 'db1:6607,db2:6606'

 

BTY:如果之前没有配置transaction_write_set_extraction=XXHASH64,这里修改之后之前创建的数据库是没有办法执行插入操作的。所有如果想在线完成Group Replication的改造需要保证之前已经设置了transaction_write_set_extraction=XXHASH64。

 

开始构建集群,在db1(master)上执行:

# 构建集群
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='rlpbright_1927@ys'FORCHANNEL'group_replication_recovery';
#开启group_replication

SETGLOBAL group_replication_bootstrap_group=ON;

START GROUP_REPLICATION;

SETGLOBAL group_replication_bootstrap_group=OFF;

 

 

db2、db3上加入

stop slave;

START GROUP_REPLICATION;

 

 

在db1上查看集群信息:

mysql> SELECT * FROM performance_schema.replication_group_members;