前言
MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MySQL组复制提供了高可用、高扩展、高可靠的MySQL集群服务。
- 高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
- 高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
- 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
- 高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。 MGR是MySQL数据库未来发展的一个重要方向。
必要修件 (设计上的规划)
- 只支持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;