Hazelcast(Java)和ETCD(golang)有何不同/相似之处?

17
现在我们正在构建一个实时分析系统,它应该是高度分布式的。我们计划使用分布式锁和计数器来确保数据一致性,并且我们需要一种分布式映射来知道哪个客户端连接到了哪个服务器。 我之前没有分布式系统的经验,但是我认为我们有两个选择:
  1. Java+Hazelcast
  2. Golang+ETCD
但是在此背景下,每个选项的优缺点是什么呢?

虽然这不是此处讨论的主题,但我要指出 etdc 和 hazelcast 是非常不同的东西,比较它们可能没有什么用处。 - JimB
嗨,JimB!我是一个新手,对这些技术不太了解,所以我想问一下它们之间的区别/相似之处,如果你知道答案,能否请与我分享你的知识。谢谢! - The Architect
3
我不知道为什么人们要对这个进行负投票。在问答论坛上,对分布式系统缺乏了解不应该被负投票。 - kuujo
2个回答

44
Hazelcast和etcd是两个非常不同的系统。原因在于CAP定理
CAP定理规定,没有分布式系统可以同时具备一致性、可用性和分区容错性。分布式系统通常更接近于CA或CP。Hazelcast是一个AP系统,而etcd(作为Raft实现)是CP。因此,您需要在一致性和可用性/性能之间做出选择。
总的来说,相对于Raft和etcd,Hazelcast将更具有性能并能够处理更多的故障,但代价是可能会出现数据丢失或一致性问题。Hazelcast的工作方式是对数据进行分区,并将数据的部分存储在不同的节点上。因此,在5个节点的集群中,键“foo”可能存储在节点1和2上,而bar可能存储在节点3和4上。您可以通过Hazelcast和映射配置来控制Hazelcast复制数据的节点数。但是,在网络或其他故障期间,存在一些风险,您可能会看到旧数据甚至在Hazelcast中丢失数据。

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

一致性问题可能与基本键值存储有关,也可能与锁有关。如果您希望在整个集群中保持锁的一致性 - 这意味着即使在网络或其他故障期间只有一个节点可以持有锁 - 不要使用Hazelcast。因为Hazelcast为了可用性而牺牲了一致性(再次见CAP定理),完全有可能出现网络故障导致两个节点认为某个锁没有被占用。

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

实际上,您需要考虑在数据库中寻找什么,并去寻找它。 CP和AP数据存储的用例大不相同。如果您想要一致性来存储少量状态、一致的锁、领导选举和其他协调工具,请使用像ZooKeeper或Consul这样的CP系统。如果您想要高可用性和性能,但可能会牺牲一致性,请使用Hazelcast、Cassandra或Riak。

来源: 我是 Raft实现 的作者


非常感谢,您的答案是我深入了解的好起点。 - The Architect
我相信在这里(以及大多数地方)都更喜欢非移动链接(en.wikipedia.org vs. en.m.wikipedia.org)。前者总是会将人们带到移动版本,而后者将根据客户端设置等要求重定向到移动版本,但会将其他人发送到完整页面。 - Dave C
非常清晰的解释。非常感谢! - krish7919
4
最近的发展有些澄清:从Hazelcast IMDG 3.12版本开始,Hazelcast现在提供了基于Raft一致性算法和CAP原则的CP(一致性与分区容错性)的线性化和分布式Java并发API实现,例如Lock,Semaphore等。 - Basri Kahveci

9
尽管这个问题现在已经超过3年了,但我想告诉后来的读者,截至3.12版,Hazelcast具有基于Raft的CP子系统(用于其原子和并发API)。 未来计划将CP推广到更多的Hazelcast数据结构中。 这使得Hazelcast用户真正可以在AP和CP之间进行选择,并允许用户将Hazelcast应用于以前由etcd和Zookeeper等系统处理的新用例。
您可以在此处阅读更多内容...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接