java - 使用 Zookeeper 而不仅仅是数据库来管理分布式系统的目的是什么?

标签 java apache-zookeeper distributed-computing

我正在学习Zookeeper,目前还不明白用它来做数据库解决不了的分布式系统的目的。

我读过的用例是通过让 Zookeeper 客户端读取/写入 Zookeeper 服务器来为分布式系统实现锁定、屏障等。 不能通过读/写数据库来实现同样的功能吗?

例如,我的书描述了使用 Zookeeper 实现锁的方法是让想要获取锁的 Zookeeper 客户端创建一个 ephemeral znode,并在 lock 下设置顺序标志-节点。然后锁由其子 znode 具有最低序列号的客户端拥有。

本书中的所有其他 Zookeeper 示例同样只是使用它来存储/检索值。

Zookeeper 与数据库/任何存储的唯一区别似乎是“观察者”概念。但这可以使用其他东西来构建。

我知道我对 Zookeeper 的简化看法是一种误解。那么有人能告诉我 Zookeeper 真正提供了哪些数据库/自定义观察器无法提供的功能吗?

最佳答案

Can’t the same be achieved by read/write to databases?

从理论上讲,是的,这是可能的,但通常,将数据库用于要求苛刻的分布式协调用例并不是一个好主意。我已经看到微服务使用关系数据库来管理分布式锁,结果非常糟糕(例如,数据库中有数千个死锁),这反过来导致 DBA 与开发人员的关系不佳:-)

Zookeeper 具有一些关键特性,使其成为管理应用程序元数据

的理想选择
  • 可以通过向集成添加新节点来水平扩展
  • 保证数据在特定时间范围内最终一致。如果客户需要,可以以更高的成本获得严格的一致性(Zookeeper 是 CAP 术语中的 CP 系统)
  • 顺序保证——所有客户端都保证能够按照写入的顺序读取数据

上述所有内容都可以通过数据库实现,但需要应用程序客户端付出巨大努力。 监视临时节点 也可以通过使用触发器、超时等技术由数据库实现。但它们通常被认为是低效的或反模式的。

关系数据库提供强大的事务保证,这通常需要一定的成本,但通常不需要管理应用程序元数据。因此,寻找更专业的解决方案(例如 Zookeeper 或 Chubby)是有意义的。

此外,Zookeeper 将其所有数据存储在内存中(这限制了它的用例),从而实现了高性能读取。大多数数据库通常不是这种情况。

关于java - 使用 Zookeeper 而不仅仅是数据库来管理分布式系统的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36312640/

相关文章:

java - 如何让我的扣除仅在用户选择时才起作用?

java - Jooq (SQLite) 未插入

docker - Kafka无法解析Zookeper的DNS名称

hadoop - 使用hadoop将文件从网格复制到本地时出现的问题

matlab - 如何将Matlab与hadoop集成

JAVA - 静态变量在程序重新启动时重置

Java套接字: open connections from server to client

tomcat - Solr 连接由对等方重置

ubuntu-12.04 - Zookeeper 合奏没有出现

java - CORBA:服务器作为客户端