MySQL MGR集群搭建
本文来自网易云社区,转载务必请注明出处。
本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点。简单介绍如何查询MGR集群状态信息。并介绍如何进行MGR节点上下线操作。先贴一份MySQL配置文件,如下:
explicit_defaults_for_timestamp=ON
# server configuration
datadir=/home/innosql/innosql/data/
basedir=/home/innosql/mysql/
port=3306
socket=/home/innosql/innosql/mysql.sock
#如果节点得hostname无法通过DNS正常解析,需要配置report_host
#report_host=10.200.128.67
max_allowed_packet=16M
max_connections=65536
log_error
#MGR要求和约束 详见https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html
server_id=1
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
#super_read_only=ON
slave_parallel_type=logical_clock
slave_parallel_workers=16
slave_preserve_commit_order=ON
transaction_write_set_extraction=XXHASH64
#MGR参数配置 详见 https://dev.mysql.com/doc/refman/5.7/en/group-replication-options.html
loose-group_replication_enforce_update_everywhere_checks = ON
loose-group_replication_single_primary_mode = OFF
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "mgr-node1.163.org:10086"
loose-group_replication_group_seeds= "mgr-node1.163.org:10086,mgr-node2.163.org:10086,mgr-node3.163.org:10086"
loose-group_replication_bootstrap_group= off
为了表示方便,我们将三个节点命名为mgr-node1、mgr-node2和mgr-node3。在mgr-node1上初始化MySQL,并启动MySQL:
./mysql/bin/mysqld --defaults-file=/home/innosql/innosql/my-mgr.cnf --initialize-insecure
./mysql/bin/mysqld --defaults-file=/home/innosql/innosql/my-mgr.cnf &
登陆到mgr-node1客户端,(可用通过mysql的prompt参数来设置客户端显示的提示信息),安装group_replication插件:
mgr-node1>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.01 sec)
我们已经在配置文件中包含了所有MGR所需的命令参数。比如组名称group_replication_group_name,该参数必须为一个合法的UUID字符串。设置了本节点的MGR模块通信地址group_replication_local_address,MGR集群的成员种子group_replication_group_seeds,该参数用于在异步故障恢复时选择合适的数据贡献者(donor)。在配置文件中,我们启用了多主模式,即设置group_replication_single_primary_mode为off。对于同一个复制组的成员,必须确保他们各自的MGR相关配置不冲突,如group_replication_single_primary_mode、group_replication_enforce_update_everywhere_checks等。需要注意的是请在配置文件中将group_replication_bootstrap_group设置为off,该参数表示是否执行MGR复制组的初始化操作,通俗得说,如果该参数为on,那么会新建一个MGR复制组。由于在我们的例子中,server1是第一个初始化节点,所以,我们动态开启该参数,然后再启动MGR:
mgr-node1>set global group_replication_bootstrap_group=on;
Query OK, 0 rows affected (0.00 sec)
mgr-node1>start group_replication;
Query OK, 0 rows affected (2.05 sec)
mgr-node1>set global group_replication_bootstrap_group=off;
Query OK, 0 rows affected (0.00 sec)
如上图所示,在启动MGR后,我们关闭了group_replication_bootstrap_group,确保下一次该节点启动的时候不会再次进行初始化。导致复制组出现分裂。我们可以查询当前MGR成员状态:
mgr-node1>select * from replication_group_members;
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| group_replication_applier | 2c4518a5-d4b4-11e7-a736-246e964083f0 | mgr-node1.163.org | 3306 | ONLINE |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
1 row in set (0.00 sec)
由于mgr-node1是第一个成员,所以members列表中仅有一个成员,可以看到起状态是ONLINE,说明正常运行中。接下来创建一个账号,权限为REPLICATION SLAVE ,该账号为用于故障恢复的异步复制通道group_replication_recovery所用。MGR组复制所需的group_replication_applier通道不需要我们设置账号和密码。依次在server1客户端执行如下SQL:
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
FLUSH PRIVILEGES;
基于该账号设置group_replication_recovery复制通道,如下:
mgr-node1>CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
上述就完成了第一个MGR节点初始化,接下来2个节点加入MGR执行的操作类似。但有个点需要指出:将第二个节点mgr-node2加入复制组前,除了确保group_replication_bootstrap_group处于关闭状态之外,还需先执行CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery'再执行start group_replication。在mgr-node1加入组后,我们创建了复制用户rpl_user,并执行了CHANGE MASTER TO,但其实并没有发挥作用。而在mgr-node2,CHANGE MASTER TO才真正发挥作用,在start group_replication中,mgr-node2会根据配置文件中指定seeds参数找到mgr-node1,并使用rpl_user这个账号连接到mgr-node1,拉取该节点的Binlog信息。所以mgr-node1上创建的用户,是给其他节点加组或故障恢复用的,并不是给本节点用。
与官方手册或网上的一些MGR搭建步骤不一样,我们的步骤中并没有在mgr-node2和mgr-node3上创建rpl_user用户,因为该用户可以通过Binlog从mgr-node1上复制到这两个节点。这应该是更加简洁的MGR搭建方式,不知为何官方分别在三个节点上创建rpl_user,为了避免复制冲突,又在创建前设置了session的sql_log_bin参数为off。新节点加入复制组的时候,其状态为RECOVERING,如下:
mgr-node1>use performance_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mgr-node1>select * from replication_group_members;
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
| group_replication_applier | 2c4518a5-d4b4-11e7-a736-246e964083f0 |mgr-node1.163.org | 3306 | ONLINE |
| group_replication_applier | 567f80c2-d65c-11e7-87a8-246e963b4310 |mgr-node2.163.org | 3306 | RECOVERING |
| group_replication_applier | fb08ecba-d65c-11e7-a74f-246e963b3e60 | mgr-node3.163.org | 3336 | RECOVERING |
+---------------------------+--------------------------------------+---------------------+-------------+--------------+
我们把加入组到状态变为ONLINE分为三个阶段,分别为本地恢复、全局恢复和缓存事务执行。本地恢复阶段会检查节点本地Relay Log中是否有可执行的Event,若有,则先执行完这部分Binlog。接下来进入到拉取本节点加入组之前复制组产生的而本节点没有的Binlog信息并回放。最后是缓存事务执行阶段,会将加入组之后产生的Binlog信息进行回放,这部分信息已事先缓存在本节点上。这三个节点回放Binlog/Relay Log所使用的复制通道分别是group_replication_applier、group_replication_recovery和group_replication_applier。
上面还有个问题,那就是如何区分第二和第三个阶段。这就需要提到View_change_log_event,该类型的Binlog Event为MGR所用,用于记录复制组中成员变化情况,每次成员加入或退出均会被记录为一个新的Binlog Event,也就在Binlog中表达了一个组视图(Group View)。回到本例,mgr-node2和mgr-node3加入组时,都会产生一个View_change_log_event,只需要在第二阶段获取Binlog时判断是否读到了当前视图的View_change_log_event即可。
在复制组生命周期内,成员的加入或删除都可以参考上述流程顺利完成。但有一种特殊情况需要考虑。那就是如果万一组中所有成员都下线了,第一个上线的节点就无法按照上述的恢复流程顺利上线,因为第二阶段不能顺利完成,无法找到合适的种子拉取以前的Binlog信息。所以,此时需要特殊处理,即第一个节点起来执行start group_replication前需要设置group_replication_bootstrap_group为on。
MySQL为MGR提供了丰富的监控信息,基本上在performance_schema系统库中,除了上述的replication_group_members外,还有replication_group_member_stats、replication_connection_status和replication_applier_status等。
本文主要介绍了如何搭建一个MGR集群,并未展开描述MGR的相关特性。感兴趣的同学可以查阅MGR官方手册,其中对MGR做了较为全面的介绍,是MGR入门的好帮手。
本文来自网易云社区 ,经作者温正湖授权发布。
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 网易容器云平台的微服务化实践(一)
【推荐】 从疑似华住集团4.93亿开房信息泄露 看个人如何预防信息泄露
MySQL MGR集群搭建的更多相关文章
- MySQL MGR集群单主模式的自动搭建和自动化故障修复
随着MySQL MGR的版本的升级以及技术成熟,在把MHA拉下神坛之后, MGR越来越成为MySQL高可用的首选方案.MGR的搭建并不算很复杂,但是有一系列手工操作步骤,为了简便MGR的搭建和故障诊断 ...
- 【Data Cluster】真机环境下MySQL数据库集群搭建
真机环境下MySQL-Cluster搭建文档 摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...
- nginx+apache+php+mysql服务器集群搭建
由于需要搭建了一个基本的服务器集群.具体的配置方案先不说了,到有时间的时候再介绍.下面介绍下整 个方案的优点. 我总共准备了四台阿里云的主机,架设分别是A,B1,B2,C,A在集群的最前面,B1和B2 ...
- centos7 mysql cluster集群搭建基于docker
1.准备 mn:集群管理服务器用于管理集群的其他节点.我们可以从管理节点创建和配置集群上的新节点.重新启动.删除或备份节点. db2/db3:这是节点间同步和数据复制的过程发生的层. db4/db5: ...
- MGR集群搭建
MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR提供了高可用.高扩展.高可靠的MySQL ...
- mysql主从集群搭建;(集群复制数据)
1.搭建mysql 5.7环境chown mysql:mysql -R /data/groupadd mysqluseradd -g mysql mysql yum install numactlrp ...
- MySQL MGR 集群从数据库显示RECOVRING
因为断电 或者 其他瞎折腾 导致: 从节点显示RECOVRING 查看错误日志显示: Slave SQL for channel 'group_replication_recovery': Error ...
- MySQL分布式集群之MyCAT(转)
原文地址:http://blog.itpub.net/29510932/viewspace-1664499/ 隔了好久,才想起来更新博客,最近倒腾的数据库从Oracle换成了MySQL,研究了一段时间 ...
- MySQL分布式集群之MyCAT(一)简介【转】
隔了好久,才想起来更新博客,最近倒腾的数据库从Oracle换成了MySQL,研究了一段时间,感觉社区版的MySQL在各个方面都逊色于Oracle,Oracle真的好方便!好了,不废话,这次准备记录一些 ...
随机推荐
- D. Anton and Chess 模拟题 + 读题
http://codeforces.com/contest/734/problem/D 一开始的时候看不懂题目,以为象是中国象棋那样走,然后看不懂样例. 原来是走对角线的,长知识了. 所以我们就知道, ...
- gin 打linux环境包问题解决
打window包直接go build一下,完事, 但是,打linux包出现如下错误 ..\github.com\mattn\go-isatty\isatty_linux.go:7:8: cannot ...
- [转]SqlServer索引的原理与应用
索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...
- list control 【转】
1. CListCtrl 风格 LVS_ICON: 为每个item显示大图标 LVS_SMALLICON: 为每个item显示小图标 LVS_LIST: 显示一列带有小图标的ite ...
- SQL 时间日期函数
1.获取当前日期GetDate getdate()函数以datetime数据类型的格式返回当前SQLServer服务器所在计算机的日期和时间.其语法格式为getdate().返回值舍入到最近的秒小数部 ...
- win7 x64和win10 x64 windbg 本地调试记录
今天看CSDN和某文档看了win7 64位 和win10 64位 的windbg本地调试内核的办法 win7 x64 Step1:kdbgctrl –db Step2:kdbgctrl –e Step ...
- 算法马拉松13 A-E解题报告
A题意(取余最长路): 佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和. 有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的 ...
- hydra 中文文档
hydra(九头蛇)是一款开源的协议爆破工具,功能十分强大!!! 具体使用如下: -R 继续从上一次进度接着破解 -I 忽略已破解的文件进行破解 -S 采用SSL链接 -s 端口 指定非默认服务端 ...
- JS中的delete操作符
首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.pr ...
- Linux中fork函数的例子