InnoSQL HA Suite的实现原理与配置说明  InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能

http://www.innomysql.net/article/7403.html

Virtual Sync Replication

搭建一个MySQL数据库的复制(replication)环境是相当简单的,这点是MySQL数据库的优势,特别是对比Oracle DataGurad、Microsoft SQL Server Mirroring来说。但是,一个令人烦恼的问题就是MySQL的复制是极易出错的,例如常见的1062、1053、1032错误。因此,我一直强调这样一个观点:搭建一个严格的、符合生产环境复制需求的是有极大的挑战。如果根据我的标准来看,可能很多公司、甚至是所谓的大公司线上的复制配置都没有达到严格的标准。MySQL 5.6支持了crash safe功能,开启该功能可以解决很大一部分的问题。

然而很多时候,用户还抱怨MySQL的复制,不支持数据不丢失的场景。这也就是说,使用MySQL的复制功能就注定了需要承担数据丢失的风险,这点上MySQL数据库对比Oracle、Microsoft SQL Server来说就显得有些不足了。更糟的是,这造成了MySQL DBA这样的一个印象,数据是可以丢失的。从数据库的设计角度来说,ACID的目的之一就是保证数据的持久性,简单来说就是数据不可丢失。如果容忍丢失的话,那么用户的选择其实可以有很多,比如MongoDB、Redis等NoSQL数据库。

当然,MySQL数据库紧密的与互联网应用绑定,或许互联网应用本身并不强调数据的不可丢失性。例如博客、微薄这样的一些应用,但是从开发人员以及DBA的角度来看,我们需要确保提交的数据在宕机后可以恢复。当然,可以结合一些应用来实现这样的效果,例如应用程序记录每个操作日志,但是恢复会是一个比较麻烦与漫长的过程。

MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能,但是这同样会导致数据丢失的问题,只是丢失的内容会变得少。淘宝的周振兴提出了enhanced semi-sync replication的想法[1],并在5.5中予以实现。但是他的方案性能较差,并未能在淘宝内部得以广泛的使用。InnoSQL借鉴了周振兴的想法,并结合了组提交优化,通过减少fsync的次数来抵消网络的开销,此外可以通过增大组提交的比例来进一步优化性能,在InnoSQL中把这种实现称之为virtual sync replication(VSR),并已经在网易公司内部广泛的得以使用。

MySQL 5.7版本终于实现了类似的机制,称之为loss-less replication[2],相信随着5.7版本发布,越来越多的用户会拥抱这样功能。可惜的是,5.7版本离生产环境的使用至少还需要1年时间的等待。所以说InnoSQL是用户一个很好的选择,5.5版本就保证主从数据的完全一致性。

实现原理与机制

首先,virtual sync replication是基于MySQL原生的semi-sync replication技术实现的,因此非常易于理解。简单来说,VSR的实现就是调整了semi-sync的提交与等待顺序,原先semi-sync的等待顺序过程为:

  1. InnoDB引擎层prepare事务
  2. MySQL层写二进制日志
  3. InnoDB引擎层commit事务
  4. 通过复制的dump线程发送二进制日志event
  5. 等待接受从机的ACK回复

这样的处理机制会存在这样一个问题,由于步骤4的时候,事务已经提交,那么之前事务所做的修改对其他用户已经是可见的了,那么当发生宕机进行主从切换时,slave上可能会不存在之前已经存在的数据。VSR机制在于改变了3和4的步骤,这样保证在发送二进制日志的event时,事务没有提交,数据不可见,那么当进行主从故障切换时,不会存在上述semi-sync replication的问题。VSR的实现机制见下图:

Virtual Sync Replication的实现机制

有用户可能会对VSR的性能抱有担心,的确网络的延迟是无法避免的,这决定了VSR的性能会比异步的复制要差。但是VSR的性能会比semi-sync复制的性能要好很多。其实这是非常容易理解的,因为步骤3,4交换顺序后,可以极大的提高组提交的比例,从而减少fysnc的次数,提高性能,这就是前面说的,通过减少fsync来减缓网络延迟带来的开销。Facebook也有类似VSR的实现机制(FB称之为semi synchronous replication),他们也证实了VSR的性能要比semi-sync来得好[3]

HA Suite(MySQL双机高可用套件)

仅仅通过VSR机制就能保证主从数据的完全一致性吗?很可惜,还是不能。VSR还是与semi-sync一样,存在故障切换后,原master服务器的数据比slave多的情况。这是因为上述的步骤2已经写二进制日志了,master故障恢复后依然会提交该事务,但是这部分二进制日志可能会没有传送到slave。但是VSR和semi-sync不同的是,由于事务还在提交过程中,数据对其他事务不可见,这意味着,这部分已经写入到二进制日志的事务可以回滚。这部分的操作,最早通过外部脚本来控制,后来InnoSQL决定将这部分的工作交由数据库自己来完成,最后以一个高可用的套件形式来展现给用户,那么这部分的操作对用户来说就都是透明的了。

