上个月我进行了审查雷竞技下载官网Percona运营商MySQL服务器仍然是α。运营商是基于Percona MySQL服务器,并使用雷竞技下载官网标准的异步复制,选择激活semi-synchronous复制获得更高级别的节点之间的数据的一致性。
整个解决方案是由:
另外,协调器(https://github.com/openark/orchestrator)是用于管理的拓扑和设置来启用复制节点,如果需要semi-synchronous的旗帜。虽然我们没有过多的说当使用标准异步复制,我想写几句话的需求和期望semi-synchronous (semi-sync)解决方案。
一个看着Semi-Synchronous
异步和Semi-sync之间的区别。
异步:
上面的图代表标准异步复制。预计该方法通过设计,对源事务提交不在场的副本。的应该是复制品赶上在可能的情况下。
同样重要的是要理解,在复制有两个步骤:
- 数据复制,它通常是非常快。数据从binlog复制源到中继日志的副本(IO_Thread)。
- 数据应用,数据从继电器读取登录数据库本身内部的副本节点和书面(SQL_Thread)。这一步通常是瓶颈,虽然有一些参数来优化,应用交易的效率取决于许多因素,包括模式设计。
生产部署,利用异步的解决方案通常是用来管理可能不一致的情况给出数据来源是不应该在副本提交。同时,分配给这个解决方案的高可用性水平低于我们通常与(几乎)获得同步复制,我们可能需要等待复制给补上的差距累积前relay-logs执行故障转移。
Semi-sync:
上面的图代表了Semi-sync复制方法。semi-sync的引入增加了检查一步源之前将确认返回给客户端。这一步的时刻发生在数据复制,因此,当数据从Binary-log复制源到Relay-log复制品。
这很重要,没有机制来确保一个更有弹性或有效的数据复制,只有一个额外的步骤,告诉源给定的时间等待答案从N副本,然后返回应答或超时并返回给客户端。
引入这种机制可能的显著延迟服务,不给一个100%的保证数据一致性。
而言,可用性的服务,在存在高负载时,这种方法可能导致停止供应来源请求在等待应答,大大减少了服务本身的可用性。
同时,唯一可以接受的设置对rpl_semi_sync_source_wait_point AFTER_SYNC(默认)是因为:在源出现故障时,所有交易承诺在源已经复制到副本(保存到它的中继日志)。意外退出的源服务器复制和故障转移是无损的,因为是最新的复制品。
都清楚了吗?没有?我简化了的事情。
- 在标准的复制,你有两个时刻(我简化)
- 将数据从源复制到副本
- 应用中的数据复制节点
- 没有认证的数据应用的一致性与源
- 与异步任务是编写数据来源binlog和忘记
- 与semi-sync源binlog写数据和等待T秒收到一个承认从N服务器收到的数据。
使semi-sync你遵循以下步骤:https://dev.mysql.com/doc/refman/8.0/en/replication-semisync-installation.html
简而言之:
- 注册插件
- 启用源rpl_semi_sync_source_enabled = 1
- 使复制品rpl_semi_sync_replica_enabled = 1
- 如果复制正在运行停止/启动IO_THREAD复制品
这里有趣的开始,许多“做好准备等待whaaat ?”。
什么是T和N我刚刚上面提到的?
T是一个超时,您可以设置为避免源永远等待副本承认。默认值是10秒。如果源多等待超时?
rpl_semi_sync_source_timeout控制源在提交等待多久从副本之前超时和承认恢复到异步复制。
谨慎的措辞!手册说源,所以它不是MySQL恢复到异步的,事务或连接,它是整个服务器。
现在分析工作日志(见https://dev.mysql.com/worklog/task/?id=1720和更多的引用)源应该尽快恢复semi-synchronous所有涉及副本是一致的。
然而,检查代码(见https://github.com/mysql/mysql-server/blob/beb865a960b9a8a16cf999c323e46c5b0c67f21f/plugin/semisync/semisync_source.cc L844和后),我们可以看到,我们没有100%的保证源能够切换。
还在代码中:
但是,它不是那么容易检测到副本了。这是由于这样的事实,MySQL的复制协议是异步的,也就是说,如果源不使用semi-sync协议,不会发送任何复制品来源。
在所有的运行测试,无法切换。简而言之,正从semi-sync,这是源永远,没有回滚。请记住,当我们继续。
我上面提到的N是什么?它代表了副本的数量必须提供应答。
如果你有10个节点的集群,您可能需要参与semi-sync只有他们两个,不需要包括他们所有人。但是如果你有三个节点的集群,一个是源,只依靠一个复制品,它不是真正的安全。我的意思是,如果你选择semi-synchronous确保数据复制,它支持一个节点是不够的,如果该节点崩溃,你注定失败,这样你至少需要两个节点semi-sync。
总之,关键是如果一个副本需要超过T回答,可能整个机制停止工作,直到永远。
正如我们以上所见,让semi-sync来源我们操纵全局变量的值rpl_semi_sync_source_enabled。
然而,如果我检查的价值rpl_semi_sync_source_enabled当源转移到简单的异步复制,因为超时:
选择@@rpl_semi_sync_source_enabled;
|
1
2
3
4
5
6
|
选择
@@rpl_semi_sync_source_enabled;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|@@rpl_semi_sync_source_enabled|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|1|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
正如你所看到的全局变量的报告值为1,这意味着semi-sync如果不是很活跃。
在文档中,据报道,监控semi-sync活动我们应该检查Rpl_semi_sync_souraybet雷竞技竞猜在线官网rce_status。这意味着你可以吗
Rpl_semi_sync_source_status = 0和rpl_semi_sync_source_enabled = 1在同一时间。
这是一个错误吗?根据文档:
当源开关之间异步或semisynchronous复制由于commit-blocking超时或复制品迎头赶上,它集Rpl_semi_sync_source_status的价值或适当Rpl_semi_sync_master_status状态变量。从semisynchronous自动回退到异步复制的源意味着有可能rpl_semi_sync_source_enabled或rpl_semi_sync_master_enabled系统变量的值1在源端即使semisynchronous复制实际上是不操作。您可以监视Rplraybet雷竞技竞猜在线官网_semi_sync_source_status或Rpl_semi_sync_master_status状态变量来确定源目前使用异步或semisynchronous复制。
这不是一个错误。然而,由于你记录它,它不会改变事实这是一个奇怪的/友好/违反直觉的方法,提出了许多,许多可能的问题。特别是你知道源可能无法开关semi-synch回来。
这一部分,我们可以总结如下:
- 你激活semi-sync设置一个全局变量
- 服务器/源可以禁用它(默默地)不改变变量
- 服务器将不会自动恢复semi-sync
- 检查如果semi-sync的工作方式是使用状态变量
- 当Rpl_semi_sync_source_status = 0和rpl_semi_sync_source_enabled = 1你有超时和源现在在异步复制工作
- 重新激活semi-sync的方法是设置rpl_semi_sync_source_enabled第一然后rpl_semi_sync_source_enabled =。
- 与semi-sync副本可以设置开/关但除非你不停止/启动Replica_IO_THREAD的状态变量可以与服务器的状态不一致。
会出现什么问题?
Semi-Synchronous并不严重影响性能
其他人已经semi-sync性能更好的详细讨论。然而,我想添加一些颜色给最近的经验与我们的运营商测试。
在接下来的图,我将向您展示的行为写/读使用异步复制和负载与Semi-synchronous相同。
备案,测试是一个简单的Sysbench-tpcc测试使用20表,20仓库,256个线程为600秒。
上面显示一个漂亮的和一致的负载在r / w以最小的波动。这是我们喜欢的。
下面的图形,代表相同的负载相同的环境但没有semi-sync激活和超时。
除了性能损失(我们从事务10 k / s 3 k / s),不断施加的停止/ semi-sync机制对应用程序有一个非常坏的影响行为当你有许多并发线程和高负载。我挑战任何严重的生产系统以这种方式工作。
当然,结果是符合这个溜溜球游戏:
在最好的情况下,当一切都按预期工作,没有疯狂的事情发生,我有60%的损失。面向我不认为这是一个小的性能下降。
但至少你的数据是安全的
已经在一开始,semi-synchronous复制的范围是保证数据在服务器到服务器B之前返回到应用程序。
简而言之,有一秒的时期,我们应该有最小的事务在飞行和有限的事务在应用队列。而对于标准复制(异步),我们可能…数以千计。
在下面的图表中我们可以看到两行:
- 黄线代表的数量GTIDs“飞行”从来源到目的地,Y2轴。源的崩溃,这些交易丢失,我们会有数据丢失。
- 蓝线代表GTIDs的数量已经从源复制到副本而不是应用于数据库Y1轴。在源崩溃的情况下,我们必须等待处理这些条目的副本,在节点之前写活动,或者我们会出现数据不一致。
异步复制:
像预期的那样我们可以看到一个巨大的队列应用relay-log的交易,交易价格的飙升和一些飞行。
使用semi-synchronous复制:
是的,显然我们没有减少队列和峰值所以没有数据丢失。
但当一切如期进行,在生产中,我们知道这不是常态。如果我们需要执行semi-sync但同时我们不能将超时设置为荒谬的价值观喜欢一个星期吗?
简单,我们需要一个检查将回semi-sync就默默地残疾(由于某种原因)。
然而这样做没有等待副本复制的差距,导致有趣的效果如下:
成千上万的事务排队和附带的结果有显著增加可能的数据丢失和仍然大量的数据从relay-log应用。
所以唯一可能的替代方法是将超时设置为一个疯狂的价值,然而,这可能会导致一个完整的生产停止在副本中挂起或出于任何原因,本地semi-sync禁用。
结论
首先,我想说,测试我们的操作员使用异步复制显示一致的行为标准在云中部署或前提。它有相同的好处,像更好的性能,和可能的问题作为故障转移时需要长时间等待复制应用relay-log队列。
semi-synchronous国旗的操作符是禁用的,测试我做了给我说“保持这样!”。至少,除非你很清楚你在做什么,能够处理semi-sync超时。
我很高兴能有机会来执行这些测试,因为它们给我一种方式/时间/需要调查semi-synchronous特性。就我个人而言,我是不相信semi-synchronous复制出来,现在我不是。我从来没有看到一个一致的和可信赖的特性在MySQL semi-sync。
如果你需要有一个更高层次的数据库同步,只是去组复制,或雷竞技下载官网Percona XtraDB集群,远离semi-sync。
否则,停留在异步复制,并不完美,但它是可以预测的。
引用
https://www.雷竞技下载官网percona.com/blog/2012/01/19/how-does-semisynchronous-mysql-replication-work/
https://datto.engineering/post/lossless-mysql-semi-sync-replication-and-automated-failover
https://planetscale.com/blog/mysql-semi-sync-replication-durability-consistency-and-split-brains
https://dev.mysql.com/doc/refman/8.0/en/replication-semisync-installation.html
https://dev.mysql.com/worklog/task/?id=1720
https://dev.mysql.com/worklog/task/?id=6630
















谢谢你的信息发布马可。
之间的性能差异是什么semi-synchronous和组复制?