Cassandra 在设计上支持容错/HA。 要理解这一点,请阅读Cassandra 中的提示切换和消息路由。
对于脑裂处理,您可能会考虑使用Cages java lib 来实现分布式同步功能/锁等。
来自Cassandra - 去中心化结构化存储系统:
Cassandra 使用复制来实现高可用性和持久性。每个数据项在 N 个主机上复制,其中 N 是“每个实例配置的复制因子”。每个键 k 都分配给一个协调器节点。协调器负责复制其范围内的数据项范围。除了本地存储其范围内的每个密钥外,协调器还在环中的 N-1 个节点上复制这些密钥。Cassandra 为客户端提供了各种数据需要复制方式的选项。Cassandra 在存在时提供持久性保证通过放宽仲裁要求来减少节点故障和网络分区。
如果客户端正在与集群中的随机节点(例如 node1)建立连接,则可能会出现以下情况:
读
[SUCCESS] node1 是 UP 并且也有请求的数据
[SUCCESS] node1 已启动并且没有请求的数据,因此充当协调节点并将请求路由到具有数据的副本,例如 node2。假设 node2 已启动并且可以为请求提供服务
[NODE DOWN] node1 已关闭并且有请求的数据。客户端收到 UnAvailableException 并可以连接到集群中的其他节点。如果需要服务于查询的最小副本可以响应,那么它将是成功的。
[REPLICA NODE DOWN] node1 已启动并且没有请求的数据,因此充当协调节点并将请求路由到具有数据的副本,例如 node2。假设 node2 已关闭,无法处理请求。如果其他副本没有死亡并且可以为请求提供服务,那么它将是成功的。如果副本在发送请求时已启动,但在引发 TimedOutException 后立即关闭。客户端可以连接到集群中的其他节点。
写
[SUCCESS] node1 是 UP 并且还假设存储请求的数据
[SUCCESS] node1 已启动并且没有请求的数据令牌范围(不负责存储该数据),因此充当协调节点并将请求路由到假设存储数据的副本节点 2。假设 node2 已启动并且可以为请求提供服务。
[NODE DOWN] node1 是 DOWN 并且还假设存储请求的数据。客户端收到 UnAvailableException 并可以连接到集群中的其他节点。由于主节点已关闭,提示的切换请求存储在副本中。
[REPLICA NODE DOWN] node1 已启动,并且没有请求的数据令牌范围(不负责存储该数据),因此充当协调节点并将请求路由到副本节点 2,该副本假设存储数据。假设 node2 已关闭,无法处理请求。如果其他副本没有死亡并且可以为请求提供服务,那么它将是成功的。暗示的放手将被写入副本/协调器节点。