要配置HA Suite是及其简单的,假设复制环境的主服务器为192.168.1.2,从服务器为192.168.1.3,那么将其配置为双主的形式,启用semi-sync replication的插件,然后进行类似如下的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[mysqld]
binlog = mysqld-bin#开启二进制日志,搭建双主环境
sync_binlog = 1 #保证crash safe
innodb_flush_log_trx_commit = 1 #保证crash safe
rpl_semi_sync_master_timeout = 100000000 #不要超时,防止切异步,保证主从数据的完全一致性
rpl_semi_sync_master_commit_after_ack = 1 #启用VSR功能
enable_table_relay_info = 1 #开启crash safe功能
relay_log_recovery = 1 #开启crash safe功能
slave_parallel_threads=16 #并行复制的线程数
ha_partner_host = 192.168.1.3 #配置partner服务器(另一台配置为192.168.1.2)
ha_partner_user = xxx #连接partner服务器的数据库用户,用户直接使用复制的用户即可
ha_partner_password = xxx #连接partner服务器的数据库用户密码
ha_partner_port = 3306
read_only = 1 #可选配置

可以看到对于VSR来说最为重要的就是网络,对于网络的要求极高,当然这也非常容易理解,这对于Oracle DataGurad、Microsoft SQL Server Mirroring来说也是一样的要求。HA Suite配置之前介绍的并行复制功能,又能极大的提高从机的性能,同时又能缩短故障恢复的时间。

关于InnoSQL

InnoSQL是国产MySQL版本,并且遵守GPL v2协议,对开源所有修改的代码。InnoSQL针对互联网与传统金融企业的数据库应用进行性能优化与数据保障。

InnoSQL技术讨论QQ群:166583560 InnoSQL官方网站:www.innosql.net InnoSQL社区论坛:http://bbs.chinaunix.net/forum-324-1.html InnoSQL公众账号:InsideMySQL InnoSQL微薄:@InnoSQL

参考文献

  1. https://code.google.com/p/enhanced-semi-sync-replication/
  2. http://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html
  3. http://yoshinorimatsunobu.blogspot.com/2014/04/semi-synchronous-replication-at-facebook.html

InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能的更多相关文章

  1. centos7下mysql半同步复制原理安装测试详解

    原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...

  2. MySQL主从复制半同步复制原理及搭建

    在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有 ...

  3. MySQL半同步复制的搭建和配置原理

    半同步复制: 什么是半同步复制?我们知道在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的.异步复制可以提供最佳的性能,因为主服务器在将更新的数据写入它的二进制日志(Binl ...

  4. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

  5. MySQL-半同步复制原理实践

    参考文档: http://mysql.taobao.org/monthly/2017/04/01/ 阿里内核月报半同步复制的数据一致性 https://www.cnblogs.com/ivictor/ ...

  6. Dokit支持iOS本地crash查看功能

    一.前言 在日常开发中或者测试过程中,我们的应用可能会出现Crash的问题.对于这类问题我们要抱着零容忍的态度,因为如果线上出现了这类问题,将会严重影响用户的体验. 如果Crash出现的时候恰好是在开 ...

  7. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  8. MySQL crash-safe replication(3): MySQL的Crash Safe和Binlog的关系

    2016-12-23 17:29 宋利兵 作者:宋利兵 来源:MySQL代码研究(mysqlcode) 0.导读 本文重点介绍了InnoDB的crash safe和binlog之间的关系,以及2阶段提 ...

  9. 烂泥:学习mysql数据库主从同步复制原理

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 说明本篇文章部分转载自互联网. MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对 ...

随机推荐

  1. 小北微信小程序之小白教程系列之 -- 样式(WXSS)

    为了适应广大的前端开发者,WXSS 具有 CSS 大部分 特性.同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改.与 CSS 相比,WXSS 扩展的特性有:尺寸单位和样式导入. ...

  2. WP8.1学习系列(第二十章)——添加控件和处理事件

    先决条件 添加控件 设置控件的名称 设置控件属性 创建事件处理程序 新控件 总结 相关主题 通过使用如按钮.文本框和组合框等控件,你可以创建应用的 UI. 下面将显示如何将控件添加到应用.处理控件时, ...

  3. java基础---->git的使用(一)

    这里面记录一下git的使用,只是平时工作中遇到的一些问题的解决方案,不会涉及到git的一些基础概念及说明.人的天性便是这般凉薄,只要拿更好的来换,一定舍得. Git的一些使用 一.在码云建立好仓库之后 ...

  4. Qt自定义控件大全(一)云台仪表盘控件

    做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程序简单 ...

  5. 链表一元多项式计算器的实现(Java语言描述)

    链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进. 代码如下: package 一元多项式计算器; public class PolyNode { private double a; ...

  6. [转]F5负载均衡算法及基本原理

    原文:Intro to Load Balancing for Developers – The Algorithms 转载:http://blog.gesha.net/archives/205/  p ...

  7. C语言qsort用法

    一.对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *( ...

  8. mvn deploy命令上传包

    需求:有的时候需要单独上传release jar包,因为存在工程代码在A内网SVN,Nexus在B内网.这种情况下使用VPN也无法解决Jar包发布的问题. 这个时候采取的方式只能是: 打出jar包 - ...

  9. 使用COSBench工具对ceph s3接口进行压力测试--续

    之前写的使用COSBench工具对ceph s3接口进行压力测试是入门,在实际使用是,配置内容各不一样,下面列出 压力脚本是xml格式的,套用UserGuide文档说明,如下 有很多模板的例子,在co ...

  10. Spring Cloud Eureka 高可用注册中心

    参考:<<spring cloud 微服务实战>> 在微服务架构这样的分布式环境中,各个组件需要进行高可用部署. Eureka Server 高可用实际上就是将自己作为服务向其 ...