集群中 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
Log onto existing cluster alive node
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
- 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
只能自己做。完全查找并按照我自己的答案中的步骤进行操作。
注意:我们在 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
Log onto existing cluster alive node
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
- 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
只能自己做。完全查找并按照我自己的答案中的步骤进行操作。