一、KWDB 容灾
WAL 概述
KWDB 采用预写式日志(Write-Ahead Logging,WAL),记录每个时序表的模式变更和数据变更,以实现时序数据库的数据灾难恢复、时序数据的一致性和原子性。
KWDB 默认会将保存在 WAL 日志缓存中的日志条目实时写入日志文件,每5分钟通过后台线程更新 WAL 文件和数据文件的 CHECKPOINT_LSN (检查点日志序列号),写入 CHECKPOINT WAL 日志,然后同步数据文件到磁盘。
系统正常停机时,KWDB 会主动同步数据文件到磁盘并更新 CHECKPOINT_LSN。系统出现宕机时,KWDB 重启时会从最新的 CHECKPOINT_LSN 回放日志,以保证数据完整性。这种机制确保了即使在系统崩溃的情况下,也能通过重新执行日志中的操作来恢复数据库的一致性。
KWDB 支持对以下操作进行预写式日志记录:
参数 | 描述 |
---|---|
INSERT | 写入时序数据 |
UPDATE | 更新时序数据 |
DELETE | 删除时序数据 |
CHECKPOINT | 检查点操作 |
BEGIN | 开始迷你事务,即将多个步骤合并为一个,要么全部成功,要么全部失败的操作 |
COMMIT | 结束迷你事务 |
ROLLBACK | 回滚迷你事务 |
TSBEGIN | 开始时序数据事务 |
TSCOMMIT | 结束时序数据事务 |
TSROLLBACK | 回滚时序数据事务 |
DDL_CREATE | 创建时序表 |
DDL_DROP | 删除时序表 |
DDL_ALTER_COLUMN | 修改时序表schema |
WAL 日志文件由多个文件组成,称为 WAL 日志文件组。默认情况下,WAL 日志文件组包含三个大小相同的日志文件,每个文件的大小为 64MB。这些日志文件保存在时序表数据同级目录下的 wal 子目录中,文件以 kwdb_wal 的形式进行命名。系统初始时会使用 kwdb_wal0 作为活动日志文件。当前日志文件写满后,系统会按照顺序创建或使用下一个日志文件,直到日志文件组中的所有文件都被写满,之后系统会重新使用 kwdb_wal0 继续写入。
WAL 设置
KWDB 支持通过set cluster setting <parameter> = <value>
SQL 语句来开启或关闭 WAL 日志功能、设置 WAL 日志同步周期、WAL 日志缓存大小、检查点周期,以及调整日志文件组的文件数量和每个日志文件的大小。
1、前提条件
用户为 admin 用户或 admin 用户的成员。
2、步骤
(1)根据需要开启或关闭 WAL日志功能,设置 WAL 日志同步周期。注意:实时写入 WAL 日志可能会显著影响数据写入速度。
SET CLUSTER SETTING ts.wal.flush_interval = <interval>;
默认值为0s,表示开启 WAL 日志功能,并且实时进行日志写入。设置值小于等于0时表示关闭 WAL 日志。设置值在0-200ms区间时,系统会实时写入 WAL 日志,设置值大于200ms时系统将根据实际设置值进行日志同步。
示例
SET CLUSTER SETTING ts.wal.flush_interval = 300 ms;
(2)根据需要设置 WAL 日志缓存大小。
SET CLUSTER SETTING ts.wal.buffer_size = <size>;
默认值为4 MiB,设置值应不小于4 MiB。
示例
SET CLUSTER SETTING ts.wal.buffer_size = 10 MiB;
(3) 根据需要设置 WAL 日志检查点周期。
SET CLUSTER SETTING ts.wal.checkpoint_interval = <interval>;
默认值为1分钟。建议在日常运行中设置大于1分钟的时间间隔。如果宕机恢复速度较慢,可以缩短此间隔,建议最小为1秒。
示例
SET CLUSTER SETTING ts.wal.checkpoint_interval = 10m;
(4)根据需要设置日志文件组的文件数量以及每个WAL日志文件的大小。
SET CLUSTER SETTING ts.wal.files_in_group = <number>;
SET CLUSTER SETTING ts.wal.file_size = <size>;
文件数量默认为3个,文件大小默认值为64MiB,建议将WAL日志文件组的总大小设置为数据库日增大小的1%~3%左右,可根据以下公式计算WAL日志文件使用的磁盘空间上限:
total_wal.file_size = ts.wal.file_size * ts.wal.files_in_group * table_number * replica_number / node_number
示例
SET CLUSTER SETTING ts.wal.files_in_group = 10;
SET CLUSTER SETTING ts.wal.file_size = 256 MiB;
KWDB 备份
KWDB 目前支持通过数据导入导出方式进行数据库库级别和表级别的数据备份
表级别数据导出
KWDB 支持使用 SQL 语句导出以下信息:
- 时序表或关系表的元数据及用户数据。元数据以 meta.sql 文件形式保存,用户数据以.csv 格式保存。
- 系统表数据:具体包括用户信息表、权限信息和集群配置表
导出过程中,如果目标位置不可达,系统会直接报错;如果因其他原因导致导出中断,系统会保留已成功导出的文件。
1、前提条件
- 用户拥有管理员权限。
- 如果要将数据导出到指定服务器,该服务器必须处于运行状态,可访问,且已开放 PUT 权限以支持文件上传。如果导出数据时需要创建文件夹以存放数据,用户还需要拥有在服务器上创建文件夹的权限。
2、SQL 语法
时序表和关系表的导出语法略有不同,时序表支持先筛选表数据范围后再导出,导出表数据时设置包围符、转义符和空值的表示形式,关系表暂不支持上述设置。
- 时序表筛选范围后导出
EXPORT INTO CSV "<expt_path>" FROM SELECT [ * | <column_list> ] FROM <table_name> [<where_clause>];
- 时序表导出
EXPORT INTO CSV "<expt_path>" FROM TABLE <table_name> WITH [ column_name | meta_only | data_only | delimiter = '<char>' | chunk_rows = '<number>' | enclosed = '<char>' | escaped = '<char>' | nullas = '<char>' ];
- 关系表导出
EXPORT INTO CSV "<expt_path>"
FROM TABLE <table_name>
WITH [ meta_only | data_only | delimiter = '<char>' | chunk_rows = '<number>' ];
- 用户信息表导出
EXPORT INTO CSV "<expt_path>" FROM TABLE system.users;
- 用户权限信息导出
EXPORT INTO CSV "<expt_path>" FROM SELELCT * FROM system.information_schema.table_privileges;
- 集群配置表导出
EXPORT INTO CSV "<expt_path>" FROM TABLE system.settings;
3、参数说明:
参数 | 描述 |
---|---|
expt_path | 导出文件的存放路径,支持nodelocal://<node_id>/<dir> 和<server_ip>/<dir> 两种格式。 一、nodelocal://<node_id>/<dir> :使用节点本地路径。 1、node_id :节点 ID,例如本地只有一个节点时,需要将 node_id 指定为1。 2、 dir :用户自定义的存放数据的文件夹名称。如果文件夹不存在,导出时系统会创建相应的文件夹,路径为用户安装 KWDB 时定义的 KWDB 数据存放路径,默认为/var/lib/kwdb/extern/<folder_name> 。 -二、 <server_ip>/<dir> :使用服务器地址。 1、 server_ip :服务器 IP 地址和端口,例如http://172.18.0.1:8090 2、 dir :用户自定义的存放数据的文件夹名称。如果文件夹不存在,导出时系统会创建相应的文件夹。 |
column_list | 用于指定需要导出的数据列和标签列,各列之间用逗号隔开。 |
table_name | 需要导出数据的表名。 |
where_clause | 可选参数,用于限制待导出的表数据范围,KWDB支持在where子句中使用以下运算符:1、比较运算符:> |