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

作者介绍

贺春旸,普惠金融MySQL专家,《MySQL管理之道》第一版、第二版作者。曾任职于中国移动飞信、机锋安卓市场,拥有丰富的数据库管理经验。目前致力于MySQL、Linux等开源技术的研究。

 

MySQL异步复制及semi-sync半同步复制,它们都基于MySQL binlog,原生复制是完全异步的,master不需要保证slave接收并执行了binlog,能够保证master最大性能,但是slave可能存在延迟,主备数据无法保证一致性,在不停服务的前提下如果master宕机,提升slave为新的主库,就会丢失数据。

 

semi-sync在异步复制基础上增加了数据保护的考虑,这样一来master必须确认slave收到binlog后(但不保证slave执行了事务)才能最终提交事务,若再结合MHA(Master High Availability)高可用架构,此时master挂掉之后,slave可以在apply完所有relay log后切换成master提供读写服务。

 

semi-sync半同步复制工作原理,如下图所示。

 

 

相对于MySQL源生复制和semi-sync半同步复制,Group Replication全同步复制的差异是:

 

  1. 全同步复制,主备无延迟,一个节点宕机后其他两个节点可以立即提供服务,而semi-sync需要应用(执行)完所有relay log,并依赖第三方高可用软件实现数据不丢失;
  2. 事务冲突检测保证数据一致性,多个节点可以同时读写数据,可以极大简化数据访问;
  3. 行级别并行复制,MySQL 5.7/MariaDB 10.0之前slave sql线程只有一个,这个长期饱受诟病,是导致slave落后master的主要原因。

 

  1 Group Replication的工作原理
 

使用的是基于认证的复制,其流程如下图所示:

 

 

当客户端发起commit命令时(此时仍然没有发生真正的commit),所有本事务内对数据库的更改行的主键都会被搜集到一个写入集(writeset)中,该写入集随后会被复制到其他节点,该写入集会在每个节点上使用搜索到的主键进行确认性认证测试来判断该写入集是否可以被应用。如果认证测试失败,写入集会被丢弃并且原始事务会被回滚;如果认证成功,事务会被提交并且写入集会被在剩余节点进行应用。最终,这意味着所有服务器以相同的顺序接收同一组事务。

 

其他节点只要验证成功了,就会返回成功的信号,即使当前数据并没有真正的写入当前节点,固这里的全同步复制,其实是虚拟的全同步复制。这段时间内,数据是有延迟的,但很小,如果应用程序访问的是远端节点,读到的数据是未改变之前的旧数据。固在生产环境里,对数据延迟要求很苛刻的情况下,建议在一个主节点上读写,避免造成数据不一致的情况发生。

 

(注:Galera通过设置参数wsrep_causal_reads = ON可以避免,这种情况下需要等待远端节点应用完事务后,才返回客户端读取请求,这将增加读取的响应时间。Group Replication未发现相关参数,如有朋友知道也请告知。)

 

而真正意义上的全同步复制,是要等所有节点事务都提交落地,才成功返回客户端。因此虚拟全同步复制的性能会更好一些。

 

Group Replication内部实现了flow control限流措施,作用就是协调各个节点,保证所有节点执行事务的速度大于队列增长速度,从而避免丢失事务。实现原理和简单:整个Group Replication集群中,同时只有一个节点可以广播消息(数据),每个节点都会获得广播消息的机会(获得机会后也可以不广播),当慢节点的待执行队列超过一定长度后,它会广播一个FC_PAUSE消息,所以节点收到消息后都会暂缓广播消息并不提供写操作,直到该慢节点的待执行队列长度减小到一定长度后,Group Replication数据同步又开始恢复。

 

变量参数:

group_replication_flow_control_applier_threshold = 25000

group_replication_flow_control_certifier_threshold = 25000

 

待执行队列长度超过该值时,flow control被触发,默认是25000。
 

  2 Group Replication的特性和注意事项
 

  • 全同步复制,事务要么在所有节点都提交,要么都回滚;
  • 多主复制,可以在任意节点进行写操作;
  • 在从服务器上并行应用事件,真正意义上的并行复制;
  • 节点自动配置--故障节点自动从集群中移除,当故障节点再次加入集群,无需手工备份当前数据库并拷贝至故障节点;
  • 应用程序的兼容性:无需更改应用程序,原生的MySQL接口;
  • 生产环境上集群推荐配置3个节点;
  • 每个节点都包含完整的数据副本;
  • 各个节点的同步复制,通过GTID binlog ROW实现。

 

优点:

  1. 真正的多主架构,任何节点都可以进行读写,无需进行读写分离;

    (注:生产环境建议只在一台机器上写,由于集群是乐观锁并发控制,事务冲突的情况会在commit阶段发生。如果有两个事务在集群中不同的节点上对同一行写入并提交,失败的节点将回滚,客户端返回报错,作为DBA你不想被一群开发投诉的话,还是默默的开启Single-Primary写入模式)

  2. 无集中管理,可以在任何时间点失去任何一个节点,集群将正常工作不受影响;
  3. 节点宕机不会导致数据丢失;
  4. 对应用透明。

 

