MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,单主或者多主。

在前一种模式Single-Primary中,无论集群中有多少个节点,只有一个节点允许写入,其它节点都是只读的,这个允许写入的节点被称为主节点,只有当这个主节点出现问题从集群中被踢出,才会在剩余的节点中选举出另外一个节点成为新的主节点,并且将该节点置为可写模式。

而在后一种模式Multi-Primary中,所有的节点都是主节点,都可以同时被读写,看上去这似乎更好,但是因为多主的复杂性,在功能上如果设置了多主模式,则会有一些使用的限制,比如不支持Foreign Keys with Cascading Constraints。

在多主模式下,集群中的节点退出集群,也不再会出现重新选举的动作,因为本来所有的节点都是Primary节点。

下面设置一下Multi-Primary模式,当前的环境是Single-primary,只有qht131是可读写的,其它的是只读的。

mysql> select * from performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e89b | qht131      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e89c | qht134      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e90b | qht132      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e91b | qht133      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
4 rows in set (0.00 sec)

1.最简单的办法就是将当前的所有节点按照顺序都停掉,关闭组复制设置好参数后再重新打开数据库。

也可以将所有的slave节点都关闭掉,primary节点通过更改全局变量而不需要重启数据库。

由于我的测试环境,只接关闭所有的节点,先关闭salve节点最后关闭primary节点。

qht132,qht133,qht134先关闭组复制 

mysql> stop GROUP_REPLICATION;

qht131,最后关闭qht131组复制 

mysql> stop GROUP_REPLICATION;


2.所有节点修改配置文件,增加以下部分:


#
## Group Replication configuration multi-primary mode
##
 loose-group_replication_single_primary_mode=off
 loose-group_replication_enforce_update_everywhere_checks=ON

-group_replication_single_primary_mode=ON,表示启动了Single-Primary模式,那么修改为OFF就意味着要启动Multi-Primary模式。

-group_replication_enforce_update_everywhere_checks该参数设置为ON,则禁用了在多主模式下一些可能产生未知数据冲突的操作

整个组复制的参数如下:

#
# Group Replication configuration
#
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.17.61.131:33060"
loose-group_replication_group_seeds= "172.17.61.131:33060,172.17.61.132:33060,172.17.61.133:33060,172.17.61.134:33060"
loose-group_replication_bootstrap_group= off

#
## Group Replication configuration multi-primary mode
##
 loose-group_replication_single_primary_mode=off
 loose-group_replication_enforce_update_everywhere_checks=ON

3.用新参数重启所有节点:

[root@qht131 ~]# service mysql restart
Shutting down MySQL..                                      [  OK  ]
Starting MySQL....                                         [  OK  ]

4.开启其中一个节点,比如qht131:

以这个节点为基准,开启组复制 :

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.04 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.25 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

5.其它的节后加入组:

qht132,qht133,qht134:

mysql> START GROUP_REPLICATION;.
Query OK, 0 rows affected (3.13 sec)

所有的节后加进来后,检查组成员状态:
mysql> select * from performance_schema.replication_group_members ;

+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e89b | qht131      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e89c | qht134      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e90b | qht132      |        3306 | ONLINE       |
| group_replication_applier | bb0dea82-58ed-11e8-94e5-000c29e8e91b | qht133      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
4 rows in set (0.00 sec)

所有的节点read_only都应该是关闭的:

mysql> select @@read_only;
+-------------+
| @@read_only |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

6.多主复制的测试:

qht131:

mysql> select * from l5m.test_mgr;
+----+
| c1 |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+
6 rows in set (0.18 sec)

mysql> insert into l5m.test_mgr values(7);
Query OK, 1 row affected (0.31 sec)

qht132:

mysql> select * from l5m.test_mgr;
+----+
| c1 |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.03 sec)

mysql> insert into l5m.test_mgr values(8);
Query OK, 1 row affected (0.02 sec)

qht131:

mysql> select * from l5m.test_mgr;
+----+
| c1 |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
+----+
8 rows in set (0.00 sec)

两个节点同时写数据没有问题。


参考:http://www.dbform.com/html/2017/3659.html