MySQL Group Replication(组复制)

搭建

Posted by dbstack on March 23, 2018

前言

MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MySQL组复制提供了高可用、高扩展、高可靠的MySQL集群服务。

  • 高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
  • 高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
  • 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
  • 高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。 MGR是MySQL数据库未来发展的一个重要方向。
  • GitHub Logo

    必要修件 (设计上的规划)

  • 只支持InnoDB.
  • 每张表都要有用户定的主键.
  • 要开启全局事务辨识码(GTID).
  • 乐观执行事务: 事务有可能在提交时,因为和组内其他成员的事务冲突 而放弃.
  • 同一组内最多可有9个服务器.
  • 二进位日志活动(ROW)
  • applier服务器要开启二进位日志且用复制的applier (SQL)线程写入.

正文

一、数据库服务器规划

|      IP地址    | hostname | port |
| -------------  | ------   | ---- |  
| 192.168.56.100 | node1    | 3306 | 
| 192.168.56.101 | node2    | 3306 | 
| 192.168.56.102 | node3    | 3306 | 

二、安装请参照github scripts  的脚本安装

  • https://github.com/weiyanwei412/scripts/blob/master/mysql-install
  • MySQL配置文件
  • https://github.com/weiyanwei412/MySQL-MGR/blob/master/my.cnf
  • 注意每个节点的server_id、loose-group_replication_local_address、loose-group_replication_group_seeds都配置成自己的相印的参数

    三、创建复制环境账号与安装MGR插件

  • 1、 在三台MySQL节点上创建复制账号;
    mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.56.%' IDENTIFIED BY 'repl';
    Query OK, 0 rows affected (3.10 sec)
    
  • 2、安装MGR插件(三个节点分别执行)
    mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    Query OK, 0 rows affected (3.10 sec)
    
  • 主要配置文件
  • node1
    loose-group_replication_local_address= "192.168.56.100:23306"
    loose-group_replication_group_seeds= "192.168.56.100:23306,192.168.56.101:23306,192.168.56.102:23306"
    
  • node2
     loose-group_replication_local_address= "192.168.56.101:23306"
     loose-group_replication_group_seeds= "192.168.56.100:23306,192.168.56.101:23306,192.168.56.102:23306"
    
  • node3
    loose-group_replication_local_address= "192.168.56.102:23306"
    loose-group_replication_group_seeds= "192.168.56.100:23306,192.168.56.101:23306,192.168.56.102:23306"
    

    -

    四、启动MGR集群

  • 1、首先分别在node1 node2 node3上 change master to 集群
    mysql>CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
    Query OK, 0 rows affected (3.10 sec)
    
  • 2、在主库node1上 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。
    mysql>SET GLOBAL group_replication_bootstrap_group = ON; 
    Query OK, 0 rows affected (3.10 sec)
    
  • 启动组复制
    mysql>start group_replication;
    Query OK, 0 rows affected (3.10 sec)
    
  • 查询复制组成员
    > mysql> select * from performance_schema.replication_group_members; 
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | group_replication_applier | bc7cac5c-2da5-11e8-b16d-000c2995693d | node1       |        3306 | ONLINE       |
    1 rows in set (0.00 sec)
    
  • 在node2上执行
    mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> start group_replication;
    Query OK, 0 rows affected (3.10 sec)
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | group_replication_applier | bc7cac5c-2da5-11e8-b16d-000c2995693d | node1       |        3306 | ONLINE       |
    | group_replication_applier | c7476b17-2cf4-11e8-b1d7-000c29b0f839 | node2       |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    2 rows in set (0.00 sec)
    
  • 在node3上执行
    mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> start group_replication;
    Query OK, 0 rows affected (3.10 sec)
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    | group_replication_applier | bc7cac5c-2da5-11e8-b16d-000c2995693d | node1       |        3306 | ONLINE       |
    | group_replication_applier | bd05f5c9-2da5-11e8-b58f-000c29a4c7a1 | node3       |        3306 | ONLINE       |
    | group_replication_applier | c7476b17-2cf4-11e8-b1d7-000c29b0f839 | node2       |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+
    3 rows in set (0.00 sec)
    

    五 验证MGR的复制功能

    查看那个是主节点

    mysql> select variable_value from performance_schema.global_status where variable_name="group_replication_primary_member";
    +--------------------------------------+
    | variable_value                       |
    +--------------------------------------+
    | bc7cac5c-2da5-11e8-b16d-000c2995693d |
    +--------------------------------------+
    

    在master上插入测试数据 在master库mgr1上建立测试库test,测试表t1,录入一条数据

    mysql> create database test;  
    Query OK, 1 row affected (0.00 sec)  
    mysql>use test;
    Database changed
    mysql> create table test.t1(id int,cn varchar(32));  
    Query OK, 0 rows affected (0.02 sec)  
    mysql> insert into t1(id,cn)values(1,'a');  
    ERROR 3098 (HY000): The table does notcomply with the requirements by an external plugin.   
    -- # 这里原因是group_replaction环境下面,表必须有主键不然不允许往里insert值。所以修改表t1,将id字段设置程主键即可。  
    mysql> alter table t1 add primary key(id); 
    mysql> insert into t1(id,cn)values(1,'a');    
    

    去node2/node3上可以看到数据已经同步过去

    mysql> select * from mgr1.t1;  
    +----+------+  
    | id | cn  |  
    +----+------+  
    |  1| a    |  
    +----+------+  
    1 row in set (0.00 sec)  
    

然后在node2/node3上执行inert操作,则拒绝,因为node2、node33为readonly

mysql> insert into t1 select 2,'b';  
ERROR 1290 (HY000): The MySQL server isrunning with the --super-read-only option so it cannot execute this statement  
1 row in set (0.06 sec)

六 日常维护步骤:

1、如果从库某一节点关闭

mysql>stop group_replication;

2、如果所有的库都关闭后,第一个库作为主库首先执行

mysql>set global group_replication_bootstrap_group=ON;
mysql>start group_replication;

剩下的库直接执行即可!

mysql>start group_replication;

3、如果主库故障,会自动从两个从库选出一个主库,主库启动后再次执行如下命令后会变成从库

mysql>start group_replication;