微信开源PhxSQL背后:强一致高可用分布式数据库的设计和实现哲学(2)
严格一致性只是一个理论模型.根据相对论,由于信息传播的速度不可能高于光速,严格一致性在实际中几乎无法实现.线性一致性的理论定义很复杂,不太严谨直观地讲,就是任何一个客户端都可以读到别的客户端写入的最新内容.这也是大家通常理解的强一致. Zookeeper的强一致指“线性一致性”.高可用是说只要多于一半机器工作和互联即可在保证线性一致性的质量下正常工作.PhxSQL的强一致是指“线性一致性”,高可用是指只要多于一半机器工作和互联即可在保证线性一致性质量下工作.即, PhxSQL提供和Zookeeper相同的强一致性和高可用性! PhxSQL提供和Zookeeper相同的强一致性和高可用性! PhxSQL提供和Zookeeper相同的强一致性和高可用性! 重要事情说三遍:).大家可以把PhxSQL当Zookeeper使用,例如用来选主! 在数据库事务隔离方面,PhxSQL支持最高级别的serializable.在性能方面,PhxSQL提供明显优于MySQL半同步的写性能和几乎相同的读性能[22]. 细心的读者可能注意到,和通常的“高可用、强一致”说法顺序相反,这个小节的标题中,“强一致”有意放在了“高可用”的前面.在这里需要澄清一个误区.当谈到高可用时,有时会有意无意忽略或者降低一致性. 严格意义上来讲,可用性和一致性必须一块讨论,满足一致性要求前提下的可用性才有意义.打个不严谨的比方,一致性就像汽车的“安全性”,可用性就是汽车的“可用性”.如果一辆车号称“可用性”很好,可以连续工作10年,但从来不提“安全性”,那么这辆车的品质是值得怀疑的. 3、为什么要做PhxSQL?虽然有很多NoSQL、NewSQL系统、以及多主多写MySQL集群、支持分库分表的MySQL集群,MySQL传统主备同步方案仍然具备很多新系统难以企及的优点.MySQL主备在主机上支持完整SQL、全局事务、以repeatable read和serializable级别的事务隔离,在金融、帐号等关键业务中有巨大的价值.同时,现有复杂MySQL应用迁移到新的非兼容系统成本也很高. 但是MySQL传统主备方案也有其缺点.最明显的就是主机故障后的自动换主和新旧主数据一致性(以及衍生的换主后主备一致性、各个备机之间一致性,这里就不详加讨论了),即所谓的一致性和可用性. 为了解决这个问题,有传统流派:用Zookeeper、etcd、或者其它第三方来检测心跳、选主、和切换.改造MySQL client让其能感知新的主机.或者为了能让传统MySQL client不加修改就能感知新的主机,部署MySQL代理服务器,让其将连到自身的MySQL client请求透明转发给新的主机. 为了减少主备间数据的落后,从而降低旧主机故障、某台备机被提升成新主机时,新旧主机之间、新主机和其它备机之间的差异,很多方案在主备同步机制上做了很多有益的工作. 例如semi-sync等待多数派备机应答,通过优化线程和网络、主备多通道、备机并行执行binlog流水等尽量减少主备之间差异.如果主备间任何时刻都完全一致,那么任何时刻换主都是强一致的.这句话的另外一个意思是,如果无法保证主备间任何时刻完全一致,那么当有持续不断的更新时,任何时刻的换主都是无法保证强一致的. 传统流派另外一个分支就是将MySQL本地磁盘换成更高可靠性的SAN,当MySQL主机故障时,将SAN挂接到备机上提供服务.而当SAN故障时怎么办?当需要跨机房部署时怎么办? 意识到传统流派的局限性,新出了Galera和MySQL Group Replication等.除了宣称提供强一致性和高可用性外,还支持master-master多点写入等诱人新特性. 世界上目前已知的经过理论证明和实际检验的一致性算法屈指可数:两阶段提交two-phase commit (2PC)、Paxos、Raft、Zookeeper Atomic Broadcast (ZAB)、Viewstamped Replication等.2PC虽然可以保证一致性,但在主机故障时无法工作,存在可用性问题. 目前被工业界广泛认可和应用的是Paxos和Raft,2PC一般在前两者帮助选主下使用.这里的一个小建议就是:如果一个分布式系统宣称支持线性一致性级别的强一致和高可用,请先检查它使用的一致性算法.如果是新算法,请检查它的形式化证明或者逻辑证明. 因此,为支持线性一致性和高可用,同时完全兼容MySQL,我们在MySQL的基础上应用Paxos,设计和开发了PhxSQL. 4、PhxSQL的设计原则是什么?从实际需求出发,除了前述强一致、高可用、完全兼容MySQL这3个明显、必须的设计原则,我们还提出以下3原则. 1、简单可逻辑证明的一致性模型 这可能是明显区别PhxSQL和其它方案的一个特点.一个经过逻辑证明的模型才是可靠的,一个建立在可靠模型基础上的系统也才是可信赖的.PhxSQL一致性模型建立在两个前提上:
在这两个前提下,PhxSQL的一致性模型通过Paxos,使得主机写入Paxos的binlog流水与备机从Paxos里拉取的binlog流水一致,从而保证MySQL数据的一致性.详细证明过程我们将另外提供.模型和证明过程都很简单,大家在读完源码后也可以尝试:). (编辑:ASP站长网) |