【问题标题】:How can I restore Cassandra snapshots?如何恢复 Cassandra 快照?
【发布时间】:2014-10-17 10:08:38
【问题描述】:

我正在为 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

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

【问题讨论】:

    标签: cassandra datastax


    【解决方案1】:

    添加了更多细节:

    您可以使用以下方法为您的特定键空间运行快照:

    $ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>
    

    这将在数据的快照目录中创建快照文件。

    当您删除数据时,确保不要删除快照文件夹,否则您将无法恢复它(除非您将其移动到其他位置/机器。)

    $ 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
    

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

    $ 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 中?
    • 编辑回复以澄清
    • 您说“我认为问题在于您正在将快照数据还原到快照目录中。它应该直接在表目录中。”那是我尝试过的目录之一。 Cassandra 仍然没有找到他们。
    • "您可以使用以下命令为您的特定键空间运行快照:..." 快照部分工作正常,如图所示。
    • “当您删除数据时,请确保不要删除快照文件夹,否则您将无法恢复它(除非您将其移动到另一个位置/机器。)”好吧,解压缩时会重新创建快照目录。
    【解决方案2】:

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

    你没有这个 UUID 目录,因为你使用的是 cassandra 2.0,而这个 UUID 是从 cassandra 2.2 开始的

    【讨论】:

      【解决方案3】:

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

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

      步骤2:使用以下命令插入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');
      

      第 3 步:我不小心删除了 Cricket 表

      drop table Cricket;
      

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

      第 5 步:查找快照位置和文件

      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
      

      第 6 步:您将在该快照位置获得一个 .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 = {  };
      

      步骤 7:登录数据库并使用该 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
      

      Step-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
      

      【讨论】:

        猜你喜欢
        • 2015-07-07
        • 1970-01-01
        • 2022-06-15
        • 2018-12-05
        • 1970-01-01
        • 2023-03-27
        • 2017-09-01
        • 2019-06-21
        • 2019-09-17
        相关资源
        最近更新 更多