专栏首页idbaMySQL Group Replication 入坑指北

MySQL Group Replication 入坑指北

一 简介

MGR(MySQL Group Replication)是MySQL官方推出的一个全新的高可用与高扩展的解决方案,提供高可用、高扩展、高可靠(强一致性)的MySQL集群服务。同类型的技术产品有MariaDB Galera Cluster和Percona XtraDB Cluster。MGR由多个实例节点共同组成一个数据库集群,系统提交事务必须经过半数以上节点同意方可提交,在集群中每个节点上都维护一个数据库状态机,保证节点间事务的一致性。

MGR 单节点结构

MGR的优点:

高一致性,基于原生复制及paxos协议的组复制技术.
高容错性,有自动检测机制,当出现宕机后,会自动剔除问题节点,其他节点可以正常使用,当不同节点产生资源争用冲突时,会按照先到先得处理,并且内置了自动化脑裂防护机制.
高扩展性,可随时在线新增和移除节点,会自动同步所有节点上状态,直到新节点和其他节点保持一致,自动维护新的组信息.
高灵活性,以插件形式安装,有两种模式:单主模式和多主模式

MGR缺点和限制:

对网络稳定性要求很高,至少是同机房做。稳定性相对较弱。不支持binlog checksum不支持savepoint不支持gap locks不支持lock tables, unlock tables多主模式不支持多节点同时对一个表进行DDL vs DDL/DML多主模式不支持SERIALIZABLE隔离级别多主模式不支持多级关联外键

二 MGR 搭建过程

2.1 环境准备

机器

qabb-qa-mysql-test0 10.9.95.110qabb-qa-mysql-test1 10.9.78.64qabb-qa-mysql-test2 10.9.118.252

端口 3306 ,集群通信端口 13306

部署mysql

sudo salt-call state.sls role.percona-server

我自己的环境是利用salt安装,读者朋友可以根据自己的环境来自行安装。

配置文件

这里列出来核心的参数,其他参数和正常的主从无差别。大家可以自行准备。

log_slave_updates                       = 1binlog_format                           = rowperformance_schema                      = ON   binlog_checksum                         = NONE#GTIDmaster_info_repository                  = 'TABLE'relay_log_info_repository               = 'TABLE'gtid_mode                               = ONenforce_gtid_consistency                = ON#MGRtransaction_write_set_extraction=XXHASH64  #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"        loose-group_replication_start_on_boot=off  #设置为Server启动时不自动启动组复制loose-group_replication_local_address= "10.9.95.110:13306" #host:port,是MGR的端口,不是数据库的端口loose-group_replication_group_seeds="10.9.95.110:13306,10.9.78.64:13306,10.9.118.252:13306"loose-group_replication_bootstrap_group= off   #配置是否自动引导组

其中

loose 前缀的意义在于第一次启动时还没加载组复制的plugin,可以让mysql server忽略该参数,继续启动。 group_replication_group_name 表示MGR复制组的名字。可以手工指定,但是必须符合uuid的格式。 group_replication_bootstrap_group为on时表示该实例是整个集群的引导组。需要特别注意,引导的实例只需要一个,所以集群内其他实例都不需要开启这个参数,默认为off。只有第一次初始化集群或者整个集群重启时需要再set global来开启. loose-group_replication_start_on_boot 为false时组复制不随实例启动。 loose-group_replication_local_address [host|ip]:port,其中port是MGR的端口,不是数据库的端口 loose-group_replication_group_seeds 需要接受本MGR实例控制的实例 [host|ip]:port,其中port是MGR的端口,不是数据库的端口 group_replication_single_primary_mode 决定是否为单主模式(ON)还是多主模式(OFF) 单主模式要求过半数节点写入成功之后,主库才返回成功。多主模式可以提高性能,但是事务冲突的概率也更高。 loose-group_replication_enforce_update_everywhere_checks多主模式下,强制检查每一个实例是否允许写操作,如果是单主模式,可以设置为off。

2.2 初始化实例

mkdir -p /data/my3306/{data,run,tmp,log};chown -R mysql:mysql /data/my3306/;

/opt/mysql/bin/mysqld --defaults-file=/data/my3306/my.cnf --initialize-insecure

使用 initialize-insecure 选项是为了测试,生产环境大家需要注意安全性。

2.3 配置mgr

第一个结点

### 创建核心用户set sql_log_bin=0;CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;GRANT PROXY ON ''@'' TO 'root'@'127.0.0.1' WITH GRANT OPTION;create user replicuser@'%';grant replication slave,replication client on *.* to replicuser@'%' identified by 'replicuser';set sql_log_bin=1;
###change master to master_user='replicuser',master_password='replicuser' for channel 'group_replication_recovery';
### 安装组复制插件。install plugin group_replication SONAME 'group_replication.so';
### 启动组复制set global group_replication_bootstrap_group=on;start group_replication;set global group_replication_bootstrap_group=off;### 检查节点是否加入SELECT * FROM performance_schema.replication_group_members;

