MySQL一般在人们眼中就是一个低端、开源、大众化的数据库产品,它的稳定性和可用性一直被人们所置疑,被认为难登大雅之堂,只适用于互联网应用,难于应用到可用性高的场景中,好比金融、证券等行业。然而时代的变化太快,MySQL也不能再以过去的眼光来看,从MySQL金融版的诞生开始,它已经再也不是那个扶不起的阿斗,它已经脱胎换骨,以一个崭新的形象出如今数据库的高端产品中。数据库
这一切真的难以置信,在开源数据库产品中,MySQL历来都是一枝独秀,但在表面风光的同时,倒是DBA和资深用户的满心苦涩。因为硬件、网络的可用性还难以达到理想的要求,不管出现任何故障,数据库系统都必须保证其可用性。对于MySQL来讲,你们所熟知的主备集群是最多见的解决方案。因为MySQL的架构设计缘由,主备集群的解决方案虽然不完美,但也是其最好的解决方案了。但其中存在的可用性隐患,倒是DBA和资深用户的心里无奈。网络
MySQL的主备集群方案,对于大多数应用系统能够知足基本的可用性要求了,若是要求更高的话,只能去选择商业数据库,而商业数据库的成本却又难以承受。到底存在什么问题呢?架构
熟悉MySQL的都知道,MySQL是采用binlog来搭建主备集群的,主机上的事务提交时,经过两阶段事务将binlog写入到磁盘,而后再将其发送给备机,备机收到后重放日志,以完成事务与主机的同步。以下图所示架构设计
显而易见,主备之间会存在一些延迟,当主机已经将事务提交后,备机也许尚未收到这条事务的binlog,此时在备机上这条事务其实的缺失的。为了尽量下降主备延迟,后来MySQL又设计了Semi-Sync,以下图所示:设计