sstableloader 是否插入对,在不同的 sstables 上唯一地复制?

Does sstableloader insert pairs, replicated over different sstables, uniquely?

我使用 sstableloader 从配置为复制四次的 4 节点集群中导入快照。快照的文件夹结构是:

<keyspace>/<tablename>/snapshots/<timestamp>

最终每个快照文件夹中有4个时间戳,每个节点一个。它们出现在同一个快照目录中,因为我对它们进行了 tar-gzip 压缩并将所有节点的快照解压缩到同一目录中。

我注意到 sstableloader 无法处理这个问题,因为该工具假设文件夹应该以 / 结尾。因此我将文件夹重组为

<timestamp>/<keyspace>/<tablename>

然后我将 sstableloader 应用于每个时间戳:

sstableloader -d localhost <keyspace>/<tablename>

这似乎很老套,因为我重组了文件夹,我同意,但我无法让 sstableloader 工具正常工作。如果有更好的方法,请告诉我。

但是,这有效:

Established connection to initial hosts
Opening sstables and calculating sections to stream
Streaming relevant part of <keyspace>/<tablename>/<keyspace>-<tablename>-ka-953-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-911-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-952-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-955-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-951-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-798-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-954-Data.db <keyspace>/<tablename>/<keyspace>-<tablename>-ka-942-Data.db to [/127.0.0.1]
progress: [/127.0.0.1]0:8/8 100% total: 100% 0  MB/s(avg: 7 MB/s)
Summary statistics: 
   Connections per host:         : 1         
   Total files transferred:      : 8         
   Total bytes transferred:      : 444087547 
   Total duration (ms):          : 59505     
   Average transfer rate (MB/s): : 7         
   Peak transfer rate (MB/s):    : 22  

所以我为每个时间戳(以及每个键空间和每个表名)重复了命令,并且所有数据都导入到我笔记本电脑的单节点设置中(在 ubuntu 从 ppa 安装 cassandra 后的默认设置).

可能需要注意的是,在使用 sstableloader 导入之前,我使用复制 1 初始化了密钥空间,而不是 4 节点集群服务器上的复制 3。

CREATE KEYSPACE <keyspace> WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

尽管如此,我注意到了这一点:

$ du -sh /var/lib/cassandra/data/<keyspace>/<tablename>-e08e2540e82a11e4a64d8d887149c575/
6,4G    /var/lib/cassandra/data/<keyspace>/<tablename>-e08e2540e82a11e4a64d8d887149c575/

但是,当我查询快照的大小时:

$ du -sh 142961465*/<keyspace>/<tablename>
2,9G    1429614655449/<keyspace>/<tablename>
3,1G    1429614656562/<keyspace>/<tablename>
2,9G    1429614656676/<keyspace>/<tablename>
2,7G    1429614656814/<keyspace>/<tablename>

快照总大小为 11.6GB,复制 3 数据的基本部分应该是 ~3.9GB,但是 /var/lib/cassandra/data/<keyspace>/<tablename>-e08e2540e82a11e4a64d8d887149c575/ 文件夹要大得多。为什么会这样? cassandra/sstableloader 有多聪明?是否以某种方式过滤了不同的冗余对?

您几乎肯定会看到 Cassandra 在做正确的事情:它正在导入每个 sstable,并让时间戳解析获胜。

可能是因为您的各种 sstables 具有各种旧版本的数据:旧的 sstables 具有过时的阴影单元格,而较新的 sstables 具有新的活单元格。当 sstableloader 将该数据推送到集群中时,首先写入最旧的数据,然后在重放时被较新的数据废弃。如果有删除,那么也会有逻辑删除,实际上是在其他所有内容之上添加 space 用法。

如果您需要清除那些过时的数据,您可以 运行 压缩(如果您愿意,可以使用 nodetool compact - 您的数据集足够小,可能没问题 - 或者类似 http://www.encql.com/purge-cassandra-tombstones/ 一次做一个 sstable,如果你 space 受限)。

我们遇到了类似的问题:

  1. nodetool cleanup
  2. nodetool compact keyspace1.tabel1(注意:根据 Cassandra 文档,不建议手动压缩,我们在迁移过程中这样做了)
  3. 我们还发现 sstableloader 正在创建非常大的文件,我们使用 sstablesplit 将 table 分解为较小的文件 https://cassandra.apache.org/doc/latest/cassandra/tools/sstable/sstablesplit.html