Zookeeper / Chubby -vs- MySql NDB

时间:2010-02-21 18:59:14

标签: java mysql replication database-replication apache-zookeeper

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

我只是想知道,Zookeeper或像分布式锁定系统这样的Chubby带来的具体优势是什么。基本上我只是想知道为什么我不能只使用MySQL NDB集群。我一直听说MySQL有很多复制问题。我希望有一些关于这个主题的更多经验可能会对它有所了解。

提前致谢..

简单列出我的要求:

  • 我有一个同质的分布式系统。
  • 我需要一些在所有节点上保持一致状态的方法。
  • 我的系统公开了一项服务,与客户的互动将导致我的系统集体状态发生一些变化。
  • 高可用性是一个目标,因此关闭的节点不得影响服务。
  • 我希望系统至少服务1000 req / sec。
  • 我希望系统的集体状态在大小上有限(基本上插入/删除将是暂时的......但在稳定状态下,我希望有大量的更新和读取)

2 个答案:

答案 0 :(得分:16)

这取决于您管理的数据类型以及您的目标规模和容错能力。

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

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

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

因此,如果您需要管理和响应动态配置,检测故障,选举领导等,ZooKeeper就是您所需要的。如果您需要存储大量数据,或者需要关系模型来存储该数据,那么MySQL是一个更好的选择。

答案 1 :(得分:11)

使用Innodb的MySQL提供了一个很好的通用解决方案,并且可能很容易在不太昂贵的硬件上满足您的性能要求。它可以在具有合适磁盘的双四核盒上轻松处理每秒数千次更新。内置的异步复制将为您提供满足可用性要求的大部分方法 - 但如果主要数据失败,您可能会丢失几秒钟的数据。修复主数据库时,某些丢失的数据可能是可恢复的,或者可以从应用程序日志中恢复:是否可以容忍这取决于系统的工作方式。一个损耗较小但速度较慢的替代方案是使用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知之甚少。希望其他人可以了解这些方面。