通过设计,我们可以写入Cassandra副本集中的任何节点。对于我的副本集有2个节点的情况。当我对节点A进行写操作但该节点不可用时。我是否有捕获异常,然后手动重新写入节点B?在mongodb上,他们的驱动程序有“可重试的写入”,如果主节点关闭,可以自动写入另一个节点。Cassandra有这个功能吗?
vq8itlhq1#
当您写入Cassandra时,您指定希望写入的一致性级别-从不提供保证的ANY到请求所有DC中的所有副本向协调器返回确认的ALL。根据您的负载平衡策略,此写入将发送到单个节点,该节点充当整个操作的协调器,并将返回成功/异常的单个响应,您的应用程序不必单独将写入发送到多个节点,它只需发送到1个节点(可以使用任何节点),该节点协调对副本的写入。在使用local_quorum进行写入的正常情况下,非常正常的复制因子为3,那么只要协调器有3个节点中的2个节点提供写入确认,应用程序就不会得到任何异常-即使第3个节点未能写入数据。在驱动程序上有一个重试策略-它可以允许在超时的情况下重试,但在使用此策略时应确保操作是幂等的。(例如,将项目追加到列表中,重试可能会导致该项目在其中一个副本上出现在列表中两次)。当您的特定复制因子为2时,您目前处于缺乏一致性保证或弹性的位置。
ANY
ALL
local_quorum
one
local_one
quorum
这是因为2的quorum是2 -如果您使用3个RF=3的节点,则local_quorum需要3个节点中的2个,这将允许节点关闭,同时提供更强的一致性保证。
1条答案
按热度按时间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个,这将允许节点关闭,同时提供更强的一致性保证。