添加节点

Cassandra 的添加节点应该是最简单了,可以理解是 无脑添加。啥意思呢,这么来说,Cassandra 的添加节点,我们需要修改的配置有:

  • 集群名,保持一致
  • Token 保持一致
  • seeds 保持一致

然后就可以了

这里需要 纠正一个问题 ,我们建议的 Token 保持一致的前提的是, 每台机器的性能要一样,比如说同样的CPU 核心数,同样的 内存大小。我们用最简单的方式去理解这个 Token , 就是权重比。比如说:三台 cassandra 节点的 token , 都是 500 ,token 比也就是 1:1:1 , 那么每个 cassandra 节点处理的数据量是一样的,如果说 第三个节点的 cassandra 的 token 的值是 250 , 那这个比例就是 2:2:1 , 那么三个节点的数据的处理量是不同的。这里需要注意一下。至于这个 Token 的值,则么去影响到 cassandra 的负载均衡,老夫最近也在研究。后续应该会有更新。

删除节点

Cassandra 删除节点,其实还是比较麻烦的。这里,笔者经过测试,总结了下:

修复keyspace

1
nodetool repair <keyspace_name>

检查当前的节点状态
执行 nodetool status

1
2
3
4
5
6
7
8
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.0.24 378.83 KiB 500 66.9% 7f53d662-e883-42c5-9de5-b626394bda08 rack1
UN 192.168.0.25 308.08 KiB 500 65.3% 26e0de75-583d-4b82-98b8-cce223f300e9 rack1
DN 192.168.0.23 957.67 KiB 500 67.8% a9d4b392-e47c-4985-a47c-eef535b9ece4 rack1

可以看到,现在有一个节点处于 DN 状态,这个节点也就是我目前要移除的节点,如果你要移除的节点,处于 UN 状态,需要执行: nodetool decommission , 在需要移除的节点上

移除节点
我们在 活动的节点上执行:

1
nodetool removenode a9d4b392-e47c-4985-a47c-eef535b9ece4

随后,我们在 查下 状态:

1
2
3
4
5
6
7
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.0.24 450.04 KiB 500 100.0% 7f53d662-e883-42c5-9de5-b626394bda08 rack1
UN 192.168.0.25 379.33 KiB 500 100.0% 26e0de75-583d-4b82-98b8-cce223f300e9 rack1

如果现在我们的节点是 seed 节点, 那我们需要做的就是,在配置中移除当前的这个节点。

1
2
3
4
5
6
7
8
9
10
seed_provider:
# Addresses of hosts that are deemed contact points.
# Cassandra nodes use this list of hosts to find each other and learn
# the topology of the ring. You must change this if you are running
# multiple nodes!
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
# seeds is actually a comma-delimited list of addresses.
# Ex: "<ip1>,<ip2>,<ip3>"
- seeds: "192.168.0.23,192.168.0.24"

这里我们删除 我们的 192.168.0.23 这个节点 IP,随后在进行重启。重启之后在 查看状态:

1
2
3
4
5
6
7
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.0.24 584.07 KiB 500 100.0% 7f53d662-e883-42c5-9de5-b626394bda08 rack1
UN 192.168.0.25 555.77 KiB 500 100.0% 26e0de75-583d-4b82-98b8-cce223f300e9 rack1

这里也要纠正一下,笔者上面的方式,其实是在一个空的 cassandra 集群上做的,所以删除会很快,但是在实际中,不是这样的。

在实际中,我们删除一个节点上的数据,集群会做一个数据上的迁移,我个人的理解就是缺少补啥,迁移过后,其他的节点会告知集群,我这个节点迁移好了,集群要等所有的节点都返回了 OK ,然后在进行删除(个人理解。实际在删除的时候,的确在等一个返回)。所以呢,笔者删几个节点,直接就傻了,因为我着实是不知道要等多久。

可以通过 nodetool removenode status 来查看删除节点的状态,如果等待时间太长了,你又不想等,而且允许数据的丢失的时候,我们可以强制性的删除。nodetool removenode force 就可以了。我就是执行的这个,分分钟给删了。仅供参考。