缺点:

  1. 加入新节点,开销大,需要复制完整的数据。
  2. 不能有效的解决写扩展问题,磁盘空间满了,无法自动扩容,不能像MongoDB分片那样自动移动chunk做balance
  3. 有多少个节点就有多少份重复的数据
  4. 由于事务提交需要跨节点通讯(分布式事务),写入会比主从复制慢
  5. 对网络要求非常高,如果网络出现波动或机房被ARP攻击,造成两个节点失联,Group Replication集群发生脑裂,服务将不可用。

 

下面是官方集群节点投票示意图,如果是3个节点,必须满足大多数节点2个投票,这里很像MongoDB副本集的算法吧^_^

 

     

 

集群自身不提供VIP机制,也没有像MongoDB副本集那样提供JAVA/PHP客户端API接口实现故障切换(需要开发自己写,成本较高),需要结合第三方HaProxy软件(建议2块网卡做bond0)+自定义脚本实现秒级故障切换,另通过代理方式,性能会降低,因为多了一层网络转发。

 

局限性:

  • 目前的复制仅仅支持InnoDB存储引擎;
  • 每张表必须有主键;
  • 只支持ipv4网络;
  • 集群最大支持9个节点;
  • 不支持Savepoints;
  • 不支持SERIALIZABLE隔离级别在Multi-Primary多主模式;
  • 不支持外键在Multi-Primary多主模式;
  • 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,比如硬盘故障(RAID10坏了一块盘),那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

 

  3 Group Replication的使用
 

Single-Primary模式配置环境:

 

1、设置host解析

 

三台服务器的配置如下:

 

# cat /etc/hosts

 


192.168.17.133     node1

192.168.17.134     node2

192.168.17.135     node3

 

2、编辑/etc/my.cnf配置参数(三个节点按照如下设置)

 


log-bin = /data/mysql57/binlog/mysql-bin

binlog_format = ROW

sync_binlog = 1

binlog_checksum = NONE

log_slave_updates = 1

gtid_mode = ON

enforce_gtid_consistency = ON

master_info_repository = TABLE

relay_log_info_repository = TABLE

 

3、安装插件

 


INSTALL PLUGIN group_replication SONAME   'group_replication.so';

 

4、设置集群参数(三个节点都执行)

 


set global transaction_write_set_extraction =   "XXHASH64";

set global group_replication_start_on_boot = ON;

set global group_replication_bootstrap_group = OFF;

set global group_replication_group_name =

"13dd01d4-d69e-11e6-9c80-000c2937cddb";

set global group_replication_local_address =   '192.168.17.133:6606';

set global group_replication_group_seeds =

'192.168.17.133:6606,192.168.17.134:6606,192.168.17.135:6606';

set global group_replication_single_primary_mode = ON;

 

注:group_replication_group_name名字要通过select uuid()来生成

group_replication_local_address在节点2和节点3上改成本地IP地址

执行完了,别忘了修改my.cnf里加入到配置文件里。

 

5、节点加入集群

 

Primary节点上执行

 


SET SQL_LOG_BIN=0;

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO   'repl'@'%' IDENTIFIED BY 'repl';

FLUSH PRIVILEGES;

SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='repl',

MASTER_PASSWORD='repl' FOR CHANNEL

'group_replication_recovery';

SET GLOBAL group_replication_bootstrap_group=ON;

START GROUP_REPLICATION;

select * from   performance_schema.replication_group_members;

SET GLOBAL group_replication_bootstrap_group=OFF;

 

注:待replication_group_members表查询结果MEMBER_STATE字段状态为ONLINE,再执行关闭初始化。

 

两台Secondary上执行

 


SET SQL_LOG_BIN=0;

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO   'repl'@'%' IDENTIFIED BY 'repl';

FLUSH PRIVILEGES;

SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='repl',

MASTER_PASSWORD='repl' FOR CHANNEL

'group_replication_recovery';

START GROUP_REPLICATION;

select * from   performance_schema.replication_group_members;

 

如下图所示,代表集群已经成功运行。

 

 

  4 Group Replication的维护
 

假如Secondary节点宕机,重启后由于种种原因加入集群失败,现需要重新恢复,步骤如下:

 

1、在另一台Secondary节点上mysqldump全量

 


mysqldump -uroot -p123456 -q --single-transaction

--master-data=2 -B yourDB > /root/yourDB.sql

 

这一步会自动在yourDB.sql里生成

 

SET @@GLOBAL.GTID_PURGED='23e510dc-d30b-11e6-a4c6-b82a72d18b06:1,4d1fd6ec-d2fd-11e6-ae4b-549f3503ab31:1-1543112:2003786-2003789:3003787,e4e34dd3-d2fa-11e6-984b-b82a72d18b06:1';

 

2、导入进去

 

再执行下面的语句即可

 


CHANGE MASTER TO MASTER_USER='repl',

MASTER_PASSWORD='repl' FOR CHANNEL

'group_replication_recovery';

START GROUP_REPLICATION;

 

  5 Group Replication总结
 

由于5.7.17版本刚刚GA,所以直接上生产环境风险太高,至少1年后小版本超过5.7.40以后再考虑。

