集群中 ID 为空的 Cassandra 主机

Cassandra host in cluster with null ID

注意:我们在 Cassandra 2.1.12.1047 (DSE 4.8.4) 集群中发现了这个问题,该集群有 6 个节点,分布在 3 个区域(每个区域 2 个)。

最近尝试更新集群上的模式,但发现更新失败。我们怀疑集群中的一个节点不接受更改。

在检查我们位于 us-east-1 的其中一台服务器的 system.peers table 时发现它有一个异常,它似乎是一个主机的完整条目不存在。

cassandra@cqlsh> SELECT peer, host_id FROM system.peers WHERE peer IN ('54.158.22.187', '54.196.90.253');

peer          | host_id
---------------+--------------------------------------
54.158.22.187 | 8ebb7f2c-8f81-44af-814b-a537b84834e0

由于该主机不存在,我尝试使用 nodetool removenode 删除它但失败了 error: Cannot remove self -- StackTrace -- java.lang.UnsupportedOperationException: Cannot remove self

我们知道 .187 服务器几周前由于 EC2 问题突然终止。

我们曾多次尝试使服务器保持健康,但最终只是终止了在 system.peers、运行 中报告此 .187 主机的服务器nodetool removenode 来自其他服务器之一,然后使新服务器联机。

新服务器上线,大约一个小时后似乎已经赶上 activity 的积压,需要使其与其他服务器保持一致(假设完全基于 CPU监控)。

但是,现在情况很奇怪,因为 system.peers table 中报告的 .187 在我们 运行 a nodetool status 时出现来自集群中的任何服务器,而不是我们刚刚联机的新服务器。

$ nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns    Host ID                               Rack
DN  54.158.22.187   ?          256     ?       null                                  r1
Datacenter: cassandra-ap-southeast-1-A
======================================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns    Host ID                               Rack
UN  54.255.xx.xx    7.9 GB     256     ?       a0c45f3f-8479-4046-b3c0-b2dd19f07b87  ap-southeast-1a
UN  54.255.xx.xx    8.2 GB     256     ?       b91c5863-e1e1-4cb6-b9c1-0f24a33b4baf  ap-southeast-1b
Datacenter: cassandra-eu-west-1-A
=================================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns    Host ID                               Rack
UN  176.34.xx.xxx   8.51 GB    256     ?       30ff8d00-1ab6-4538-9c67-a49e9ad34672  eu-west-1b
UN  54.195.xx.xxx   8.4 GB     256     ?       f00dfb85-6099-40fa-9eaa-cf1dce2f0cd7  eu-west-1c
Datacenter: cassandra-us-east-1-A
=================================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns    Host ID                               Rack
UN  54.225.xx.xxx   8.17 GB    256     ?       0e0adf3d-4666-4aa4-ada7-4716e7c49ace  us-east-1e
UN  54.224.xx.xxx   3.66 GB    256     ?       1f9c6bef-e479-49e8-a1ea-b1d0d68257c7  us-east-1d

因为我不知道如何删除没有主机 ID 的节点,所以我很困惑。

我该怎么做才能摆脱这个流氓节点?

注意:这是 descriccluster

的结果
$ nodetool describecluster
Cluster Information:
  Name: XXX
  Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
  Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
  Schema versions:
    d140bc9b-134c-3dbe-929f-7a84c2cd4532: [54.255.17.28, 176.34.207.151, 54.225.11.249, 54.195.174.72, 54.224.182.94, 54.255.64.1]

    UNREACHABLE: [54.158.22.187]

我自己从来没有这样做过,但可能您唯一要做的就是 assassinate 端点。这在 Cassandra 2.2 中被制作成一个 nodetool 命令(nodetool assassinate)。但在该版本之前,唯一的方法是通过 JMX。这是 Gist with detailed instructions (instructions and code by Justen Walker).

Prerequisites

  1. Log onto existing cluster alive node

  2. Download JMX Term

wget

$ wget -q -O jmxterm.jar
> http://downloads.sourceforge.net/cyclops-group/jmxterm-1.0-alpha-4-uber.jar
> curl

or

 $ curl -s -o jmxterm.jar
 http://downloads.sourceforge.net/cyclops-group/jmxterm-1.0-alpha-4-uber.jar
  1. Run jmxterm
$ java -jar ./jmxterm.jar
Welcome to JMX terminal. Type "help" for available commands.
$>

Assassinate node

Example bad node: 10.0.0.100

  • Connect to the local cluster
  • Select the Gossiper MBean Run the unsafeAssassinateEndpoint with the ip of the bad node
$>open
localhost:7199
#Connection to localhost:7199 is opened 

$>bean org.apache.cassandra.net:type=Gossiper
#bean is set to org.apache.cassandra.net:type=Gossiper

$>run unsafeAssassinateEndpoint 10.0.0.100
#calling operation unsafeAssassinateEndpoint of mbean org.apache.cassandra.net:type=Gossiper
#operation returns: null 

$>quit

更新 20160308:

I've never had to do this myself

只能自己做。完全查找并按照我自己的答案中的步骤进行操作。