我该如何恢复Cassandra的快照?

21
我正在为Cassandra数据库构建备份和恢复流程,以便在需要时随时可用,并且为了理解细节以构建适用于生产环境的东西。 我遵循Datastax在以下链接中的说明:http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html
作为开始,我正在dev box上种子化数据库,然后尝试使备份/恢复工作。 这是备份脚本:
#!/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

是的,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

嗯,这种方法不会起作用。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

这将把快照目录放回到它们各自的“快照”目录下,刷新即可恢复数据:

cd /opt/apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users

这个命令可以顺利运行。请注意,你需要对每个表运行此命令,因此需要先生成表列表。但是,在我们进行此操作之前,注意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

因此,我们将快照放回去,但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

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
3个回答

10

添加更多细节:

您可以使用以下命令来运行特定keyspace的快照:

$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>

这将在data目录中的snapshots文件夹内创建快照文件。

当你要删除数据时,请确保不要删除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

当你准备恢复数据时,将快照数据复制回键空间/表目录中(每个表一个):

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ sudo cp snapshots/<SnapshotDirectoryName>/* .

你提到:
并且这会将快照目录放回它们各自的“快照”目录下,刷新应该可以恢复数据。
我认为问题在于你正在将快照数据还原到快照目录中。它应该直接放在表格目录中。其他都没问题,请告诉我。

你是说 *.db 和其他文件应该直接放在 /var/lib/cassandra/data/ 而不是在 /var/lib/cassandra/data/makeyourcase/ 或者 /var/lib/cassandra/data/after_seeding 下面吗? - Don Branson
编辑响应以澄清 - phact
你说:“我认为问题在于你将快照数据还原到了快照目录中,而应该放在表目录中。” 那是我尝试过的一个目录。但Cassandra仍然找不到它们。 - Don Branson
您可以使用以下命令运行特定 keyspace 的快照:... 快照部分正常工作,如所示。 - Don Branson
你的答案要点,也就是我流程中缺失的部分是: "$ pwd /var/lib/cassandra/data/mykeyspace/mytable $ sudo cp snapshots/<SnapshotDirectoryName>/* ." - Don Branson
显示剩余3条评论

4

文档中说要将它们放入名为data/keyspace/table_name-UUID 的目录中,但是没有这样的目录。

您没有此UUID目录,因为您正在使用cassandra 2.0,而这个UUID事情始于cassandra 2.2。


0

步骤1:我使用以下命令创建了一个表

CREATE TABLE Cricket (
    PlayerID uuid,
    LastName varchar,
    FirstName varchar,  
    City varchar,
    State varchar,
    PRIMARY KEY (PlayerID));

步骤二:使用以下命令插入3条记录

INSERT INTO Cricket (PlayerID, LastName, FirstName, City, State)
VALUES (now(), 'Pendulkar', 'Sachin', 'Mumbai','Maharastra');
INSERT INTO Cricket (PlayerID, LastName, FirstName, City, State)
VALUES (now(), 'Vholi', 'Virat', 'Delhi','New Delhi');
INSERT INTO Cricket (PlayerID, LastName, FirstName, City, State)
VALUES (now(), 'Sharma', 'Rohit', 'Berhampur','Odisha');

步骤三:我不小心删除了板球表

drop table Cricket;

步骤四:需要使用自动快照备份来恢复该表 注意:auto_snapshot(默认值:true)启用或禁用在截断键空间或删除表之前对数据进行快照。为了防止数据丢失,强烈建议使用默认设置。

步骤五:查找快照位置和文件

cassandra@node1:~/data/students_details$ cd cricket-88128dc0960d11ea947b39646348bb4f
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f$ ls -lrth
total 0
drwxrwxr-x 2 cassandra cassandra  6 May 14 18:05 backups
drwxrwxr-x 3 cassandra cassandra 43 May 14 18:06 snapshots

第六步:您将在快照位置获得一个.cql文件,其中包含表DDL。
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$ ls -lrth
total 44K
-rw-rw-r-- 1 cassandra cassandra   92 May 14 18:06 md-1-big-Summary.db
-rw-rw-r-- 1 cassandra cassandra   61 May 14 18:06 md-1-big-Index.db
-rw-rw-r-- 1 cassandra cassandra   16 May 14 18:06 md-1-big-Filter.db
-rw-rw-r-- 1 cassandra cassandra  179 May 14 18:06 md-1-big-Data.db
-rw-rw-r-- 1 cassandra cassandra   92 May 14 18:06 md-1-big-TOC.txt
-rw-rw-r-- 1 cassandra cassandra 4.7K May 14 18:06 md-1-big-Statistics.db
-rw-rw-r-- 1 cassandra cassandra    9 May 14 18:06 md-1-big-Digest.crc32
-rw-rw-r-- 1 cassandra cassandra   43 May 14 18:06 md-1-big-CompressionInfo.db
-rw-rw-r-- 1 cassandra cassandra  891 May 14 18:06 schema.cql
-rw-rw-r-- 1 cassandra cassandra   31 May 14 18:06 manifest.json
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$

more schema.cql
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$ more schema.cql
CREATE TABLE IF NOT EXISTS students_details.cricket (
        playerid uuid PRIMARY KEY,
        city text,
        firstname text,
        lastname text,
        state text)
        WITH ID = 88128dc0-960d-11ea-947b-39646348bb4f
        AND bloom_filter_fp_chance = 0.01
        AND dclocal_read_repair_chance = 0.1
        AND crc_check_chance = 1.0
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND min_index_interval = 128
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND read_repair_chance = 0.0
        AND speculative_retry = '99PERCENTILE'
        AND comment = ''
        AND caching = { 'keys': 'ALL', 'rows_per_partition': 'NONE' }
        AND compaction = { 'max_threshold': '32', 'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }
        AND compression = { 'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor' }
        AND cdc = false
        AND extensions = {  };

步骤七:登录数据库,使用该DDL创建表。

    apiadmin@cqlsh:coopersdev> use students_details;
    apiadmin@cqlsh:students_details> CREATE TABLE IF NOT EXISTS students_details.cricket (
                        ...         playerid uuid PRIMARY KEY,
                        ...         city text,
                        ...         firstname text,
                        ...         lastname text,
                        ...         state text)
                        ...         WITH ID = 88128dc0-960d-11ea-947b-39646348bb4f
                        ...         AND bloom_filter_fp_chance = 0.01
                        ...         AND dclocal_read_repair_chance = 0.1
                        ...         AND crc_check_chance = 1.0
                        ...         AND default_time_to_live = 0
                        ...         AND gc_grace_seconds = 864000
                        ...         AND min_index_interval = 128
                        ...         AND max_index_interval = 2048
                        ...         AND memtable_flush_period_in_ms = 0
                        ...         AND read_repair_chance = 0.0
                        ...         AND speculative_retry = '99PERCENTILE'
                        ...         AND comment = ''
                        ...         AND caching = { 'keys': 'ALL', 'rows_per_partition': 'NONE' }
                        ...         AND compaction = { 'max_threshold': '32', 'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }
                        ...         AND compression = { 'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor' }
                        ...         AND cdc = false
                        ...         AND extensions = {  };
apiadmin@cqlsh:students_details>

步骤8:将快照文件夹中的所有文件复制到现有的板球表文件夹中

cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$ pwd
/home/cassandra/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$ cp * /home/cassandra/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f/snapshots/dropped-1589479603749-cricket$ cd /home/cassandra/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f$ ls -lrth
total 44K
drwxrwxr-x 2 cassandra cassandra    6 May 14 18:05 backups
drwxrwxr-x 3 cassandra cassandra   43 May 14 18:06 snapshots
-rw-rw-r-- 1 cassandra cassandra  891 May 14 18:11 schema.cql
-rw-rw-r-- 1 cassandra cassandra   92 May 14 18:11 md-1-big-TOC.txt
-rw-rw-r-- 1 cassandra cassandra   92 May 14 18:11 md-1-big-Summary.db
-rw-rw-r-- 1 cassandra cassandra 4.7K May 14 18:11 md-1-big-Statistics.db
-rw-rw-r-- 1 cassandra cassandra   61 May 14 18:11 md-1-big-Index.db
-rw-rw-r-- 1 cassandra cassandra   16 May 14 18:11 md-1-big-Filter.db
-rw-rw-r-- 1 cassandra cassandra    9 May 14 18:11 md-1-big-Digest.crc32
-rw-rw-r-- 1 cassandra cassandra  179 May 14 18:11 md-1-big-Data.db
-rw-rw-r-- 1 cassandra cassandra   43 May 14 18:11 md-1-big-CompressionInfo.db
-rw-rw-r-- 1 cassandra cassandra   31 May 14 18:11 manifest.json
cassandra@node1:~/data/students_details/cricket-88128dc0960d11ea947b39646348bb4f$

步骤9:使用以下命令启动sstableloader恢复表数据

cassandra@node1:~$ sstableloader -d 10.213.61.21 -username cassandra --password cassandra /home/cassandra/data/students_details/cricket-d3576f60960f11ea947b39646348bb4f/snapshots
    Established connection to initial hosts
    Opening sstables and calculating sections to stream

    Summary statistics:
       Connections per host    : 1
       Total files transferred : 0
       Total bytes transferred : 0.000KiB
       Total duration          : 2920 ms
       Average transfer rate   : 0.000KiB/s
       Peak transfer rate      : 0.000KiB/s

步骤10:表已成功恢复,请进行验证。

 playerid                             | city      | firstname | lastname  | state
--------------------------------------+-----------+-----------+-----------+------------
 d7b12c90-960f-11ea-947b-39646348bb4f | Berhampur |     Rohit |    Sharma |     Odisha
 d7594890-960f-11ea-947b-39646348bb4f |     Delhi |     Virat |     Vholi |  New Delhi
 d7588540-960f-11ea-947b-39646348bb4f |    Mumbai |    Sachin | Pendulkar | Maharastra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接