Zookeeper/Chubby -vs- MySql NDB

我最近一直在阅读Paxos论文,FLP定理等,并为一个项目评估Apache Zookeeper。我也一直在通过Chubby(谷歌的分布式锁定服务)以及在线提供的各种文献。我对 Zookeeper 的基本用例是为分布式系统实现复制和一般协调。

我只是想知道,Zookeeper或类似胖乎乎的分布式锁定系统带来了什么具体优势。基本上,我只是想知道为什么我不能只使用MySQL NDB集群。我一直听说MySQL有很多复制问题。我希望一些在这个问题上有更多经验的人可以对此有所了解。

提前致谢..

我的要求的简单列表:

  • 我有一个同构的分布式系统。
  • 我需要一些方法来维护所有节点上的一致状态。
  • 我的系统公开了一个服务,与客户端的交互将导致我的系统的整体状态发生一些变化。
  • 高可用性是一个目标,因此节点出现故障不得影响服务。
  • 我希望系统至少以1000 req/sec的速度提供服务。
  • 我希望系统的集体状态在大小上是有限制的(基本上插入/删除将是暂时的......但在稳定状态下,我期望有很多更新和阅读)

答案 1

这取决于您正在管理的数据类型以及您要实现的规模和容错能力。

我可以从ZooKeeper的角度来回答。在开始之前,我应该提到ZooKeeper不是胖乎乎的克隆人。具体来说,它不直接做锁。它在设计时还考虑了不同的订购和性能要求。

在 ZooKeeper 中,系统状态的整个副本都驻留在内存中。更改使用原子广播协议进行复制,并在处理之前由大多数 ZooKeeper 服务器同步到磁盘(使用更改日志)。因此,ZooKeeper具有确定性性能,只要大多数服务器都处于运行状态,就可以容忍故障。即使发生大中断(例如电源故障),只要大多数服务器重新联机,系统状态就会保留。存储的信息是ZooKeeper通常被认为是系统的基本事实,因此这种一致性和耐用性保证非常重要。

ZooKeeper为您提供的其他功能与监控动态协调状态有关。临时节点允许您轻松执行故障检测和组成员身份。订购保证允许您进行领导者选举和客户端锁定。最后,监视允许您监视系统状态并快速响应系统状态的更改。

因此,如果您需要管理和响应动态配置,检测故障,选举领导者等。ZooKeeper是你正在寻找的。如果您需要存储大量数据,或者需要为该数据创建关系模型,MySQL是一个更好的选择。


答案 2

MySQL与Innodb提供了一个很好的通用解决方案,并且可能会在不太昂贵的硬件上很容易地满足您的性能要求。它可以轻松地在具有良好磁盘的双四核盒子上每秒处理数千次更新。内置的异步复制将在很大程度上满足您的可用性要求 - 但如果主数据库发生故障,您可能会丢失几秒钟的数据。修复主数据库时,其中一些丢失的数据可能是可恢复的,或者可以从应用程序日志中恢复:您是否可以容忍这取决于系统的工作方式。一种损耗较小但速度较慢的替代方案是将MySQL Innodb与主磁盘和故障转移单元之间的共享磁盘一起使用:在这种情况下,故障转移单元将在主设备发生故障时接管磁盘而不会丢失数据 - 只要主节点没有某种磁盘灾难。如果共享磁盘不可用,则可以使用 DRBD 通过在写入磁盘块时将磁盘块同步复制到故障转移单元来模拟此操作:这可能会对性能产生影响。

使用Innodb和上面的复制解决方案之一可以将您的数据复制到故障转移单元,这是解决恢复问题的很大一部分,但是需要额外的胶水来重新配置系统以使故障转移单元联机。这通常是使用集群系统执行的,如RHCS或Pacemaker或Heartbeat(在Linux上)或Windows的MS Cluster。这些系统是工具包,您只能亲自动手将它们构建成适合您环境的解决方案。但是,对于所有这些系统,当系统注意到主系统出现故障时,会有一个短暂的中断期,并将系统重新配置为使用故障切换单元。这可能是几十秒:尝试减少这种情况可能会使故障检测系统过于敏感,并且您可能会发现系统不必要地进行了故障转移。

向上移动,MySQL NDB旨在缩短恢复时间,并在一定程度上帮助扩展数据库以提高性能。但是,MySQL NDB的适用范围相当窄。系统将关系数据库映射到分布式哈希表,因此对于涉及跨表的多个联接的复杂查询,MySQL组件和存储组件(NDB节点)之间存在相当多的流量,使得复杂的查询运行缓慢。但是,适合的查询确实运行得非常快。我已经看过这个产品几次了,但我现有的数据库太复杂了,不适合,需要大量的重新设计才能获得良好的性能。但是,如果您处于新系统的设计阶段,那么如果您能够牢记其约束,则NDB将很好地工作。另外,您可能会发现您需要相当多的机器来提供良好的NDB解决方案:几个MySQL节点加上3个或更多NDB节点 - 尽管如果您的性能需求不是太极端,MySQL和NDB节点可以共存。

即使是MySQL NDB也无法应对整个站点的丢失 - 数据中心的火灾,管理错误等。在这种情况下,通常需要运行另一个到 DR 站点的复制流。这通常是异步完成的,以便站点间链接上的连接点不会使整个数据库停止。这是由NDB的地理复制选项(在付费电信版本中)提供的,但我认为MySQL 5.1及更高版本可以在本地提供此功能。

不幸的是,我对Zookeeper和Chubby知之甚少。希望其他人可以掌握这些方面。


推荐