How to Set MySQL Group Replication into Multi-Primary Mode

在MySQL 5.7.17版本中发布的MySQL Group Replication(后文简称为MGR)被很多人称为MySQL复制方案的正规军,可以一举取代现在的MySQL Replication,Semisynchronous replication,甚至是可以取代之前最成功的MySQL集群方案Galera。

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

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

这个过程可以通过log清晰地看到。

2017-03-16T02:04:32.689278Z 0 [Note] Plugin group_replication reported: 'getstart group_id 4317e324'
2017-03-16T02:04:33.081743Z 0 [Note] Plugin group_replication reported: 'Unsetting super_read_only.'
2017-03-16T02:04:33.081756Z 28 [Note] Plugin group_replication reported: 'A new primary was elected, enabled conflict detection until the new primary applies all relay logs'

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

前面这些并不是本文的重点,实际上在5.7.17的官方文档中有详细地描述如何设置Single-Primary MGR的方法。
Deploying Group Replication in Single-Primary Mode

但是不确认是什么原因,却没有单独的章节来描述如何设置集群为Multi-Primary模式。只是在最后语焉不详地提及了一句:Multi-primary mode groups (members all configured with group_replication_single_primary_mode=OFF) 让读者可以知道跟group_replication_single_primary_mode参数有关。虽然确实也就是跟这个参数有关,但是文档写的这样半半拉拉也确实值得吐槽。

以下为设置Multi-Primary MGR的方法。假设集群之前已经处于Single-Primary模式。

--group_replication_single_primary_mode=ON,表示启动了Single-Primary模式,那么修改为OFF就意味着要启动Multi-Primary模式。
(root@localhost) [(none)]> show variables like 'group_replication_single_primary_mode';
+----------------------------------------------------+-------------------------------------------------+
| Variable_name                                      | Value                                          |
+----------------------------------------------------+-------------------------------------------------+
| group_replication_single_primary_mode              | ON                                              |
+----------------------------------------------------+-------------------------------------------------+
--如果MGR已经启动,则无法动态修改该参数
(root@localhost) [(none)]> set global group_replication_single_primary_mode=off;
ERROR 3093 (HY000): Cannot change into or from single primary mode while Group Replication is running.
--停止复制
(root@localhost) [(none)]> stop GROUP_REPLICATION;
Query OK, 0 rows affected (8.67 sec)
--设置单主模式参数为off
(root@localhost) [(none)]> set global group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
--该参数设置为ON,则禁用了在多主模式下一些可能产生未知数据冲突的操作
(root@localhost) [(none)]> set global group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
--设置为第一个准备启动MGR(bootstrap)的节点
(root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
--启动复制
(root@localhost) [(none)]> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.29 sec)
--为了防止后续由于意外再启动另外一个复制组,关闭bootstrap参数
(root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
--此时可以从视图中看到整个集群只有一个节点是ONLINE
(root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 72ad2062-08a3-11e7-a513-5bfce171938d | bogon      |      24801 | ONLINE      |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec) 

可以加入第二个节点了。

--同样设置单主模式参数为off
(root@localhost) [(none)]> set global group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
--设置update检查参数为on
(root@localhost) [(none)]> set global group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
--启动复制
(root@localhost) [(none)]> start group_replication;
Query OK, 0 rows affected (5.42 sec)
--此时检查视图,可以发现集群中已经存在两个节点
(root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 9003e830-08a3-11e7-8ae3-e62d2f6366d2 | bogon      |      24802 | ONLINE      |
| group_replication_applier | 96fe2b5a-08a3-11e7-b383-d7f02f17e847 | localhost  |      24803 | ONLINE      |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
--group_replication_primary_member值为空,表示启动的是Multi-Primary Mode,否则该参数显示的是单主模式中的Primary节点
(root@localhost) [(none)]> SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME='group_replication_primary_member';
+----------------------------------+----------------+
| VARIABLE_NAME                    | VARIABLE_VALUE |
+----------------------------------+----------------+
| group_replication_primary_member |                |
+----------------------------------+----------------+
1 row in set (0.00 sec)

同样的方法可以加入第三个节点,在当前版本中MGR最多支持一个集群中拥有9个节点。
如果需要在MySQL重启之后这些参数仍然生效,那么需要将这些参数加入到my.cnf文件中,一个典型的配置了MGR的my.cnf如下所示。

[mysqld]
# server configuration
datadir=/Users/Kamus/mysql_data/s2
basedir=/usr/local/Cellar/mysql/5.7.17
port=24802
socket=/tmp/s2.sock
#
# Replication configuration parameters
#
server_id=2
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
#
# 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= "127.0.0.1:24902"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容