Cassandra 3.11 SSTableLoader 机制

Cassandra 3.11 SSTableLoader mechanics

我一直在使用 SSTableLoader 实用程序在两个不同的 Cassandra 集群之间批量传输数据,我想知道是否有人 运行 遇到过同样的问题。源集群有数据,目标集群没有。

我已经阅读了有关该实用程序详细信息的 datastax 页面,但对于它的工作原理,我仍然有一些未解决的问题。

我在源集群的活动节点上使用该实用程序,命令遵循以下格式:

sstableloader -d target.host.ip -v -f /etc/cassandra/cassandra.yaml /cassandra/data/keyspace1/table1-uuid

集群都设置有 256 个 vnode,每个集群中有 6 个节点。模式在两种环境中都是 RF = 3,table 的结构都相同。

所以我的问题如下:

1) 该实用程序从您指定的 cassandra.yaml 中提取源集群信息,但您仍然必须指定 SSTables 的绝对路径。那么,来自单个节点的 运行ning SSTableLoader 会在完成后为我提供目的地的整个 table 吗?似乎很难验证,因为目标集群的令牌范围不同。

2) datastax 信息说:

To get the best throughput from SSTable loading, you can use multiple instances of sstableloader to stream across multiple machines. No hard limit exists on the number of SSTables that sstableloader can run at the same time, so you can add additional loaders until you see no further improvement.

这是否意味着对于单个 table,我将在多个源计算机上启动多个 SSTableLoader 实例?或者它只是意味着我可以同时在多台机器上对多个不同的 table 使用 SSTableLoader。我试图了解他们提到的吞吐量增益是针对单个 table 还是仅针对飞行中的多个 table。

3) 需要对快照中的 运行 进行哪些语法修改?我拍摄了一张快照并通过 运行ning 相同的命令进行了测试,但进一步深入到 table 的快照目录并且它没有正确解析它说 "snapshot" 是一个无效的键空间。

无论如何谢谢希望我的问题已经足够清楚了。

1) 如果您的 RF=3 并且您的集群有 3 个节点,那么每个节点都包含 ALL 数据。由于尚未传播到所有副本的更新,仍然可能会有一些小的变化。如果集群中的节点数大于 RF(你的情况是 6 个节点,RF=3),那么每个节点都持有 50% 的数据(不同的令牌范围)的组合。 无论如何,您需要 运行 所有键空间上的 sstableloader + table 从每个源节点到新集群的目标节点(假设 1:1 比率)。

2) 是的,您可以 运行 多个 sstableloader 在同一个 table / 键空间上从每个源节点到它并行匹配的目标节点。但这也意味着您可以为不同的键空间/tables 执行此操作,只要最终您从所有源节点为所有键空间/tables 执行它到它们匹配的目标节点(假设 1:1比率).

3) 从备份(快照)恢复是一个不同的过程,不涉及使用 sstableloader。您可以阅读更多相关信息 here

还有一个选项可以使用nodetool refresh将sstables从所有源节点加载到新的目标节点,但只有在num_nodes=射频。阅读更多相关信息 here