我正在学习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/