现在我们正在构建一个实时分析系统,它应该是高度分布式的。我们计划使用分布式锁和计数器来确保数据一致性,并且我们需要一种分布式映射来知道哪个客户端连接到了哪个服务器。
我之前没有分布式系统的经验,但是我认为我们有两个选择:
- Java+Hazelcast
- Golang+ETCD
另外,Raft和etcd是一个单领导者高度一致性的系统,将数据存储在所有节点上。这意味着它不适合存储大量状态。但即使在网络故障期间,etcd也可以保证数据的一致性。换句话说,你永远不会看到旧的/过期的数据。但是这是有代价的。CP系统要求集群中大多数节点正常运行。
一致性问题可能与基本键值存储有关,也可能与锁有关。如果您希望在整个集群中保持锁的一致性 - 这意味着即使在网络或其他故障期间只有一个节点可以持有锁 - 不要使用Hazelcast。因为Hazelcast为了可用性而牺牲了一致性(再次见CAP定理),完全有可能出现网络故障导致两个节点认为某个锁没有被占用。
另外,Raft保证在网络故障期间只有一个节点将保持etcd集群的领导地位,因此所有决策都是通过该节点进行的。这意味着etcd可以保证其始终具有对集群状态的一致视图,并确保像锁这样的东西只能被单个进程获取。
实际上,您需要考虑在数据库中寻找什么,并去寻找它。 CP和AP数据存储的用例大不相同。如果您想要一致性来存储少量状态、一致的锁、领导选举和其他协调工具,请使用像ZooKeeper或Consul这样的CP系统。如果您想要高可用性和性能,但可能会牺牲一致性,请使用Hazelcast、Cassandra或Riak。
来源: 我是 Raft实现 的作者
https://hazelcast.com/blog/hazelcast-imdg-3-12-beta-is-released/