【问题标题】:Does sstableloader insert pairs, replicated over different sstables, uniquely?sstableloader 是否插入对,在不同的 sstables 上复制,唯一?
【发布时间】:2021-09-10 22:41:16
【问题描述】:

我使用 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  

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

需要注意的是,在使用 sstableloader 导入之前,我在 4 节点集群服务器上使用复制 1 而不是 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/&lt;keyspace&gt;/&lt;tablename&gt;-e08e2540e82a11e4a64d8d887149c575/ 文件夹要大得多。为什么会这样? cassandra / sstableloader 有多聪明?是否以某种方式过滤了不同的冗余对?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

    您的各种 sstable 可能有各种旧版本的数据:旧的 sstable 有过时的阴影单元,而新的 sstable 有新的活单元。当 sstableloader 将该数据推送到集群中时,最旧的数据首先被写入,然后在重放时被新数据淘汰。如果有删除,那么也会有墓碑,这实际上是在其他所有内容之上添加空间使用。

    如果您需要清除那些过时的数据,您可以运行压缩(如果您可以选择使用 nodetool compact - 您的数据集足够小,它可能没问题 - 或者类似 http://www.encql.com/purge-cassandra-tombstones/ 的东西在一个时间,如果你的空间有限)。

    【讨论】:

    • 我无法验证你说的是否正确,但听起来很合理。
    【解决方案2】:

    我们遇到了类似的问题:

    1. nodetool cleanup
    2. nodetool compact keyspace1.tabel1(注意:根据 Cassandra 文档,不建议手动压缩,我们将其作为迁移的一部分)
    3. 我们还发现 sstableloader 正在创建非常大的文件,我们使用sstablesplit 将表格分解为更小的文件 https://cassandra.apache.org/doc/latest/cassandra/tools/sstable/sstablesplit.html

    【讨论】:

    • 赞成,因为这清楚地表明了如何从接受的答案中制定要点。
    • 感谢您添加适当的命令。我已经有一段时间没有使用 Cassandra 了,也无法对此进行测试,但这样做会删除阴影数据是有道理的。
    猜你喜欢
    • 2023-03-08
    • 2018-06-29
    • 2019-01-02
    • 1970-01-01
    • 2013-06-10
    • 2018-03-21
    • 1970-01-01
    • 2021-01-02
    • 2016-12-22
    相关资源
    最近更新 更多