Cassandra 文档

版本

您正在查看预发布版本的文档。

备份

Apache Cassandra 将数据存储在不可变的 SSTable 文件中。Apache Cassandra 数据库中的备份是作为 SSTable 文件存储的数据库数据的备份副本。备份用于多种目的,包括以下目的:

  • 存储数据副本以确保持久性

  • 能够在节点/分区/网络故障导致表数据丢失时恢复表

  • 能够将 SSTable 文件传输到不同的机器;为了便携性

备份类型

Apache Cassandra 支持两种备份策略。

  • 快照

  • 增量备份

快照是在给定时间对表的 SSTable 文件的副本,通过硬链接创建。创建表的 DDL 也被存储。快照可以由用户创建,也可以自动创建。cassandra.yaml 文件中的 snapshot_before_compaction 设置决定是否在每次压缩之前创建快照。默认情况下,snapshot_before_compaction 设置为 false。通过在 cassandra.yaml 中将 auto_snapshot 设置为 true(默认值),可以在键空间截断或删除表之前自动创建快照。由于自动快照,截断可能会延迟,cassandra.yaml 中的另一个设置决定协调器应该等待多长时间才能完成截断。默认情况下,Cassandra 等待 60 秒以完成自动快照。

增量备份是通过硬链接创建的表的 SSTable 文件的副本,当 memtable 刷新到磁盘作为 SSTable 时创建。通常,增量备份与快照配对,以减少备份时间并减少磁盘空间。增量备份默认情况下未启用,必须在 cassandra.yaml(使用 incremental_backups 设置)或使用 nodetool 中显式启用。启用后,Cassandra 会在键空间数据的 backups/ 子目录中为本地刷新的或流式传输的每个 SSTable 创建硬链接。还会创建系统表的增量备份。

数据目录结构

Cassandra 数据的目录结构包含用于键空间和表的不同目录,以及表目录中的数据文件。用于分别存储特定表的备份和快照的备份和快照目录也存储在表目录中。Cassandra 的目录结构如图 1 所示。

Data directory structure for backups

图 1. Cassandra 数据的目录结构

设置用于备份和快照的示例表

在本节中,我们将创建一些示例数据,这些数据可用于演示增量备份和快照。我们使用了三个节点的 Cassandra 集群。首先,创建键空间。然后在键空间中创建表,并添加表数据。我们使用了两个键空间 cqlkeyspacecatalogkeyspace,每个键空间中包含两个表。

创建键空间 cqlkeyspace

CREATE KEYSPACE cqlkeyspace
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

cqlkeyspace 键空间中创建两个表 tt2

USE cqlkeyspace;
CREATE TABLE t (
   id int,
   k int,
   v text,
   PRIMARY KEY (id)
);
CREATE TABLE t2 (
   id int,
   k int,
   v text,
   PRIMARY KEY (id)
);

向表中添加数据

INSERT INTO t (id, k, v) VALUES (0, 0, 'val0');
INSERT INTO t (id, k, v) VALUES (1, 1, 'val1');

INSERT INTO t2 (id, k, v) VALUES (0, 0, 'val0');
INSERT INTO t2 (id, k, v) VALUES (1, 1, 'val1');
INSERT INTO t2 (id, k, v) VALUES (2, 2, 'val2');

查询表以列出数据

SELECT * FROM t;
SELECT * FROM t2;

结果为

id | k | v
----+---+------
 1 | 1 | val1
 0 | 0 | val0

 (2 rows)


id | k | v
----+---+------
 1 | 1 | val1
 0 | 0 | val0
 2 | 2 | val2

 (3 rows)

创建第二个键空间 catalogkeyspace

CREATE KEYSPACE catalogkeyspace
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

catalogkeyspace 中创建两个表 journalmagazine

USE catalogkeyspace;
CREATE TABLE journal (
   id int,
   name text,
   publisher text,
   PRIMARY KEY (id)
);

CREATE TABLE magazine (
   id int,
   name text,
   publisher text,
   PRIMARY KEY (id)
);

向表中添加数据

INSERT INTO journal (id, name, publisher) VALUES (0, 'Apache Cassandra Magazine', 'Apache Cassandra');
INSERT INTO journal (id, name, publisher) VALUES (1, 'Couchbase Magazine', 'Couchbase');

