带有 Innodb 的 MySQL 提供了一个很好的通用解决方案,并且可能会在不太昂贵的硬件上很容易地满足您的性能要求。它可以在具有良好磁盘的双四核机箱上轻松处理每秒数千次更新。内置的异步复制可以满足您的可用性要求,但如果主数据库发生故障,您可能会丢失几秒钟的数据。这些丢失的数据中的一些可能在修复主数据库时可以恢复,或者可以从您的应用程序日志中恢复:您是否可以容忍这种情况取决于您的系统如何工作。一种损失较小但速度较慢的替代方法是使用 MySQL Innodb 和主单元和故障转移单元之间的共享磁盘:在这种情况下,当主节点发生故障且没有数据丢失时,故障转移单元将接管磁盘——只要主节点没有发生某种磁盘灾难。如果共享磁盘不可用,则可以使用 DRBD 通过在写入磁盘块时将它们同步复制到故障转移单元来模拟这种情况:这可能会对性能产生影响。
使用 Innodb 和上述复制解决方案之一会将您的数据复制到故障转移单元,这在很大程度上解决了恢复问题,但需要额外的胶水来重新配置系统以使故障转移单元联机。这通常使用 RHCS 或 Pacemaker 或 Heartbeat(在 Linux 上)或 Windows 的 MS Cluster 等集群系统执行。这些系统是工具包,您需要亲自动手将它们构建成适合您环境的解决方案。但是,对于所有这些系统,在系统注意到主节点发生故障并重新配置系统以使用故障转移单元时,都会有一个短暂的中断期。这可能是几十秒:试图减少这可能会使您的故障检测系统过于敏感,
向上移动,MySQL NDB 旨在减少恢复时间,并在一定程度上帮助扩展您的数据库以提高性能。然而,MySQL NDB 的适用范围相当狭窄。系统将关系数据库映射到分布式哈希表,因此对于涉及跨表的多个连接的复杂查询,MySQL 组件和存储组件(NDB 节点)之间存在相当多的流量,使得复杂查询运行缓慢。但是,适合的查询确实运行得非常快。我已经看过这个产品几次了,但是我现有的数据库太复杂了,无法很好地适应,需要进行大量的重新设计才能获得良好的性能。但是,如果您正处于新系统的设计阶段,如果您在进行过程中能够牢记其约束,那么 NDB 会很好地工作。还,
甚至 MySQL NDB 也无法应对整个站点丢失 - 数据中心火灾、管理错误等。在这种情况下,您通常需要另一个复制流运行到 DR 站点。这通常是异步完成的,因此站点间链接上的连接中断不会使您的整个数据库停滞。这是 NDB 的地理复制选项(在付费电信版本中)提供的,但我认为 MySQL 5.1 及更高版本可以本机提供此功能。
不幸的是,我对 Zookeeper 和 Chubby 知之甚少。希望其他人可以了解这些方面。