如何将MySQL GR 设置为多主模式

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

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

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

在5.7.17的官方文档中有详细地描述如何设置Single-Primary MGR的方法。

Deploying Group Replication in Single-Primary Mode(https://dev.mysql.com/doc/refman/5.7/en/group-replication-deploying-in-single-primary-mode.html)

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

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

但是不确认是什么原因,在官方文档中没有单独的章节来描述如何设置集群为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模式。

如果MGR已经启动,则无法动态修改该参数

首先停止复制

root@lh> stop GROUP_REPLICATION;

Query OK, 0 rows affected (8.67 sec) 

设置单主模式参数为off

root@lh > set global group_replication_single_primary_mode=off;

Query OK, 0 rows affected (0.00 sec)

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

(root@lh) > set global group_replication_enforce_update_everywhere_checks=ON;

Query OK, 0 rows affected (0.00 sec) 

设置为第一个准备启动MGR(bootstrap)的节点

root@lh> SET GLOBAL group_replication_bootstrap_group=ON;

Query OK, 0 rows affected (0.00 sec) 

启动复制 

root@lh> START GROUP_REPLICATION;

Query OK, 0 rows affected (1.29 sec) 

 为了防止后续由于意外再启动另外一个复制组,关闭bootstrap参数

root@lh]> SET GLOBAL group_replication_bootstrap_group=OFF;

Query OK, 0 rows affected (0.00 sec) 

此时可以从视图中看到整个集群只有一个节点是ONLINE

可以加入第二个节点了。

同样设置单主模式参数为off

root@lh> set global group_replication_single_primary_mode=off;

Query OK, 0 rows affected (0.00 sec) 

设置update检查参数为on

root@lh> set global group_replication_enforce_update_everywhere_checks=ON;

Query OK, 0 rows affected (0.00 sec) 

启动复制

root@lh> start group_replication;

Query OK, 0 rows affected (5.42 sec) 

此时检查视图,可以发现集群中已经存在两个节点

group_replication_primary_member值为空,表示启动的是Multi-Primary Mode,否则该参数显示的是单主模式中的Primary节点。

同样的方法可以加入第三个节点,在当前版本中MGR最多支持一个集群中拥有9个节点。

如果需要在MySQL重启之后这些参数仍然生效,那么需要将这些参数加入到my.cnf文件中,一个典型的配置了MGR的my.cnf如下所示

本文出自数据和云公众号,原文链接

时间: 2024-10-18 15:28:27

如何将MySQL GR 设置为多主模式的相关文章

Mysql设置自增长主键的初始值

alter table table_name auto_increment=n; 注意n只能大于已有的auto_increment的整数值,小于的值无效. show table status like 'table_name' 可以看到auto_increment这一列是表现有的值. 步进值没法改变.只能通过下面提到last_inset_id()函数变通使用 Mysql可以使用AUTO_INCREMENT来设定主键的值为自增长的,其默认值是1,如果想把它的初始值设置为1000,比较笨的办法是先插

Mysql设置自增长主键的起始值

Mysql可以使用AUTO_INCREMENT来设定主键的值为自增长的,其默认值是1,如果想把它的初始值设置为1000,比较笨的办法是先插入一条记录并指定主键的值为999,然后delete改行记录,例如:  代码如下 复制代码 insert into test(pk) values(999); delete from test where pk = 999; 更好的方法是使用alter的方法来直接修改,例如:  代码如下 复制代码 alter table test AUTO_INCREMENT

数据-Mysql中设置表的外键的时候报错

问题描述 Mysql中设置表的外键的时候报错 这个是原句子: ALTER TABLE emp ADD CONSTRAINT id_fk FOREIGN KEY (deptno) REFERENCES Dept (deptno); 就是想把emp表的deptno设置为外键,该列的数据引用Dept表的主键列deptno的数据.然后,报错信息如下: Cannot add or update a child row: a foreign key constraint fails (emp.#sql-1a

如何使用与维护,才能把MySQL GR发挥到极致?

作者介绍 贺春旸,普惠金融MySQL专家,<MySQL管理之道>第一版.第二版作者.曾任职于中国移动飞信.机锋安卓市场,拥有丰富的数据库管理经验.目前致力于MySQL.Linux等开源技术的研究.   MySQL异步复制及semi-sync半同步复制,它们都基于MySQL binlog,原生复制是完全异步的,master不需要保证slave接收并执行了binlog,能够保证master最大性能,但是slave可能存在延迟,主备数据无法保证一致性,在不停服务的前提下如果master宕机,提升sl

MySQL主从设置方法介绍

主MySQL设置 1.编辑主MYSQL 服务器的MySQL配置文件my.cnf,在[mysqld]下面添加以下参数: log-bin=mysql-bin //开启MYSQL二进制日志 server-id=1 //服务器ID不能重复 binlog-do-db=dzx2 //需要做主从备份的数据库名字 expire-logs-days = 7 //只保留7天的二进制日志,以防磁盘被日志占满 2.在 A 服务器添加一个用于主从复制的帐号: 登陆mysql命令行,执行 GRANT REPLICATION

MySQL中设置prompt实现信息提示的教程

然后来看看默认情况下的样子 在看看 使用prompt参数后的样子 然后看看黑科技的玩法 好了 现在来说说最后彩色显示的方法,默认在使用--prompt参数后是显示不出彩色的,为了显示彩色,我们需要借助系统上功能才可以的, [root@GCE-Node1_www.dwhd.org ~]# awk '/mariadb/' .bashrc alias mysql=$(echo -e '/usr/local/mariadb-galera/bin/mysql -uroot -p****** -h127.0

mysql的关联,是非主键之间的关联,我是小白

问题描述 mysql的关联,是非主键之间的关联,我是小白 这种关联是用什么语句呢?谢谢 解决方案 create table XXX(id int 字段 varcharconstraint id_fk foreign key (id) references teacher(tea_no)) alter table XXX modify 字段 not null;mysql有图画界面么,直接用 解决方案二: 首先呢数据库教程中说明了必须有主键,主键唯一性,关联使用主键啦什么的. 但是实际的数据库有可能

navicat for mysql在设置字段值时空和null有什么区别

问题描述 navicat for mysql在设置字段值时空和null有什么区别 解决方案 ""也是一个值.举例子来说,你的界面提供用户输入文本,用户保留文本框为空,那么就是"",这说明用户提交了数据,数据的值是"",但是用户从来没有提交过数据,那么就是null,如果你需要区分这两者,那么要特别注意. 解决方案二: null不等于空啊 空 是有类型的 null没有类型

mysql字段设置某种情况下的特殊值

问题描述 mysql字段设置某种情况下的特殊值 是这样的,上传视频转码成功后url设置到videochangeurl字段,但是有不成功的情况,现在前辈想设置成false,这个字段是varchar类型的,而且前端页面判断是否转码失败jstl的话eq 'false',看着也奇怪,我心里觉得设置false不适合,但是又不好反抗前辈,就算反抗人家也根本不理会你,本着对自己负责,学习的态度,问问大家,这种情况怎么处理好. ps:看了前两个回答,补充下,如果不上传视频的话,没视频的话为为空的,要区别开没不上