备份
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 所示。
图 1. Cassandra 数据的目录结构
设置用于备份和快照的示例表
在本节中,我们将创建一些示例数据,这些数据可用于演示增量备份和快照。我们使用了三个节点的 Cassandra 集群。首先,创建键空间。然后在键空间中创建表,并添加表数据。我们使用了两个键空间 cqlkeyspace
和 catalogkeyspace
,每个键空间中包含两个表。
创建键空间 cqlkeyspace
CREATE KEYSPACE cqlkeyspace
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
在 cqlkeyspace
键空间中创建两个表 t
和 t2
。
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
中创建两个表 journal
和 magazine
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
键空间中的 t
和 t2
表创建快照
$ 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
键空间中的同一组表 t
和 t2
创建另一个快照,并使用不同的标签标记快照
$ 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
增量备份
在以下部分中,我们将讨论配置和创建增量备份。
配置增量备份
要创建增量备份,请在 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
任何表的 |
添加另一行数据并刷新将导致另一组增量备份文件。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