1

假设典型 Web 服务的典型关注点分离:

  • 多个 Client-API 机器(Apache2 Web 服务器、Java/PHP、自定义代码)
  • Cassandra 存储集群
  • 每个 Cassandra 节点 5 台以上的客户端 API 机器

Cassandra 有哪些高可用性功能来确保 Client-API(自定义代码)的正常运行时间?

典型的解决方案包括:

  • 具有运行状况监控的内部负载均衡器(此处适用普通负载均衡器 HA)
  • 或客户端库中配置的多个备份节点 IP,以尝试随机或按顺序连接
  • 在应用程序代码中模拟客户端库处理(尝试多个节点,直到一个节点连接)

但是,我似乎找不到太多提及这一点,包括提及“最佳实践”或“这就是我所做的”。

具体来说,我目前正在学习 Cassandra,我有兴趣将其引入 Zend Framework (PHP) 项目,并想了解从多台 Client-API 机器到 Cassandra 的高可用性连接的最佳实践。

可以管理一次性故障,但由于单个故障节点导致的服务停机显然不理想。

此外,还解释了如何在 Cassandra 中在如上所述的高可用性环境中管理裂脑。

4

1 回答 1

1

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 已关闭,无法处理请求。如果其他副本没有死亡并且可以为请求提供服务,那么它将是成功的。暗示的放手将被写入副本/协调器节点。

于 2013-09-10T06:00:39.257 回答