我在一个数据中心有一个单节点 Cassandra 3.11.4 设置。
我知道这很糟糕而且是错误的,所以我尝试通过将数据移动到另一个数据中心的 3 节点设置来修复它。
拍摄快照并将其复制意味着太多的停机时间,因此我尝试将 3 个新节点添加到集群并让 Cassandra 复制数据。
system_distributed
我的用户键空间以及的策略system_auth
如下system_traces
:
{'class': 'NetworkTopologyStrategy', '(newdc)': '3', '(olddc)': '1'}
所有节点都能正常看到彼此(旧数据中心有 1 个节点,新数据中心有 3 个节点)。所有节点都报告 UN。所有节点都报告 100% 有效所有权。我可以从任何节点查询我的密钥空间并取回数据。新节点上的数据文件夹中有一个用于我的用户密钥空间的文件夹,但它是空的。新节点显示负载 <1MB,与原来的 600GB+ 相比似乎有点低。
当我nodetool rebuild -- (olddc)
在任何新节点上执行此操作时,它几乎立即返回,没有任何消息。每个人都告诉我这个命令应该真正移动数据,但没有成功。
我怎样才能真正复制数据?
在日志中,我得到了Some ranges in (...all my ranges...) are already available, skipping streaming these ranges
。可用,是的,但实际上我希望节点拥有数据!
nodetool status
显示如下:
Datacenter: (new)
==================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN XX.XXX.X.110 775.49 KiB 256 100.0% XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Unknown
UN XX.XXX.X.109 929.93 KiB 256 100.0% XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Unknown
UN XX.XXX.X.108 710.75 KiB 256 100.0% XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Unknown
Datacenter: (old)
=============================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN XXX.XX.X.233 676.17 GiB 256 100.0% XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Unknown
重新启动了旧节点,现在nodetool rebuild
出现以下信息:
nodetool: Unable to find sufficient sources for streaming range (-1652045364361720276,-1613609154633147610] in keyspace system_distributed
再次重新启动所有节点,现在一切似乎都正常了。
部分原因似乎是因为原始“集群”只有一个节点。不要这样做,他们说这样做会出问题,这可不是开玩笑。这不仅仅是冗余,事情根本就无法正常运转。
第二部分似乎是我们(两个外部)数据中心之间的连接不可靠。仅仅因为您的提供商说您有稳定的千兆连接并不意味着您应该相信他们。
如果您正在阅读本文,那么您可能遇到了同样的问题。
如果是这样,请阅读所有评论并按照 Mario 的出色建议排除其他问题。如果您仍然遇到这些奇怪的间歇性问题,请采取以下步骤:
- 快速连续地重新启动所有节点(两个数据中心)。
- 等待 24 小时。
- 快速连续地重新启动所有节点(两个数据中心)。
- 等待4个小时。
- 再试一次。
(我不会自己回答这个问题,因为“解决方案”本质上相当于祈雨舞,完全不能令人满意。)
单节点 DC 不是问题的根本原因。根据您描述的症状,我最好的猜测是新节点未正确添加到集群中。
例如,如果您 (a) 将节点配置为种子,并且 (b) 未设置,
auto_bootstrap: false
则 (c) 它们将经历正常的引导序列而没有任何流式传输,因为 (d) 作为种子节点,它们没有任何内容可引导,因此 (e) 将“自动加入”集群。这句话是一个关键线索:
这意味着节点认为它拥有所需的所有数据,因此不需要
nodetool rebuild
请求副本来传输任何数据。当节点认为它已成功引导时,它会在表中将所有键空间的所有令牌范围标记为“可用”
system.available_ranges
(system.available_ranges_v2
在 C* 4.0 中,CASSANDRA-14406)。为了请求从副本重新流式传输数据nodetool rebuild
,您需要删除相应的条目system.available_ranges
或截断表。需要注意的是,如果网络不稳定,你将继续遇到其他问题。这也是你收到的原因
Unable to find sufficient sources for streaming range ...
。此错误表示与原始 DC 中的节点的连接中断。干杯!