我有一个包含单个节点的基本 Cassandra 部署。我想向部署中添加第二个节点,并且我希望客户端能够访问相同的数据,无论它们碰巧与哪个节点通信(即,在给定的键空间内,特定查询应该在任何节点上产生相同的结果,除非最近的更新尚未完全传播)。
我的键空间的复制因子是 2。
无论如何,我还是跟随了此处的说明(虽然我不确定我是否使用“虚拟”节点...我应该执行 Cassandra 2.1 下的任何默认操作)并且节点似乎正在相互通信:
# nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN xxx.xxx.234.252 563.02 MB 1024 ? xxxxxxxx-0b3e-4fd3-9e63-xxxxxxxxxxxx RAC1
UN xxx.xxx.194.188 923.45 KB 1024 ? xxxxxxxx-84cb-4260-84df-xxxxxxxxxxxx RAC2
但是我并没有看到任何数据传播到新节点的证据。例如,它的 cfstats 如下所示:
Read Count: 290
Read Latency: 0.1124551724137931 ms.
Write Count: 35
Write Latency: 0.12919999999999998 ms.
Pending Flushes: 0
Table: assetproperties
SSTable count: 0
Space used (live): 0
Space used (total): 0
Space used by snapshots (total): 0
Off heap memory used (total): 0
SSTable Compression Ratio: 0.0
Number of keys (estimate): 34
...而在原始节点上,它们看起来像这样:
Read Count: 90
Read Latency: 1.674811111111111 ms.
Write Count: 0
Write Latency: NaN ms.
Pending Flushes: 0
Table: assetproperties
SSTable count: 3
Space used (live): 305561510
Space used (total): 305561510
Space used by snapshots (total): 0
Off heap memory used (total): 773076
SSTable Compression Ratio: 0.22460684186840507
Number of keys (estimate): 416712
如果我使用连接到新节点,cqlsh
我会得到非常不一致的结果。查询我知道存在于数据集中的键要么没有结果,要么产生可变的结果。例如,有时会返回包含正确数据的行,有时 Cassandra 会通知我不存在与查询匹配的行。如果我连接到原始节点,一切都会正常工作。
这仅仅是 Cassandra 的“最终一致性”的副作用吗?如果是这样,新节点大约需要多长时间才能开始可靠地返回有用的数据?
或者是否需要手动完成一些额外步骤才能使新节点以更合理/一致的方式工作?
我怀疑如果我设置,我可能会得到更好的结果consistency all
,cqlsh
但尝试这样做只会给我以下错误:
ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' responses]
message="Operation timed out - received only 1 responses."
info={'received_responses': 1, 'required_responses': 2,
'consistency': 'ALL'
}
这是因为数据尚未复制到新节点吗?
答案1
我相信我已经找到答案了nodetool repair
。原来的节点以使新节点正常工作。
运行nodetool repair
于新的节点可能看起来更直观正确,但尝试这样做只会导致修复过程永远挂起,没有日志输出。
修复过程完成后,数据在新节点上始终可用,并且consistency all
cqlsh 中的设置也开始正常工作。
我在运行时还收到一堆“丢失通知”消息nodetool repair
。那些看起来无害, 然而。