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. 【整理】LINUX下使用CMAKE安装MYSQL

    原文地址:http://www.cppblog.com/issay789/archive/2013/01/05/196967.html 一.安装 m4 下载地址: http://files.w3pc. ...

  2. 使用java中的session来记录访问次数

    <%@ page import="java.net.CookieHandler" %><%-- Created by IntelliJ IDEA. User: D ...

  3. Android设计和开发系列第二篇:Action Bar(Design)

    Action Bar The action bar is a dedicated piece of real estate at the top of each screen that is gene ...

  4. 【github】添加 ssh 秘钥

    1 生成秘钥 打开shell 备注: 123@example.com 为邮箱地址 ssh-keygen -t rsa -C "123@example.com" 此处选Y ,其他都是 ...

  5. Promise 必知必会的面试题

    Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?本文根据 Promise 的一些知识点总结了十道题,看看你能做对几道. 以下 promise 均指代 P ...

  6. mint下截图工具shutter的安装和使用设置

    [原创作品,技术交流.允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息.如有错误,请指正] /** author: lihaibo date: 1/25/2016 */ 今天安装了双系统 ...

  7. 阻止form表单提交的问题

    阻止form表单提交这种场景可能在生活中,我们经常碰到,而在我们第一印象里面可能我们用return false 去阻止表单默认行为. 但是,有中情况我们用return false 不能阻止表单提交 & ...

  8. PHP将富文本内容去除各类样式图片等只保留txt文本内容(作用于SEO的description)

    1.从数据库读取富文本内容样式如下: <p style=";text-indent: 0;padding: 0;line-height: 26px"><span ...

  9. linux 安装Swagger(swagger-editor , swagger-ui)

    一.环境要求 1.Nodejs ( 版本6.0x以上 ) 2.npm (npm 3.x) 注: linux 更新nodejs到最新 node -v 4.2.1 sudo npm cache clean ...

  10. Linux 常用命令标记

    1.linux 服务器之间拷贝文件 scp 本地用户名@IP地址:文件名1 远程用户名@IP地址:文件名2 该命令可以变型为目的服务器204上输入如下命令:红色部分是需要接受目的地,-r是递归复制该文 ...