微信开源PhxSQL背后:强一致高可用分布式数据库的设计和实现哲学(3)
但即使模型正确,PhxSQL正确实现了这个模型吗?用通俗的话讲,没有bug.码农都知道这是个巨大的挑战.从一个算法和模型到正确的实现之间差距是巨大的.例如,正确实现Paxos挑战就很大.为了尽量减少bug,我们选择了简单和易理解同时应用广泛的Paxos作为一致性协议. 为了实现一个“生产”级别的Paxos,三位主要码农各自独立实现了Paxos,在各自测试完正确性后,三套Paxos之间作为一组Paxos的独立节点互操作检验正确性,最后再集体实现一个发行版本PhxPaxos!除了单元测试、系统测试外,测试环境还随机高频率独立重启机器、对网络包进行乱序、延迟、重复等以对系统进行充分测试. 有读者可能问,Paxos慢且网络延迟大,PhxSQL为什么不实现一个“优化”版?Paxos有各种版本,例如Fast Paxos、EPaxos.但这些都是Paxos,遵循Paxos的基本操作,所作的改变,都做了严格的形式化或者逻辑证明. PhxPaxos严格遵照Paxos算法实现,没有做任何改变或者“优化”.PhxPaxos的正常写操作的网络延迟是一个网络RTT,已经是任何算法理论上能达到的最快速度. 现在,对于PhxSQL来说,切换主机是一件很平常和容易的操作,就像往MySQL里插入一条数据一样平常和容易. 2、最小侵入MySQL原则 MySQL是个巨大的快速演进的生态系统,保证PhxSQL中的MySQL与官方MySQL的兼容性与可升级性是必须的.这使得MySQL应用可以快速迁移到和运行在PhxSQL上.这也使得PhxSQL可以迅速响应官方MySQL的升级,将PhxSQL中的旧版本MySQL升级到新的官方MySQL,从而获得新的特性、性能、稳定性、和安全性提升. 这就要求PhxSQL中的MySQL对官方MySQL改动尽量少.实际上,PhxSQL版MySQL只更改了三个小地方:修改了binlog插件接口中一个函数的参数;在MySQL启动时新增了一个插件函数用于检查MySQL本地的binlog文件,在MySQL协议中透传了真正的客户端IP以兼容授权功能(如果应用不需要可以不修改). 这几个改动是如此小,且涉及的是几乎稳定不变的流程,使得PhxSQL中MySQL跟随官方MySQL升级可以无缝完成.实际上,我们正和MySQL社区沟通,希望把这几处修改并入官方版本,从而使得PhxSQL以后可以完全使用官方版本MySQL,也使得更多人可以方便采用PhxSQL. (a) (b) 图 2:PhxSQL对MySQL的关键修改.(a)是MySQL.(b)是PhxSQL中的MySQL.PhxSQL修改了after_flush这个函数的参数,新增了在MySQL启动时调用的before_recovery这个函数. 也正是因为这个原因,我们没有因为可以减少模块个数而把PhxSQLProxy、PhxBinlogSvr放到MySQL进程内.为了保证和应用最广泛的MySQL单机版兼容,也没有在事务层和存储层介入或修改. 3、简单的架构、部署、和运维 在满足要求的前提下,简单的架构有很多好处,例如开发、维护、诊断、维护、可靠性等等都变得容易.PhxSQL只有3+1个模块.PhxSQL中的MySQL是必须的.PhxBinlogSvr负责全局binlog存储和同步、选主、集群成员管理等关键功能. 在很多MySQL主备集群方案中,使用Zookeeper、etcd、心跳检测、Agent等承担选主的功能.PhxSQLProxy则作为传统MySQL client访问PhxSQL中MySQL服务的代理,使得PhxSQL的换主操作对于传统MySQL client透明. 在其它集群方案中,一般也是通过代理MySQL proxy、或者虚拟网关VIP,向传统MySQL client屏蔽集群的换主操作,提供透明访问.可选模块是PhxSQL client lib,它修改了MySQL client库中的连接初始化函数,允许传入一个集群的PhxSQLProxy列表,从而在一个PhxSQLProxy没有响应时、自动访问其它可用PhxSQLProxy,进一步提高可用性.开发人员可以直接链接PhxSQL client lib. PhxSQL的部署和运维都很简单.在部署时,只要在目标机各自装好PhxSQL,在配置中指定集群的机器的IP列表,PhxSQL即可运行.换主这个操作已经从运维层面转移到PhxSQL正常的工作流程. 通常MySQL集群中换主后可能需要人肉检查数据一致性、人肉“闪回”(这可能违反一致性保证,导致“幻读”);无法”闪回“导致必须清除某台MySQL,重新拉取数据备份,和追流水等.这些耗时、繁重、易错的操作在PhxSQL中已经完全不需要. 至于热升级和热变更集群成员更简单.PhxSQL支持rolling-update,可以逐步升级每台机器.变更集群成员是指往集群添加机器、撤出机器、和替换机器(原子操作).在保证强一致和高可用前提下,热变更(不停服变更)是非常困难的. PhxSQL通过在Paxos中实现成员变更解决了这个难题.PhxSQL提供了一个变更操作命令.当在新机器安装和启动PhxSQL后(要求MySQL已经加载一份较新的数据备份),可以在现有集群中一键将新机器引入、剔除一台旧机器、或者同时做两者.这三种操作都是原子操作!新机器会自动追流水.想想看,相当于Zookeeper支持热变更成员,是不是很令人激动的特性? PhxSQL由于在同步层使用Paxos,天然支持多数据中心、多机房部署,两地三中心这种部署更是不在话下.对于PhxSQL来说,多数据中心和多机房部署与机房内部署没有区别.PhxSQL的性能取决于多数派机器之间的网络延迟. 5、为什么要开源?作为热爱技术的码农,我们相信开源的技术可以使得这个世界更美好.从我们日常开发使用的Emacs/Vim、GCC、GDB,间接为大众提供社交、电子商务、信息服务的Linux、Apache、MySQL、PHP,到大众每日使用来沟通和娱乐的Android等,开源是整个互联网的基石,为全世界提供许多关键不可或缺的基础服务.我们充分享受了开源带来的技术进步、经济发展、和社会前进,我们也希望开源的PhxSQL可以回馈社区,帮助更多有需要的人. (编辑:ASP站长网) |