Hazelcast(Java)和 ETCD(golang)differences/similarities?

Hazelcast (Java) and ETCD (golang) differences/similarities?

现在我们构建一个实时分析系统,它应该是高度分布式的。我们计划使用分布式锁和计数器来确保数据的一致性,我们需要某种分布式映射来知道哪个客户端连接到哪个服务器。 我以前没有分布式系统的经验,但我认为我们有两个选择:

  1. Java+Hazelcast

  2. Golang+ETCD

但是在主题上下文中彼此的 pros/cons 是什么?

Hazelcast 和 etcd 是两个截然不同的系统。原因是 CAP theorem.

CAP 定理指出,任何分布式系统都不可能具有一致性、可用性和分区容错性。分布式系统通常更接近 CA 或 CP。 Hazelcast 是一个 AP 系统,而 etcd(作为 Raft 实现)是 CP。因此,您的选择是在一致性和 availability/performance.

之间

一般来说,Hazelcast 的性能会比 Raft 和 etcd 高得多,并且能够处理更多的故障,但是以潜在的数据丢失或一致性问题为代价。 Hazelcast 的工作方式是对数据进行分区并将数据片段存储在不同的节点上。因此,在一个 5 节点的集群中,key "foo" 可能存储在节点 1 和 2 上,而 bar 可能存储在节点 3 和 4 上。您可以通过 Hazelcast 控制 Hazelcast 将数据复制到的节点数和地图配置。但是,在网络或其他故障期间,您可能会看到旧数据甚至丢失 Hazelcast 中的数据。

或者,Raft和etcd是一个单领导的高度一致的系统,将数据存储在所有节点上。这意味着它不适合存储大量状态。但即使在网络故障期间,etcd 也可以保证您的数据保持一致。换句话说,您永远不会看到 old/stale 数据。但这是有代价的。 CP 系统要求大多数集群都处于活动状态才能正常运行。

一致性问题可能与基本键值存储相关,也可能不相关,但它可能与锁极其相关。如果您希望您的锁在整个集群中保持一致——这意味着即使在网络或其他故障期间也只有一个节点可以持有锁——请不要使用Hazelcast。因为 Hazelcast 牺牲了一致性以支持可用性(再次参见 CAP 定理),网络故障完全有可能导致两个节点相信可以免费获取锁。

或者,Raft 保证在网络故障期间只有一个节点将保持 etcd 集群的领导者地位,因此所有决策都是通过该节点做出的。这意味着 etcd 可以保证它始终具有一致的集群状态视图,并且可以确保像锁这样的东西只能由单个进程获得。

真的,您需要考虑您要在数据库中寻找什么,然后去寻找它。 CP 和 AP 数据存储的用例有很大不同。如果您想要存储少量状态的一致性、一致的锁、领导者选举和其他协调工具,请使用 ZooKeeper 或 Consul 等 CP 系统。如果您希望以潜在的一致性成本获得高可用性和性能,请使用 Hazelcast 或 Cassandra 或 Riak。

来源:我是 a Raft implementation

的作者

虽然这个问题现在已经超过 3 年了,但我想通知后续读者,从 3.12 开始,Hazelcast 的原子和并发 API 有一个基于 CP 的子系统(基于 Raft)。计划在不久的将来将 CP 推广到更多的 Hazelcast 数据结构。让 Hazelcast 用户在 AP 和 CP 问题之间做出真正的选择,并允许用户将 Hazelcast 应用于以前由 etcd 和 Zookeeper 等系统处理的新用例。

您可以在此处阅读更多内容...

https://hazelcast.com/blog/hazelcast-imdg-3-12-beta-is-released/