dsbulk 卸载丢失的数据

dsbulk unload missing data

我正在使用 dsbulk 1.6.0 从 cassandra 3.11.3.

卸载数据

每次卸载都会产生截然不同的行数。以下是在同一集群上连接到同一 cassandra 主机的 3 次卸载调用的结果。被卸载的 table 只会被追加,数据永远不会被删除,所以卸载行的减少不应该发生。集群中有 3 个 cassandra 数据库,复制因子为 3,因此所有数据都应该存在于所选主机上。而且,这些都是快速连续执行的,添加的行数将是数百(如果有的话)而不是数万。

运行 1:

│ total | failed | rows/s | p50ms | p99ms | p999ms
│ 10,937 | 7 | 97 | 15,935.46 | 20,937.97 | 20,937.97
│ Operation UNLOAD_20201024-084213-097267 completed with 7 errors in 1 minute and 51 seconds.

运行 2:

│ total | failed | rows/s | p50ms | p99ms | p999ms
│ 60,558 | 3 | 266 | 12,551.34 | 21,609.05 | 21,609.05
│ Operation UNLOAD_20201025-084208-749105 completed with 3 errors in 3 minutes and 47 seconds.

运行 3:

│ total | failed | rows/s | p50ms | p99ms | p999ms
│ 45,404 | 4 | 211 | 16,664.92 | 30,870.08 | 30,870.08
│ Operation UNLOAD_20201026-084206-791305 completed with 4 errors in 3 minutes and 35 seconds.

看来 Run 1 缺少大部分数据。 Run 2 可能更接近完成,Run 3 缺少重要数据。

我按如下方式调用卸载:

dsbulk unload -h $CASSANDRA_IP -k $KEYSPACE -t $CASSANDRA_TABLE > $DATA_FILE

我假设这不是 dsbulk 的预期行为。我如何配置它以可靠地卸载完整的 table 而没有错误?

如果在写入数据时无法访问主机,并且没有重播提示,并且您没有 运行 定期修复,则主机可能会丢失数据。并且由于 DSBulk 默认以一致性级别 LOCAL_ONE 读取,不同的主机将提供不同的视图(您提供的主机只是一个联系点 - 之后将发现集群拓扑,并且 DSBulk 将 select基于负载均衡策略的副本)。

您可以使用 -cl 命令行选项 (doc) 强制 DSBulk 以另一个一致性级别读取数据。您可以使用 LOCAL_QUORUMALL 比较结果 - 在这些模式下,Cassandra 还将“修复”不一致,因为它们会被发现,尽管这会慢得多并且会增加节点的负载,因为修复的数据写入。