前言
MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式。在介绍 semi sync 之前,我们先了解:半同步 Asynchronous 和 同步 Synchronous 。
异步复制模式
主库将已经提交的事务event 写入binlog后,即返回成功给app,该模式下并不保证任何已经提交的事务会传递到任何slave并被成功应用。
全同步复制模式。
当主库提交一个事务 event,主库会等待该事务被传递到所有的slave上,且所有slave applay 该事务/event 通知主库之后,才会返回回话,事务已经成功。
从定义中可以看出 异步模式不能保证数据的安全性,因为它不等待主库提交的事务在slave 上落盘,而全同步模式 由于要等待所有的slave 确认已提交事务成功被应用,如此则会带来事务处理上的延时。semi sync 则取了一个比较折中的方式,确保已提交的事务必须存在于至少两个机器(主库和任一备库),立即返回给客户端 事务成功。
一、Semisynchronous Replication 定义
Semisynchronous Replication模式下,在主库上提交一个事务/event,它会等待至少一个slave通知主库,slave 已经接收到传递过来的events并写入relay log,才返回给回话层 写入成功,或者直到传送日志发生超时。
二、优缺点
优点:当事务返回成功给客户端时,则事务至少在两台机器上存在,增强数据安全性。相比异步模式和全同步模式,是一种折中。
缺点:半同步的确会对数据库性能有一定影响,因为事务的提交必须等待slave 反馈。html" target="_blank">性能损耗取决于tcp/IP 网络传输时间,也即传输已提交事务和等待slave 反馈已经接收事务的时间。
三、MySQL 半同步的特性
1 当slave 连接主库时,它会告知主库它是不是semi sync 模式。
2 如果主库启用了semi sync模式,且至少一个slave 也启用了semi sync模式,一个在主库操作事务的进程在事务提交之后,且至少一个slave 通知主库成功接收所有事务之前,该进程会处于blocks 等待状态或者直到超时发生。
3 当且仅当传递过来的events 传递到slave,被写入relay log,刷新到磁盘才会通知主库完成。
4 Semisynchronous replication 必须在主备两端都同时启用,否则任何一个未设置,主备之间的复制模式将转变为异步复制模式。
5 当所有slave 在(rpl_semi_sync_master_timeout的默认值)时间内未返回给主库成功接收event,主备之间就会变回原来的异步状态。
其中关于第二点 MySQL 5.7 已经做了优化,由ack Collector (Col) thread 等待备库的成功接收事务的通知,这点后续会做详细介绍--《5.7 Semisync replication 增强》。
四、异常处理
当备库Crash时,主库会在某次等待超时后,关闭Semi-sync的特性,降级为普通的异步复制,这种情况比较简单。
MySQL的 error.log 会提示:
140523 22:26:00 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000002, pos: 465893519), semi-sync up to file , position 0. 140523 22:26:00 [Note] Semi-sync replication switched OFF.
比较难以处理的情况是:当主机/主库Crash时,可能存在一些事务已经在主库提交,但是还没有来的及传给任何备库,也即这些事务都是没有返回给客户端的,所以发起事务的客户端并不知道这个事务是否已经完成--"墙头事务"。这时,如果客户端不做切换,只是等Crash的主库恢复后,继续在主库进行操作,客户端会发现前面的"墙头事务"都已经完成,可以继续进行后续的业务处理;另一种情况,如果客户端Failover到备库上,客户端会发现前面的“墙头事务”都没有成功,则需要重新做这些事务,然后继续进行后续的业务处理,其实此时主备是不一致的,需要通过主备数据校验来检查哪一个库是正确的,然后进行修复。
五、小结
总之相比于MySQL 5.5 版本之前的异步复制模式 semi sync 已经有了很大的进步,增强了数据的安全性,以安全换一定的性能损耗还是可以接受的。后续会介绍如何安装和使用semi sync。
目录表 简介 Python的特色 概括 为什么不使用Perl? 程序员的话 简介 Python语言是少有的一种可以称得上即简单又功能强大的编程语言。你将惊喜地发现Python语言是多么地简单,它注重的是如何解决问题而不是编程语言的语法和结构。 Python的官方介绍是: Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和
A physicist, an engineer, and a computer scientist were discussing the nature of God. Surely a Physicist, said the physicist, because early in the Creation, God made Light; and you know, Maxwell's equ
自动化测试对于现代web开发者来说,是非常实用的除错工具。你可以使用一系列测试-- 测试套件 -- 来解决或者避免大量问题: 当你编写新代码的时候,你可以使用测试来验证你的代码是否像预期一样工作。 当你重构或者修改旧代码的时候,你可以使用测试来确保你的修改不会在意料之外影响到你的应用的应为。 测试web应用是个复杂的任务,因为web应用由很多的逻辑层组成 -- 从HTTP层面的请求处理,到表单验证
介绍 动机 核心概念 三大原则 先前技术 学习资源 生态系统 示例
Bootstrap是当前世界最受欢迎的用于建立响应式、移动设备优先的站点和应用的框架。在其中,你将发现高质量的HTML、CSS以及JavaScript,使你的工程项目变得无比简单。 下面教你如何快速上手Bootstrap CDN,并建立一个模板化的起始页面。 开门见山 想要快速地把BootStrap添加到你的工程项目中?那就使用Bootstrap CDN吧,它则MaxCDN提供。想使用一个程序包管
前言 ES6/7 带来的变革 自ES6确定和ES7的async/await开始普及,node.js的发展变得更加迅速,可以预见到JavaScript中令人“头疼”的多层嵌套回调(注意是”多层嵌套回调“)将会使用Promise + async/await的方式逐渐替代(不是完全替代,多层嵌套回调也有其特殊的应用场景)。 koa2 大势所趋的前景 基于async/await实现中间体系的koa2框架将
如果你从事编译器或解析器的开发工作,你可能对lex和yacc不会陌生,PLY是David Beazley实现的基于Python的lex和yacc。作者最着名的成就可能是其撰写的Python Cookbook, 3rd Edition。我因为偶然的原因接触了PLY,觉得是个好东西,但是似乎国内没有相关的资料。于是萌生了翻译的想法,虽然内容不算多,但是由于能力有限,很多概念不了解,还专门补习了编译原理
介绍 你有没有觉得世界越来越多的是关于技术,而你已经在某种程度上被甩在了后面? 你有没有想去做一个网站,但是却从未有过足够的动力去开始吗? 你有没有想过软件世界太过复杂,即使你想做一些属于自己的东西? 好的,我们跟你讲一个好消息!编程没有看上去那幺复杂,我们将给你展示它是多幺的有趣。 本教程不会神奇地将你转变为程序员。 如果你想变得擅长于此,你需要数月乃至数年的时间去学习和练习。 但是我们想展示给