我使用sstableloader从配置为复制四次的4个节点的集群中导入快照。快照的文件夹结构是:
<keyspace>/<tablename>/snapshots/<timestamp>
最终每个快照文件夹中有4个时间戳,每个节点一个。它们出现在同一个snapshot-directory中,因为我对它们进行了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导入之前,我使用复制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有多聪明?是否以某种方式过滤了不同的冗余对?
答案 0 :(得分:2)
你几乎肯定会看到Cassandra做正确的事情:它正在导入每个sstable,并让时间戳分辨率获胜。
可能的情况是,各种sstables都有各种旧版数据:较旧的sstables有过时的阴影细胞,而较新的sstables有新的活细胞。当sstableloader将该数据推送到集群中时,最先写入最旧的数据,然后在重放时由新数据废弃。如果有删除,那么也会有墓碑,实际上是在其他所有内容之上添加空间。
如果你需要清除那些过时的数据,你可以运行压缩(使用nodetool compact,如果这是你的一个选项 - 你的数据集足够小可能很好 - 或类似http://www.encql.com/purge-cassandra-tombstones/来做一个如果你受空间限制,那么一次只能稳定。