INSERT INTO magazine (id, name, publisher) VALUES (0, 'Apache Cassandra Magazine', 'Apache Cassandra');
INSERT INTO magazine (id, name, publisher) VALUES (1, 'Couchbase Magazine', 'Couchbase');

查询表以列出数据

SELECT * FROM catalogkeyspace.journal;
SELECT * FROM catalogkeyspace.magazine;

结果为

id | name                      | publisher
----+---------------------------+------------------
 1 |        Couchbase Magazine |        Couchbase
 0 | Apache Cassandra Magazine | Apache Cassandra

 (2 rows)

id | name                      | publisher
----+---------------------------+------------------
 1 |        Couchbase Magazine |        Couchbase
 0 | Apache Cassandra Magazine | Apache Cassandra

 (2 rows)

快照

在本节中,我们将演示创建快照。用于创建快照的命令是 nodetool snapshot,其用法为

$ nodetool help snapshot

结果为

NAME
       nodetool snapshot - Take a snapshot of specified keyspaces or a snapshot
       of the specified table

SYNOPSIS
       nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]
               [(-pp | --print-port)] [(-pw <password> | --password <password>)]
               [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]
               [(-u <username> | --username <username>)] snapshot
               [(-cf <table> | --column-family <table> | --table <table>)]
               [(-kt <ktlist> | --kt-list <ktlist> | -kc <ktlist> | --kc.list <ktlist>)]
               [(-sf | --skip-flush)] [(-t <tag> | --tag <tag>)] [--] [<keyspaces...>]

