Apache Cassandra High Availability



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

  • 多个客户端 API 机器(Apache2 Web Server、Java/PHP、自定义代码)
  • 卡桑德拉存储集群
  • 每个 Cassandra 节点 5+ 个客户端 API 机器

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

典型的解决方案包括:

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

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

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

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

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

Cassandra在设计上支持容错/HA。 要理解这一点,请阅读 Cassandra 中的提示切换和消息路由

对于裂脑处理,您可以考虑使用 Cages java lib 来实现分布式同步功能/锁等。

来自Cassandra - 一个分散的结构化存储系统

Cassandra 使用复制来实现高可用性和持久性。每个数据项在 N 个主机上复制,其中 N 是配置的"每个实例"的复制因子。每个键 k 都分配给一个协调器节点。协调员负责复制属于其范围的数据项。除了在本地存储其范围内的每个密钥外,协调器还在环中的 N-1 个节点上复制这些密钥。Cassandra为客户提供了如何复制数据的各种选项。Cassandra 通过放宽仲裁要求,在节点故障和网络分区的情况下提供持久性保证。

如果客户端正在与群集中的随机节点(例如 node1)建立连接,则可能存在以下情况:

[成功] 节点 1 已启动,并且还具有请求的数据

[成功] 节点 1 是 UP 并且没有请求的数据,因此充当协调器节点并将请求路由到具有数据的副本,例如 node2。 假设节点 2 已启动并且可以为请求提供服务

[节点关闭] 节点 1 已关闭,并且具有请求的数据。 客户端接收不可用异常,并且可以连接到群集中的其他节点。 如果最小副本需要服务,查询可以响应,它将是成功的。

[副本节点关闭] 节点 1 已启动并且没有请求的数据,因此充当协调器节点并将请求路由到具有数据的副本,例如节点 2。 假设节点 2 已关闭,无法为请求提供服务。 如果其他副本未失效并且可以为请求提供服务,则成功。 如果在发送请求时副本已启动,但在引发超时异常后立即关闭。 客户端可以连接到群集中的其他节点。

[成功] node1 为 UP 并且还假设存储请求的数据

[成功] node1 是 UP 并且没有请求的数据令牌范围(不负责存储此数据),因此充当协调器节点并将请求路由到副本,例如 node2,该副本假设存储数据。 假设节点 2 已启动并且可以为请求提供服务。

[NODE DOWN] node1 是 DOWN,并且还假设存储请求的数据。 客户端接收不可用异常,并且可以连接到群集中的其他节点。 由于主节点关闭,提示的移交请求存储在副本中。

[副本节点关闭] node1 是 UP 并且没有请求的数据令牌范围(不负责存储此数据),因此充当协调器节点并将请求路由到副本,例如 node2,它应该存储数据。 假设节点 2 已关闭,无法为请求提供服务。 如果其他副本未失效并且可以为请求提供服务,则成功。 提示的放手将写在副本/协调器节点上。

最新更新