ZooKeeper是面向数据中心的高可用协调服务。它起源于 Hadoop 项目。可以在它之上实现锁定、故障转移、领导者选举、组成员资格和其他协调问题。ZooKeeper 有什么替代品吗?(当然是免费软件)
11 回答
我广泛研究了 Zookeeper/ Curator、Eureka、etcd和 consul。如果您在 Java 世界中,Zookeeper/Curator 和 Eureka 在许多方面都是最完善和最容易集成的。Etcd非常酷且非常灵活,但它实际上只是一个 HA 密钥存储,因此您必须编写大量代码才能将其变成一个固执己见的服务发现系统。
领事(对我来说)是两全其美的。它是一个写在serf之上的固执己见的服务发现系统,使用 raft 进行集群共识和 gossip 进行通信。它使用记录良好的 REST api 公开发现/注册端点,还允许您使用 DNS SRV 记录发现服务,并使用配置注册服务(即,您可以注册无法与客户端集成的数据库或应用程序,或者如果您只是想让您的服务发现与您的应用程序分离)
我写了一篇关于 consul 的博客文章,您可以在其中了解更多信息并浏览我的“试用”演示
如果您想了解更多关于自定义代码可能是什么样子的信息,我还讨论了使用 etcd 和 docker 的服务发现。
最后一件事!etcd 和 consul 是用 go 编写的,因此维护它们比 zookeeper 之类的 java 解决方案要容易得多。您只需要 consul / etcd 二进制文件。没有依赖项,没有链接库,没有 jvm。
有一个非常有前途的 ZooKeeper 替代方案,称为etcd (github.com/coreos/etcd),由 CoreOS 团队编写。与 Doozerd 不同,etcd 正在积极开发中。
刚刚发现Accord (C) 和OpenReplica/ConCoord (Python) 可能是有趣的解决方案
[编辑] 以 Vagrant 和 Packer 闻名的 Hashicorp 团队正在制作名为Serf的“用于服务发现和编排的去中心化解决方案” 。
[EDIT2] Hashicorp 再次来袭!他们刚刚发布了Consul,建立在 Serf 之上。宣传语:“一种服务发现和配置解决方案,完全分布式,高度可用,可扩展到跨多个数据中心的数千个节点和服务”。
是的,还有Doozerd (https://github.com/ha/doozerd)。好好看看,它是 Heroku 开发的一个很好的、单一的二进制分布式协调服务。使用 java/python/ruby/node 的绑定/库。很容易上手和玩耍。
我的研究小组的OpenReplica是用于数据中心的高度可用的 FOSS 协调服务。它可用于实现锁定、故障转移、领导者选举、组成员资格和其他协调服务。它在两个关键方面与 ZooKeeper 不同:
它使用面向对象的 API。这使得编写协调服务变得更加容易。OpenReplica 的同步代码看起来与它的教科书对应物一模一样;无需像 ZooKeeper 和 Chubby 那样掌握文件和基于 upcall 的 API。
它启用对副本集的动态成员资格更新。不需要静态配置文件。该系统集成到 DNS(权威、OpenReplica 的从属设备或 Amazon Route 53)。
我们积极支持该系统,如果您有其他问题,请随时告诉我们。
我发现了 Zookeeper、etcd 和 Doozer 的比较:http: //devo.ps/blog/zookeeper-vs-doozer-vs-etcd/
Serf (serfdom.io) 也是一个不错的解决方案,因为它很简单!但是您必须考虑,SERF 只是一个集群管理器,它使您能够将自定义事件发送到所有集群节点。很好,但是您必须编写自己的 shell 脚本(也称为事件)。请参阅此示例:“ https://www.digitalocean.com/community/articles/how-to-set-up-a-serf-cluster-on-several-ubuntu-vps ”
优点是,您将获得一个非常简单的集群管理器,并且您可以将它与您最喜欢的配置、部署或持续集成工具结合起来。
有不同的工具可以针对不同的工程权衡进行优化。
- ZooKeeper略微扩展以进行读取;与许多观察者一起写入可能会很慢。它已被证明并拥有相当大的社区。
- Accord对于写入密集型用途似乎很有趣,但是典型的用例已经有特定领域的解决方案(即日志记录、遥测)。
其他的有些有趣,但通常未经证实。如果打算用于生产用途,请不要弄错。
github 上有一个名为 Noah 的项目,看起来很有趣,它说它“松散地基于 Apache ZooKeeper” https://github.com/lusis/Noah,其中 REST 支持是一个关键特性(ZK 将其作为一个贡献/选项而不是比内置)。
看起来Corosync也像 ZooKeeper。
我知道这篇文章已经很老了,但是有人正在寻找所有可能的替代方案,我还想推荐 JGroups 库,它足够成熟,可以在生产环境中使用。我已在我的一个项目中成功使用它,主要用于分布式协调和集群之间的消息共享。除了其灵活的架构之外,它还支持 AWS 支持,您可以在其中自定义其堆栈以获得所需的内容。我建议你看看它