OPTIONS
       -cf <table>, --column-family <table>, --table <table>
           The table name (you must specify one and only one keyspace for using
           this option)

       -h <host>, --host <host>
           Node hostname or ip address

       -kt <ktlist>, --kt-list <ktlist>, -kc <ktlist>, --kc.list <ktlist>
           The list of Keyspace.table to take snapshot.(you must not specify
           only keyspace)

       -p <port>, --port <port>
           Remote jmx agent port number

       -pp, --print-port
           Operate in 4.0 mode with hosts disambiguated by port number

       -pw <password>, --password <password>
           Remote jmx agent password

       -pwf <passwordFilePath>, --password-file <passwordFilePath>
           Path to the JMX password file

       -sf, --skip-flush
           Do not flush memtables before snapshotting (snapshot will not
           contain unflushed data)

       -t <tag>, --tag <tag>
           The name of the snapshot

       -u <username>, --username <username>
           Remote jmx agent username

       --
           This option can be used to separate command-line options from the
           list of argument, (useful when arguments might be mistaken for
           command-line options

       [<keyspaces...>]
           List of keyspaces. By default, all keyspaces

配置快照

为了演示在命令行上使用 Nodetool 创建快照,我们在 cassandra.yaml 文件中将 auto_snapshots 设置设置为 false

auto_snapshot: false

还将 snapshot_before_compaction 设置为 false 以禁用在压缩之前自动创建快照

snapshot_before_compaction: false

创建快照

在创建任何快照之前,搜索快照,将不会列出任何快照

$ find -name snapshots

我们将使用示例键空间和表来创建快照。

获取键空间中所有表的快照

使用上面的语法,为 catalogkeyspace 键空间中的所有表创建一个名为 catalog-ks 的快照

$ nodetool snapshot --tag catalog-ks catalogkeyspace

结果为

Requested creating snapshot(s) for [catalogkeyspace] with snapshot name [catalog-ks] and
options {skipFlush=false}
Snapshot directory: catalog-ks

使用上面的 find 命令,现在可以找到快照和 snapshots 目录,其中列出的文件类似于

./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots

可以类似地创建多个键空间中所有表的快照

$ nodetool snapshot --tag catalog-cql-ks catalogkeyspace, cqlkeyspace

获取键空间中单个表的快照

要获取单个表的快照,nodetool snapshot 命令语法将变为如下所示

$ nodetool snapshot --tag <tag> --table <table>  --<keyspace>

使用上面的语法,为 catalogkeyspace 键空间中的 magazine 表创建一个快照

$ nodetool snapshot --tag magazine --table magazine  catalogkeyspace

结果为

Requested creating snapshot(s) for [catalogkeyspace] with snapshot name [magazine] and
options {skipFlush=false}
Snapshot directory: magazine

获取来自同一键空间的多个表的快照

要获取键空间中多个表的快照,必须使用 --kt-list 选项指定 Keyspace.table 列表。例如,为 cqlkeyspace 键空间中的 tt2 表创建快照

$ nodetool snapshot --kt-list cqlkeyspace.t,cqlkeyspace.t2 --tag multi-table

结果为

Requested creating snapshot(s) for ["CQLKeyspace".t,"CQLKeyspace".t2] with snapshot name [multi-
table] and options {skipFlush=false}
Snapshot directory: multi-table

可以创建同一组表的多个快照,并使用不同的名称进行标记。例如,为 cqlkeyspace 键空间中的同一组表 tt2 创建另一个快照,并使用不同的标签标记快照

$ nodetool snapshot --kt-list cqlkeyspace.t, cqlkeyspace.t2 --tag multi-table-2

结果为

Requested creating snapshot(s) for ["CQLKeyspace".t,"CQLKeyspace".t2] with snapshot name [multi-
table-2] and options {skipFlush=false}
Snapshot directory: multi-table-2

获取来自不同键空间的多个表的快照

要获取来自不同键空间的多个表的快照,命令语法与多个表位于同一键空间中的情况相同。必须在 --kt-list 选项中分别指定每个 <keyspace>.<table>。

例如,为 cqlkeyspace 中的 t 表和 catalogkeyspace 中的 journal 表创建一个快照,并将快照标记为 multi-ks

$ nodetool snapshot --kt-list catalogkeyspace.journal,cqlkeyspace.t --tag multi-ks

结果为

Requested creating snapshot(s) for [catalogkeyspace.journal,cqlkeyspace.t] with snapshot
name [multi-ks] and options {skipFlush=false}
Snapshot directory: multi-ks

列出快照

要列出快照,请使用 nodetool listsnapshots 命令。我们在前面的示例中创建的所有快照都将列出

$ nodetool listsnapshots

结果为

Snapshot Details:
Snapshot name Keyspace name   Column family name True size Size on disk
multi-table   cqlkeyspace     t2                 4.86 KiB  5.67 KiB
multi-table   cqlkeyspace     t                  4.89 KiB  5.7 KiB
multi-ks      cqlkeyspace     t                  4.89 KiB  5.7 KiB
multi-ks      catalogkeyspace journal            4.9 KiB   5.73 KiB
magazine      catalogkeyspace magazine           4.9 KiB   5.73 KiB
multi-table-2 cqlkeyspace     t2                 4.86 KiB  5.67 KiB
multi-table-2 cqlkeyspace     t                  4.89 KiB  5.7 KiB
catalog-ks    catalogkeyspace journal            4.9 KiB   5.73 KiB
catalog-ks    catalogkeyspace magazine           4.9 KiB   5.73 KiB

Total TrueDiskSpaceUsed: 44.02 KiB

查找快照目录

可以使用 find –name snapshots 命令列出 snapshots 目录

$ find -name snapshots

结果为

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/snapshots
./cassandra/data/data/cqlkeyspace/t2-d993a390c22911e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots

要列出特定表的快照,首先更改到该表的快照目录。例如,列出 catalogkeyspace/journal 表的快照

$ cd ./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots && ls -l

结果为

total 0
drwxrwxr-x. 2 ec2-user ec2-user 265 Aug 19 02:44 catalog-ks
drwxrwxr-x. 2 ec2-user ec2-user 265 Aug 19 02:52 multi-ks

snapshots 目录列出了快照中的 SSTable 文件。还会在每个快照中创建一个 schema.cql 文件,该文件定义了从快照恢复时可以使用 CQL 重新创建表的模式

$ cd catalog-ks && ls -l

结果为

total 44
-rw-rw-r--. 1 ec2-user ec2-user   31 Aug 19 02:44 manifest.jsonZ
-rw-rw-r--. 4 ec2-user ec2-user   47 Aug 19 02:38 na-1-big-CompressionInfo.db
-rw-rw-r--. 4 ec2-user ec2-user   97 Aug 19 02:38 na-1-big-Data.db
-rw-rw-r--. 4 ec2-user ec2-user   10 Aug 19 02:38 na-1-big-Digest.crc32
-rw-rw-r--. 4 ec2-user ec2-user   16 Aug 19 02:38 na-1-big-Filter.db
-rw-rw-r--. 4 ec2-user ec2-user   16 Aug 19 02:38 na-1-big-Index.db
-rw-rw-r--. 4 ec2-user ec2-user 4687 Aug 19 02:38 na-1-big-Statistics.db
-rw-rw-r--. 4 ec2-user ec2-user   56 Aug 19 02:38 na-1-big-Summary.db
-rw-rw-r--. 4 ec2-user ec2-user   92 Aug 19 02:38 na-1-big-TOC.txt
-rw-rw-r--. 1 ec2-user ec2-user  814 Aug 19 02:44 schema.cql

清除快照

可以使用 nodetool clearsnapshot 命令清除或删除快照。必须指定特定的快照名称,或者必须指定 –all 选项。

例如,从 cqlkeyspace 键空间中删除名为 magazine 的快照

$ nodetool clearsnapshot -t magazine cqlkeyspace

或使用 –all 选项从 cqlkeyspace 中删除所有快照

$ nodetool clearsnapshot -all cqlkeyspace

增量备份

在以下部分中,我们将讨论配置和创建增量备份。

配置增量备份

要创建增量备份,请在 cassandra.yaml 中将 incremental_backups 设置为 true

incremental_backups: true

这是创建增量备份所需的唯一设置。默认情况下,incremental_backups 设置被设置为 false,因为每次数据刷新都会创建一组新的 SSTable 文件,如果要运行多个 CQL 语句,backups 目录可能会很快填满并占用存储表数据所需的存储空间。也可以使用 nodetool 命令 nodetool enablebackup 在命令行上启用增量备份。可以使用 nodetool disablebackup 命令禁用增量备份。可以使用 nodetool statusbackup 检查增量备份的状态,即它们是否已启用。

创建增量备份

在创建每个表后,使用 nodetool flush 命令刷新表数据。增量备份将被创建。

$ nodetool flush cqlkeyspace t
$ nodetool flush cqlkeyspace t2
$ nodetool flush catalogkeyspace journal magazine

查找增量备份

增量备份是在 Cassandra 的 data 目录内的表目录中创建的。可以使用以下命令找到备份。

$ find -name backups

结果为

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups
./cassandra/data/data/cqlkeyspace/t2-d993a390c22911e9b1350d927649052c/backups
./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/backups
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups

创建增量备份

本节将更详细地讨论如何使用之前创建的键空间和表创建增量备份。

刷新键空间和表

$ nodetool flush cqlkeyspace t

搜索备份和 backups 目录将列出一个备份目录,即使我们还没有添加任何表数据。

$ find -name backups

结果为

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups

检查 backups 目录将显示也没有备份文件

$ cd ./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups && ls -l

结果为

total 0

如果将一行数据添加到数据中,运行 nodetool flush 命令将刷新表数据,并将创建一个增量备份

$ nodetool flush cqlkeyspace t
$ cd ./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups && ls -l

结果为

total 36
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:32 na-1-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   43 Aug 19 00:32 na-1-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:32 na-1-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:32 na-1-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:32 na-1-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:32 na-1-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:32 na-1-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:32 na-1-big-TOC.txt

任何表的 backups 目录,例如 cqlkeyspace/t,都在该表的 data 目录中创建。

添加另一行数据并刷新将导致另一组增量备份文件。SSTable 文件带有时间戳,这将第一个增量备份与第二个增量备份区分开来

total 72
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:32 na-1-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   43 Aug 19 00:32 na-1-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:32 na-1-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:32 na-1-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:32 na-1-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:32 na-1-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:32 na-1-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:32 na-1-big-TOC.txt
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:35 na-2-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   41 Aug 19 00:35 na-2-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:35 na-2-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:35 na-2-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:35 na-2-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:35 na-2-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:35 na-2-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:35 na-2-big-TOC.txt

从增量备份和快照恢复

在删除表后恢复表的两个主要工具/命令是

  • sstableloader

  • nodetool refresh

快照本质上包含与增量备份相同的 SSTable 文件集,但包含一些额外的文件。快照包含一个 schema.cql 文件,用于创建 CQL 中表的架构 DDL。表备份不包含 DDL,必须从快照中获取,以便从增量备份中恢复。