对应的日志 内容

第二个节点和第三个节点执行如下操作

set sql_log_bin=0;CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;GRANT PROXY ON ''@'' TO 'root'@'127.0.0.1' WITH GRANT OPTION;create user replicuser@'%';grant replication slave,replication client on *.* to replicuser@'%' identified by 'replicuser';set sql_log_bin=1;
change master to master_user='replicuser',master_password='replicuser' for channel 'group_replication_recovery';install plugin group_replication SONAME 'group_replication.so';
###set global group_replication_allow_local_disjoint_gtids_join=ON;start group_replication;SELECT * FROM performance_schema.replication_group_members;

在第二第三节点执行 start group_replication; 命令之后,日志输出如下,新的节点已经加入到集群组中了。

[Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test1:3306' [Note] Plugin group_replication reported: 'Members joined the group: qabb-qa-mysql-test2:3306'

安装成功之后,查看集群的状态。

这里对结果做个说明:

CHANNEL_NAME:显示的值永远为group_replication_applierMEMBER_ID   :实例节点的serer_uuid值MEMBER_PORT :实例节点服务端口,取值为server_port指定的端口MEMBER_HOST :如果没有配置report_host选项,那么取值为机器的hostname,可以通过report_host配置指定具体的IPMEMBER_STATE : 节点状态  ONLINE      表示该节点可正常提供服务   RECOVERING 表示该节点正在从其他节点恢复数据 OFFLINE    表示MGR插件已经加载,但是该节点不属于任何一个GR组 ERROR      表示该节点在recovery阶段出现错误或者从其他节点同步状态中出现错误 UNREACHABLE    表示该节点处于不可达状态,无法与之发生网络通讯 

2.4 测试

在主节点创建数据库和表 并插入数据。

mytest [RW][TEST::3306] 03:26:25 >create table x(id int not null auto_increment primary key , a int default 0 ) engine=innodb;Query OK, 0 rows affected (0.02 sec)
mytest [RW][TEST::3306] 03:26:58 >insert into x(a) values(1),(2),(3);Query OK, 3 rows affected (0.01 sec)Records: 3  Duplicates: 0  Warnings: 0

第二节点查询数据,与主节点数据一致。

三 小结

本文算是初试牛刀的how to文档,没有什么特别深刻的技术含量,不过也算是入坑MGR了。目前接触的DBA同行有些对技术追求的比较快,已经在线上大规模使用MGR了,也从侧面说明MGR可以在生产使用。随着官方的推进,未来MGR 会成为一种可靠的技术选项。

本文分享自微信公众号 - yangyidba(yangyidba),作者:yangyidba

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CAP 一致性协议及应用解析

    假设系统中有 5 个节点,n1~n5。n1,n2,n3 在A物理机房。n4,n5 在 B 物理机房。现在发生了网络分区,A 机房和 B 机房网络不通。

    用户1278550
  • 哪些因素会导致慢查询?

    不管是开发同学还是DBA,想必大家都遇到慢查询(select,update,insert,delete 语句慢),影响业务稳定性。这里说的慢,有两个含义一是比正...

    用户1278550
  • ZanDB基于Celery定时任务的二次开发

    ZanDB早期的任务需求中,大部分都是针对servant(跑在主机上的agent)做任务调度。也就是说,一期的任务系统,满足的是在特定时刻调用特定主机执行特定的...

    用户1278550
  • MySQL组复制(MGR)全解析 Part 10 MGR新增节点

    group_replication_local_addres填写本机的IP group_replication_group_seeds 填写所有节点的IP

    bsbforever
  • Mysql Group Replication简介

    MGR(Mysql Group Replication)是5.7版本新加的特性,是一个MySQL插件。

    MySQL轻松学
  • ElasticSearch(7.2.2)-es分布式⼯作原理

    cwl_java
  • Akka 指南 之「集群规范」

    Akka 集群(Cluster)提供了一种容错的、分散的、基于点对点(peer-to-peer)的集群成员(membership)服务,不存在单点故障或单点瓶颈...

    CG国斌
  • 江苏省初中信息技术八年级 -张叔叔一文读懂

    今天张叔叔给大家讲讲江苏省八年级信息技术教材内容,之前的七年级教材讲解收到了热烈欢迎,在此感谢所有的读者们,也希望大家积极转载,为社会主义建设添砖加瓦!

    张叔叔讲互联网
  • 二叉树非递归版的后序遍历算法

    本公众号主要推送关于对算法的思考以及应用的消息。算法思想说来有,分而治之,搜索,动态规划,回溯,贪心等,结合这些思想再去思考如今很火的大数据,云计算和机器学习,...

    double
  • 网络拓扑结构-网络图的凝聚性特征和R计算

    前述网络基础概述中提到,在数学中,“网络”(networks)通常被称为“图”(graphs),一个图G=(V,E)是一种包含“节点”集合V与“边”集合E的数学...

    用户7585161

扫码关注云+社区

领取腾讯云代金券