我最近一直在阅读Paxos论文,FLP定理等,并为一个项目评估Apache Zookeeper。我也一直在通过Chubby(谷歌的分布式锁定服务)以及可在线获得的各种文献。我对Zookeeper的基本用法是为分布式系统实现复制和一般协调。
我只是想知道,Zookeeper或像分布式锁定系统这样的Chubby带来的具体优势是什么。基本上我只是想知道为什么我不能只使用MySQL NDB集群。我一直听说MySQL有很多复制问题。我希望有一些关于这个主题的更多经验可能会对它有所了解。
提前致谢..
简单列出我的要求:
答案 0 :(得分:16)
这取决于您管理的数据类型以及您的目标规模和容错能力。
我可以从ZooKeeper的角度回答。在开始之前我应该提到ZooKeeper不是Chubby克隆。具体来说,它不直接进行锁定。它的设计考虑了不同的订购和性能要求。
在ZooKeeper中,系统状态的整个副本是内存驻留。使用原子广播协议复制更改,并在处理之前由大多数ZooKeeper服务器同步到磁盘(使用更改日志)。因为这个ZooKeeper具有确定性的性能,只要大多数服务器启动就可以容忍故障。即使有很大的中断,例如电源故障,只要大多数服务器重新上线,系统状态就会得到保留。存储的信息是ZooKeeper,通常被认为是系统的基本事实,因此这种一致性和持久性保证非常重要。
ZooKeeper提供的其他功能与监视动态协调状态有关。短暂节点允许您轻松进行故障检测和组成员身份。订购保证允许您进行领导者选举和客户端锁定。最后,手表允许您监控系统状态并快速响应系统状态的变化。
因此,如果您需要管理和响应动态配置,检测故障,选举领导等,ZooKeeper就是您所需要的。如果您需要存储大量数据,或者需要关系模型来存储该数据,那么MySQL是一个更好的选择。
答案 1 :(得分:11)
使用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知之甚少。希望其他人可以了解这些方面。