向 Cassandra 部署添加新节点

向 Cassandra 部署添加新节点

我有一个包含单个节点的基本 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 allcqlsh但尝试这样做只会给我以下错误:

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 allcqlsh 中的设置也开始正常工作。

我在运行时还收到一堆“丢失通知”消息nodetool repair。那些看起来无害, 然而。

相关内容