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

时间:2015-04-22 09:30:34

标签: cassandra

我使用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有多聪明?是否以某种方式过滤了不同的冗余对?

1 个答案:

答案 0 :(得分:2)

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

可能的情况是,各种sstables都有各种旧版数据:较旧的sstables有过时的阴影细胞,而较新的sstables有新的活细胞。当sstableloader将该数据推送到集群中时,最先写入最旧的数据,然后在重放时由新数据废弃。如果有删除,那么也会有墓碑,实际上是在其他所有内容之上添加空间。

如果你需要清除那些过时的数据,你可以运行压缩(使用nodetool compact,如果这是你的一个选项 - 你的数据集足够小可能很好 - 或类似http://www.encql.com/purge-cassandra-tombstones/来做一个如果你受空间限制,那么一次只能稳定。