解决写入Cassandra副本集时的写入问题

qmb5sa22  于 2023-06-05  发布在  Cassandra
关注(0)|答案(1)|浏览(190)

通过设计,我们可以写入Cassandra副本集中的任何节点。对于我的副本集有2个节点的情况。当我对节点A进行写操作但该节点不可用时。我是否有捕获异常,然后手动重新写入节点B?
在mongodb上,他们的驱动程序有“可重试的写入”,如果主节点关闭,可以自动写入另一个节点。Cassandra有这个功能吗?

vq8itlhq

vq8itlhq1#

当您写入Cassandra时,您指定希望写入的一致性级别-从不提供保证的ANY到请求所有DC中的所有副本向协调器返回确认的ALL
根据您的负载平衡策略,此写入将发送到单个节点,该节点充当整个操作的协调器,并将返回成功/异常的单个响应,您的应用程序不必单独将写入发送到多个节点,它只需发送到1个节点(可以使用任何节点),该节点协调对副本的写入。
在使用local_quorum进行写入的正常情况下,非常正常的复制因子为3,那么只要协调器有3个节点中的2个节点提供写入确认,应用程序就不会得到任何异常-即使第3个节点未能写入数据。
在驱动程序上有一个重试策略-它可以允许在超时的情况下重试,但在使用此策略时应确保操作是幂等的。(例如,将项目追加到列表中,重试可能会导致该项目在其中一个副本上出现在列表中两次)。
当您的特定复制因子为2时,您目前处于缺乏一致性保证或弹性的位置。

  • one/local_one-仅保证其中一个节点获得写入。(两者都有可能得到,但没有提供保证)
  • quorum/local_quorum-需要两个节点都确认,因此您无法处理节点故障。

这是因为2的quorum是2 -如果您使用3个RF=3的节点,则local_quorum需要3个节点中的2个,这将允许节点关闭,同时提供更强的一致性保证。

相关问题