#Cassandra - nodetool removenode 、退役、暗杀、替换之间有什么区别?
#Cassandra - What is the difference between nodetool removenode , decommission, assassinate, replace?
为了删除节点(工作/非工作)哪个命令适用于哪种情况?
区别在于数据的移动方式。在退役中,离开节点在离开集群之前移动数据,而在删除节点中,数据使用集群中具有相同令牌的副本移动。
因此不能使用死节点来完成退役。
停用来自离开节点的流数据。因此,您可以保证保持与开始操作时相同的一致性。
Removenode 从拥有该范围的任何可用节点流式传输数据。根据修复后的时间和用于写入数据的一致性级别,您可能会违反一致性(甚至可能丢失数据)。
通常情况下,您应该尽可能选择退役。假设您有 5 个节点集群 (A-E),并且给定的写入将转到 B、C 和 D。您使用仲裁写入,因此由于某种原因 C 关闭,但是写入转到 B 和 D。当 C 恢复时在线,D 需要从集群中删除(你正在缩小规模,或者更换驱动器,等等)。
如果 D 在线,您 运行 退役,D 将其数据发送给 E - 您保留所有数据的 2 个副本,您将能够 运行 稍后修复以获得写入 C.
如果 D 离线,或者如果您 运行 移除节点而不是退役,您可以从 C 而不是 D 流式传输。在这种情况下,您现在有 2 个副本(C 和 E ) 缺少数据。如果您以法定人数阅读,您现在可能会点击 C 和 E 而不是 B,并得到缺少数据的结果。修复可能会解决这个问题,只要你原来的写到一个以上的节点,但如果你原来的写只到一个节点,你实际上可能会丢失数据。
Assassinate 是一种很少使用的工具,只能用于强制节点脱离集群。不执行流式传输。数据丢失的可能性要高得多,尤其是当您使用 RF < 3 并使用 CL < ALL 写入时。
Nodetool removenode 、退役、暗杀、替换。这完全取决于您的用例和应用程序的可靠性。如果您可以在实时集群中执行而不是其他命令,则建议停用,但有时它也需要更多时间来流式传输数据并挂起。那么您没有任何选择,要么使用 removenode 命令,但有时它也会挂起。在这种情况下,您必须使用暗杀。从该节点流式传输所有数据后,您可以使用替换命令。将数据移动到较旧的节点后,两者的删除或替换过程都是相似的。
为了删除节点(工作/非工作)哪个命令适用于哪种情况?
区别在于数据的移动方式。在退役中,离开节点在离开集群之前移动数据,而在删除节点中,数据使用集群中具有相同令牌的副本移动。
因此不能使用死节点来完成退役。
停用来自离开节点的流数据。因此,您可以保证保持与开始操作时相同的一致性。
Removenode 从拥有该范围的任何可用节点流式传输数据。根据修复后的时间和用于写入数据的一致性级别,您可能会违反一致性(甚至可能丢失数据)。
通常情况下,您应该尽可能选择退役。假设您有 5 个节点集群 (A-E),并且给定的写入将转到 B、C 和 D。您使用仲裁写入,因此由于某种原因 C 关闭,但是写入转到 B 和 D。当 C 恢复时在线,D 需要从集群中删除(你正在缩小规模,或者更换驱动器,等等)。
如果 D 在线,您 运行 退役,D 将其数据发送给 E - 您保留所有数据的 2 个副本,您将能够 运行 稍后修复以获得写入 C.
如果 D 离线,或者如果您 运行 移除节点而不是退役,您可以从 C 而不是 D 流式传输。在这种情况下,您现在有 2 个副本(C 和 E ) 缺少数据。如果您以法定人数阅读,您现在可能会点击 C 和 E 而不是 B,并得到缺少数据的结果。修复可能会解决这个问题,只要你原来的写到一个以上的节点,但如果你原来的写只到一个节点,你实际上可能会丢失数据。
Assassinate 是一种很少使用的工具,只能用于强制节点脱离集群。不执行流式传输。数据丢失的可能性要高得多,尤其是当您使用 RF < 3 并使用 CL < ALL 写入时。
Nodetool removenode 、退役、暗杀、替换。这完全取决于您的用例和应用程序的可靠性。如果您可以在实时集群中执行而不是其他命令,则建议停用,但有时它也需要更多时间来流式传输数据并挂起。那么您没有任何选择,要么使用 removenode 命令,但有时它也会挂起。在这种情况下,您必须使用暗杀。从该节点流式传输所有数据后,您可以使用替换命令。将数据移动到较旧的节点后,两者的删除或替换过程都是相似的。