如何恢复Cassandra快照?

Don*_*son 19 cassandra datastax

我正在为Cassandra数据库构建一个备份和恢复过程,以便在需要时准备就绪,以便我了解细节以构建适合生产的东西.我在这里遵循Datastax的说明:

http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html.

首先,我在开发盒上播种数据库,然后尝试进行备份/恢复.这是备份脚本:

#!/bin/bash

cd /opt/apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding
Run Code Online (Sandbox Code Playgroud)

是的,也许,tar不是最有效的方式,但我只是想让一些事情发挥作用.我检查了tar,所有文件都在那里.

备份数据库后,我关闭了Cassandra和我的应用程序,然后rm -rf /var/lib/cassandra/模拟完全丢失.

现在恢复数据库.从http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_snapshot_restore_t.html恢复"方法2" 与我的模式创建组件比方法1更兼容.

所以,方法2 /步骤1,"重新创建模式":重新启动Cassandra,然后重新启动我的应用程序.该应用程序构建为在必要时在启动时重新创建架构.一旦它启动,就会有一个工作的Cassandra节点,其中包含应用程序的架构,但没有数据.

方法2 /步骤2"恢复快照":它们提供了三种选择,第一种是使用sstableloader,记录在http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsBulkloader_t.html.加载器所需的文件夹结构与快照工具创建的文件夹结构完全不同,因此必须将所有内容移动到位.在遇到所有麻烦之前,我会在一张桌子上试一试:

>./bin/sstableloader makeyourcase/users
Error: Could not find or load main class org.apache.cassandra.tools.BulkLoader
Run Code Online (Sandbox Code Playgroud)

嗯,好吧,那不行.BulkLoader位于./lib/apache-cassandra-2.0.9.jar中,但加载器似乎没有设置为开箱即用.让我们继续第二种方法,将快照目录复制到makeyourcase/users/snapshots /目录中,而不是调试工具.这应该很简单,因为我们将快照目录放回原来的位置,所以tar xzf after_seeding.tgz应该这样做:

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase
Run Code Online (Sandbox Code Playgroud)

并将快照目录放回各自的"快照"目录下,刷新应恢复数据:

cd /opt/apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users
Run Code Online (Sandbox Code Playgroud)

这没有抱怨.请注意,您必须为每个表运行此操作,因此您必须首先生成表列表.但是,在我们这样做之前,请注意Cassandra日志中有一些有趣的东西:

INFO 14:32:26,319 Loading new SSTables for makeyourcase/users...
INFO 14:32:26,326 No new SSTables were found for makeyourcase/users
Run Code Online (Sandbox Code Playgroud)

所以,我们把快照放回去,但Cassandra没有找到它.我还尝试在现有SSTables目录下移动快照目录,并将旧的SSTable文件复制到现有目录中,并在日志中显示相同的错误.Cassandra没有记录它希望找到它们的位置,只是它找不到它们.文档说它们将它们放入名为data/keyspace/table_name-UUID的目录中,但是没有这样的目录.有一个名为data/makeyourcase/users/snapshots/1408820504987-users /,但是将快照目录放在那里或单个文件不起作用.

第三种选择,"节点重启方法"看起来不适合多节点生产环境,所以我没试过.

编辑:

只是为了让下一个人完全明确,这里是应用接受的答案的初步,工作备份和恢复脚本.

myc_backup.sh:

#!/bin/bash

cd ~/bootstrap/apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding
Run Code Online (Sandbox Code Playgroud)

myc_restore.sh:

#!/bin/bash

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase

cd ~/bootstrap/apache-cassandra-2.0.9
TABLE_LIST=`./bin/nodetool cfstats makeyourcase | grep "Table: " | sed -e 's+^.*: ++'`
for TABLE in $TABLE_LIST; do
    echo "Restore table ${TABLE}"
    cd /var/lib/cassandra/data/makeyourcase/${TABLE}
    if [ -d "snapshots/after_seeding" ]; then
        cp snapshots/after_seeding/* .
        cd ~/bootstrap/apache-cassandra-2.0.9
        ./bin/nodetool refresh -- makeyourcase ${TABLE}
        cd /var/lib/cassandra/data/makeyourcase/${TABLE}
        rm -rf snapshots/after_seeding
        echo "    Table ${TABLE} restored."
    else
        echo "    >>> Nothing to restore."
    fi
done
Run Code Online (Sandbox Code Playgroud)

pha*_*act 9

添加了更多细节:

您可以使用以下命令为特定键空间运行快照:

$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>
Run Code Online (Sandbox Code Playgroud)

这将在数​​据中的snapshots目录中创建快照文件.

删除数据时,请确保不删除快照文件夹,否则将无法将其还原(除非您将其移动到其他位置/计算机.)

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ ls
mykeyspace-mytable-jb-2-CompressionInfo.db mykeyspace-mytable-jb-2-Statistics.db
mykeyspace-mytable-jb-2-Data.db mykeyspace-mytable-jb-2-Filter.db mykeyspace-mytable-jb-2-Index.db
mykeyspace-mytable-jb-2-Summary.db mykeyspace-mytable-jb-2-TOC.txt snapshots


$ rm *
rm: cannot remove `snapshots': Is a directory
Run Code Online (Sandbox Code Playgroud)

准备好还原后,将快照数据复制回keyspace/table目录(每个表一个):

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ sudo cp snapshots/<SnapshotDirectoryName>/* .
Run Code Online (Sandbox Code Playgroud)

你提到过:

并将快照目录放回各自的"快照"目录下,刷新>应该恢复数据:

我认为问题是您正在将快照数据还原到快照目录中.它应该在表目录中.其他一切似乎都是对的,让我知道.