#Cassandra - nodetool removenode,decommission,assassinate,replace之间有什么区别?

时间:2016-05-08 18:01:11

标签: cassandra operations

为了删除一个节点(工作/不工作)哪个命令适用于哪种情况?

3 个答案:

答案 0 :(得分:12)

停止从离开节点流式传输数据。因此,您可以保证保持与开始操作时相同的一致性。

Removenode从拥有该范围的任何可用节点流式传输数据。您可能会违反一致性(甚至可能丢失数据),具体取决于自修复以来的时间以及用于写入数据的一致性级别。

通常,如果可能,您应该选择退役。假设您有5个节点集群(AE),并且给定的写入将转到B,C和D.您使用仲裁进行编写,因此由于某种原因C关闭,但是写入B和D.当C返回时在线,D需要从群集中删除(您正在缩小规模,或更改驱动器,或其他东西)。

  • 如果D在线,则运行decommission,D将其数据发送到E - 您保留所有数据的2个副本,并且您将能够稍后运行修复以获得对C的写入。

  • 如果D处于脱机状态,或者运行removenode而不是decommission,则可以从C而不是D流式传输。在这种情况下,您现在有2个副本(C和E)缺少数据。如果您在仲裁时读取,您现在可以点击C和E而不是B,并获得缺少数据的结果。修复可以解决这个问题,只要你的原始写入到多个节点,但如果你的原始写入只到一个节点,你实际上可能会丢失数据。

Assassinate是一种很少使用的工具,只能用于强制节点退出群集的工具。不执行流式传输。数据丢失的可能性要高得多,特别是如果您使用RF< 3用CL<写入所有。

答案 1 :(得分:1)

不同之处在于数据的移动方式。在停用时,离开节点在离开集群之前移动数据,如在移除节点中一样,使用具有集群中相同令牌的副本移动数据。

因此无法使用死节点完成停用。

答案 2 :(得分:0)

Nodetool removenode,停用,暗杀,替换。这完全取决于您的用例和应用程序的可靠性。如果您可以在实时集群中执行比其他命令更多的操作,则建议使用建议的反调试,但有时它还需要花费更多时间来流传输数据并挂起。那么您就没有任何选择,要么使用removenode命令,但有时它挂起了。在这种情况下,您必须使用暗杀。在从该节点流式传输所有数据之后,可以使用replace命令。将数据移至较旧的节点后,两者的删除或替换过程都是相似的。