原文发布时间为:2017-01-12

时间: 2024-11-10 10:27:54

如何使用与维护,才能把MySQL GR发挥到极致?的相关文章

那在sql server中该怎么写才能达到mysql中的分组效果呢,分出的结果不一样

问题描述 那在sql server中该怎么写才能达到mysql中的分组效果呢,分出的结果不一样 SELECT CASE WHEN AGE <= 10 THEN '1' WHEN AGE > 10 AND AGE <= 20 THEN '2' WHEN AGE > 20 AND AGE <= 30 THEN '3' WHEN AGE > 30 AND AGE <= 40 THEN '4' WHEN AGE > 40 AND AGE <= 50 THEN

mysql-怎么才能控制MySQL的启动

问题描述 怎么才能控制MySQL的启动 怎么能实现MySQL启动时去读取一sql配置文件,读取到里面的内容如果是某一加密字符 ,如果判断加密正确,则正常启动,否则不让其启动. 解决方案 调用net start mysqlhttps://www.codefans.net/soft/25141.shtml 解决方案二: 可以用一个bat等 它先读取对应的sql文件 做完判断后再决定是否启动mysql

如何才能实现MySQL的自动备份

mysql|备份 MySql自动备份是非常关键的,特别是对于DBA来说.这里主要用代码来说明这个问题,希望对各位有所帮助.可以将这个脚本放进crontab,每天凌晨执行一次,自动备份. 这个脚本每天最多只执行一次,而且只保留最近五天的备份在服务器上. 代码: #!/bin/bash #This is a ShellScript For Auto DB Backup #Powered by aspbiz #2004-09 #Setting #设置数据库名,数据库登录名,密码,备份路径,日志路径,数

怎样才能解决MySQL 5.0.16的乱码问题

问:怎样解决MySQL 5.0.16的乱码问题? 答:MySQL 5.0.16的乱码问题可以用下面的方法解决: 1.设置phpMyAdmin Language:Chinese simplified (zh-utf-8) MySQL 字符集:UTF-8 Unicode (utf8) MySQL 连接校对 gbk_chinese_ci 2.创建数据库时 整理设置成 gbk_chinese_ci 3.用SQL建立表中 ENGINE=MyISAM DEFAULT CHARSET=gbk; ENGINE=

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

在MySQL 5.7.17版本中发布的MySQL Group Replication(后文简称为MGR)被很多人称为MySQL复制方案的正规军,可以一举取代现在的MySQL Replication,Semisynchronous replication,甚至是可以取代之前最成功的MySQL集群方案Galera. MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,单主或者多主. 在前一种模式Single-Primary中,无论集群中有多少个节点,只有一个节点允

一对多关联映射 我该怎么维护才能对 一天了 烦死了

问题描述 三个表部门表(dept)员工表(emp)员工附件表(empfile)关系:部门表和员工表是一对多员工表和附件表是一对多(添加员工时上传的附件重新做了一个附件表用外键关联起来)每一步我都写了注视而且很清晰谢谢了各位主要代码如下:publicclassUserActionextendsActionSupportimplementsModelDriven<Emp>{privateEmpemp=newEmp();---------->实例化员工表(里边有员工的一些具体信息如果年龄,爱好

网站如何建设才能让seo优化发挥“蝴蝶效应”?

之前的我是一名网站建设者,后来在接触了seo之后我才发觉,原来自己之前在网站建设这个领域中有多无知.原本以为我应该是网站建设领域中的佼佼者,至少在周边很多站友当中我算是比较出色的.但在我对seo有一定的了解之后,我不得不以一名Seoer的身份给曾经一个不及格的网站建设者的我提出几点建议,同时也给那些现在从事网站建设的你一个借鉴. 如果说一个网站的建设完全和seo不搭边,那么这就显得很不现实,否则我们还要seoer来做啥.所以说,一个完全不懂得seo只是的网站建设者是绝对不及格的.而一个合格的网站

如何才能让文章外链达到极致

我们再百度上搜索的时候,常常看到后面跟着一大堆的"顶,看好,好贴"等等字眼,以前真的觉得他们写的很不错,相信了贴了,后来真正自己做seo的时候猜发行,他们在发表看法的时候,签名上都做了好多的锚文本,oh,原理都是在做外链.上面说的只是一种最基本的方法,下面就从两个方面来说明如何把外链做到极致 1.利用网站转载 想必大家在搜索的时候都看到了,当我们搜索的时候,同一个标题,同样的内容会重复出现,有时基本上都是重复的内容,总不会都是原创吧,总不会原创的一模一样吧?答案是肯定的,因为互联网上

公开的网站SEO秘密你知道多少

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 第一:公开的SEO秘密是什么? 1.网站结构的搭建 什么结构好呢?大家都公认的是树形结构,为什么呢?因为这样的结构便于搜索引擎的深入抓取,能够更好的提升你网站的收录数量,进而增加权重和长尾带来的流量. 2.网站标题描述的撰写 标题的撰写相对于SEO来说是很重要的,搜索引擎主要靠抓取你网站的标题来确定你网站的主题是什么,然后分析归类,然后给予排