现在我们构建了一个实时分析系统,它应该是高度分布式的。我们计划使用分布式锁和计数器来确保数据的一致性,并且我们需要某种分布式映射来知道哪个客户端连接到哪个服务器。我之前没有分布式系统方面的经验,但我认为我们有两个选择:
Java+Hazelcast
Golang+ETCD
但是在主题上下文中,彼此的优缺点是什么?
现在我们构建了一个实时分析系统,它应该是高度分布式的。我们计划使用分布式锁和计数器来确保数据的一致性,并且我们需要某种分布式映射来知道哪个客户端连接到哪个服务器。我之前没有分布式系统方面的经验,但我认为我们有两个选择:
Java+Hazelcast
Golang+ETCD
但是在主题上下文中,彼此的优缺点是什么?
Hazelcast 和 etcd 是两个非常不同的系统。原因是CAP定理。
CAP 定理指出,任何分布式系统都不可能具有一致性、可用性和分区容错性。分布式系统通常更接近 CA 或 CP。Hazelcast 是一个 AP 系统,而 etcd(作为 Raft 实现)是 CP。因此,您的选择是在一致性和可用性/性能之间。
一般来说,Hazelcast 将比 Raft 和 etcd 性能更高,并且能够处理更多的故障,但代价是潜在的数据丢失或一致性问题。Hazelcast 的工作方式是将数据分区并将数据片段存储在不同的节点上。因此,在一个 5 节点集群中,键“foo”可能存储在节点 1 和 2 上,而 bar 可能存储在节点 3 和 4 上。您可以通过 Hazelcast 和 map 控制 Hazelcast 将数据复制到的节点数配置。但是,在网络或其他故障期间,您可能会看到旧数据甚至丢失 Hazelcast 中的数据。
或者,Raft 和 etcd 是一个单领导者高度一致的系统,将数据存储在所有节点上。这意味着它不适合存储大量状态。但即使在网络故障期间,etcd 也可以保证您的数据保持一致。换句话说,您永远不会看到旧的/陈旧的数据。但这是有代价的。CP 系统要求大多数集群处于活动状态才能正常运行。
一致性问题可能与基本键值存储相关,也可能不相关,但它可能与锁极为相关。如果您希望您的锁在整个集群中保持一致——这意味着即使在网络或其他故障期间也只有一个节点可以持有锁——不要使用Hazelcast。因为 Hazelcast 牺牲了一致性以支持可用性(再次参见 CAP 定理),网络故障完全有可能导致两个节点相信可以免费获取锁。
或者,Raft 保证在网络故障期间只有一个节点将保持 etcd 集群的领导者,因此所有决策都通过该节点做出。这意味着 etcd 可以保证它始终拥有一致的集群状态视图,并且可以确保诸如锁之类的东西只能由单个进程获得。
确实,您需要考虑在数据库中要查找的内容并去寻找它。CP 和 AP 数据存储的用例大不相同。如果您希望存储少量状态、一致锁、领导选举和其他协调工具的一致性,请使用 ZooKeeper 或 Consul 等 CP 系统。如果您希望以潜在的一致性成本获得高可用性和性能,请使用 Hazelcast、Cassandra 或 Riak。
来源:我是一个 Raft 实现的作者
虽然这个问题现在已经超过 3 年了,但我想告诉后续读者,Hazelcast 从 3.12 开始有一个基于 CP 的子系统(基于 Raft),用于其原子和并发 API。有计划在不久的将来将 CP 推广到更多 Hazelcast 数据结构。让 Hazelcast 用户在 AP 和 CP 问题之间做出真正的选择,并允许用户将 Hazelcast 应用于以前由 etcd 和 Zookeeper 等系统处理的新用例。
你可以在这里阅读更多...
https://hazelcast.com/blog/hazelcast-imdg-3-12-beta-is-released/