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 受限)。
我们遇到了类似的问题:
nodetool cleanup
nodetool compact keyspace1.tabel1
(注意:根据 Cassandra 文档,不建议手动压缩,我们在迁移过程中这样做了)
- 我们还发现 sstableloader 正在创建非常大的文件,我们使用
sstablesplit
将 table 分解为较小的文件
https://cassandra.apache.org/doc/latest/cassandra/tools/sstable/sstablesplit.html
我使用 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 受限)。
我们遇到了类似的问题:
nodetool cleanup
nodetool compact keyspace1.tabel1
(注意:根据 Cassandra 文档,不建议手动压缩,我们在迁移过程中这样做了)- 我们还发现 sstableloader 正在创建非常大的文件,我们使用
sstablesplit
将 table 分解为较小的文件 https://cassandra.apache.org/doc/latest/cassandra/tools/sstable/sstablesplit.html