ClickHouse 简单使用(六)

10 备份和恢复

备份clickhouse 中的表,有很多种方法。

1. 备份数据库的文件

2. 将表导出为文本文件

3. 通过select … remote 语句复制表

4. 将表或者表分区冻结(freeze)或者摘除(detach,将其备份到特定目录。

5. 备份工具 clickhouse-copier

6. 备份工具ClickHouse-Backup

 

本章介绍上述几种备份方法和对应的恢复方法。

10.1 备份数据库文件

这种方法是复制ClickHouse 完整的数据目录。数据目录的路径是 config.xmlpath 属性的值。

恢复也很简单,只需要将数据目录替换为备份的数据目录即可。

10.2 将表导出为文本文件

这种方法是将表中的数据导出为文本文件。

例如,对于数据库 testdb.person, 导出的方法是执行命令:

ClickHouse-client -h 127.0.0.1 --port=9000 -u default -d default --query="select * from testdb.person" > /data/clickhouse/backup/testdb/person.tsv

 

恢复的方法是将文件导入到空表中,要求表已经创建。

cat /data/clickhouse/backup/testdb/person.tsv | clickhouse-client -h 127.0.0.1 --port=9000 -u default -d default --query="insert into testdb. person FORMAT TSV"

10.3 通过select … remote 语句复制表

remote 语法如下:

remote('addresses_expr', db_name, table_name[, 'user'[, 'password'])

 

例如, 如果你要使用用户clickhouse 备份10.19.134.26节点的表testdb.person,可以使用下面的sql

 

insert into table ch1 select * from remote ('10.19.134.26','testdb','person',’clickhouse’,'clickhouse');

 

10.4 将表或表分区冻结(freeze)或者摘除(detach

8.1节我们已经看到, alter table … freeze … 会将表备份到目录 shadow

中。而 alter table … detach… 会将分区备份到目录detached中,并从表中移除。它们可以用于表的备份。

10.4.1 使用 alter table … freeze … 备份

例如,我们希望备份分区表 testdb.worker,则可以像下面这样操作。

1. 首先,执行如下sql,冻结testdb.worker

alter table testdb.worker freeze;

 

这个命令会冻结整个分区表(再次强调冻结只是备份的方法,并不影响分区表的使用),进而在 /var/lib/clickhouse/shadow/ 中新增一个名称为一个数字的目录,例如1。如下图所示:

 

这个目录的子目录层级依次是 data/testdb/worker。 而表的数据存放在目录worker中。

 

 

2. 将这个目录复制或移动到你的备份目录下,注意给备份一个标志性的名字。

 

如果要恢复表 testdb.worker,只需用上一步备份的worker的目录替换 worker 表文件所在的目录 /var/lib/clickhouse/data/testdb/worker 即可。

10.4.2 使用 alter table … detach… 备份

这种方法可以用来备份特定的分区。

例如,如果希望备份worker 表的分区2,则可以像下面这样操作。

1. 执行如下sql,将分区2暂时摘除:

alter table testdb.worker detach partition 2;

 

这个命令会将worker 表的分区2摘除。在文件系统层面,它会在worker 表的数据目录 /var/lib/clickhouse/data/testdb/worker/ 中,将分区2对应的目录,例如2_2_2_0,移动到同一级的detach 目录中。

 

 

 

2. detach 目录中的2_2_2_0复制到你的备份目录。

 

3. 将分区2 重新添加到 testdb.worker 表上。

    alter table testdb.worker attach partition 2;

 

4. 如果要恢复这个分区,只需用上一步备份的目录2_2_2_0 中的内容(注意:不是用目录身)替换该分区所在的目录中的内容即可。需要注意一点,被分离的分区在重新附加到表上后,它的数据目录的名字会发生变化。2_2_2_0 可能会变成 2_4_4_0 或者其他。

可以通过下面的sql查看分区2所在的路径,然后进行替换:

Select partition,name, database, table,path from system.parts where table = 'worker'and partition = '2';

 

 

 

 

10.5 ClickHouse-copier

ClickHouse-copier 的作用将数据从一个群集中的表复制到另一(或相同)群集中的表。它与多副本数据复制的有几个重要的区别:

其一,ClickHouse-copier 的备份是单向的,数据是从源表复制到目标表;而多副本数据复制是多向的,数据在各个副本之间相互复制。

其二,ClickHouse-copier 支持将数据在同一集群内部或不同的集群,而多副本数据复制只支持同一集群中同一分片内的数据复制。

     其三,ClickHouse-copier 是一次性的备份,而数据复制是连续的。

 

本节的实验中,我们希望将节点 10.19.134.24 中的表testdb.worker 备份到10.19.134.27testdb.worker 中。

 

worker 表的定义如下:

create table testdb.worker

(

        id Int32,

        name String,

        gender Int16,

        birthday Date,

        cert_num String,

        department_id Int32

)

ENGINE = MergeTree()

primary key id

partition by department_id

ORDER BY id;

 

备份 testdb.worker 的方法如下:

1. 在目标10.19.134.27上创建数据库testdb运行下面的sql语句。

create database if not exists testdb;

 

接下来,接下来在源节点10.19.134.24 上,进行下列操作:

1. 参照8.2 节安装和配置zookeeper。只需一个节点即可。

 

2. /etc/clickhouse-server /中,创建目录层级 copytasks/task1/

cd /etc/clickhouse-server/

mkdir -p copytasks/task1

 

3. 创建复制任务文件schema.xml。这个文件的内容包括源和目标的集群分片信息,以及需要同步的表信息。

 

<yandex>

<remote_servers>

    <source_cluster>

        <shard>

            <weight>1</weight>

            <replica>

                <host>10.19.134.24</host>

                <port>9000</port>

             <user>clickhouse</user>

             <password>clickhouse</password>

            </replica>

        </shard>

    </source_cluster>

 

    <target_cluster>

        <shard>

            <weight>1</weight>

            <replica>

                <host>10.19.134.27</host>

                <port>9000</port>

                <user>clickhouse</user>

                <password>clickhouse</password>

            </replica>

        </shard>

    </target_cluster>

</remote_servers>

 

 <!-- How many simultaneously active workers are possible. If you run more workers superfluous workers will sleep. -->

    <max_workers>2</max_workers>

 

    <!-- Setting used to fetch (pull) data from source cluster tables -->

    <settings_pull>

        <readonly>1</readonly>

    </settings_pull>

 

    <!-- Setting used to insert (push) data to destination cluster tables -->

    <settings_push>

        <readonly>0</readonly>

    </settings_push>

 

    <!-- Common setting for fetch (pull) and insert (push) operations. Also, copier process context uses it.

         They are overlaid by <settings_pull/> and <settings_push/> respectively. -->

    <settings>

        <connect_timeout>3</connect_timeout>

        <!-- Sync insert is set forcibly, leave it here just in case. -->

        <insert_distributed_sync>1</insert_distributed_sync>

    </settings>

 

<tables>

    <table_person>

        <cluster_pull>source_cluster</cluster_pull>

        <database_pull>testdb</database_pull>

        <table_pull>person</table_pull>

 

        <cluster_push>target_cluster</cluster_push>

        <database_push>testdb</database_push>

        <table_push>person</table_push>

 

        <engine> ENGINE = MergeTree()

PARTITION BY department_id

PRIMARY KEY id

ORDER BY id

SETTINGS index_granularity = 8192

</engine>

    </table_person>

</tables>

</yandex>

 

上面的这个文件中,<remote_servers> 标签内部配置了源表所在的集群 <source_cluster> 和目标表(备份表)所在的集群<target_cluster>

标签 <table_person> 的内容是我们要备份的表,它的名称是我们自定义的。在其内部,<cluster_pull> 的值是我们上面定义的source_cluster<database_pull>的值是源表所在的数据库,<table_pull>的值是源表的名字。

标签 <cluster_push><database_push>testdb以及<table_push>则相反,分别代表目标表所在集群,目标表所在数据库和目标表。

标签 <engine>内容是这个表的引擎。如果目标数据库中没有创建这个表,那么配置它以后,目标表会自动创建。

 

如果有多张表需要同步,你可以在 <tables> 中再增加新的配置,与<table_person>格式类似,名称不同。

 

4. 进入zookeeper bin 目录,使用如下命令,在zookeeper中创建复制任务:

cd /opt/zookeeper-3.5.8/bin/

./zkCli.sh create /clickhouse/copytasks ””

./zkCli.sh create /clickhouse/copytasks/task1 ””

./zkCli.sh create /clickhouse/copytasks/task1/description "`cat /etc/clickhouse-server/copytasks/task1/schema.xml`"

这里,创建的任务在zookeeper中的znode路径是 /clickhouse/copytasks/task。关于znode的介绍,请自行查看zookeeper 文档。

 

5. /etc/clickhouse-server/ copytasks/task1 中,创建文件 zookeeper.xml,它用来配置备份需要的zookeeper 的地址。内容如下:

<yandex>

    <logger>

        <level>trace</level>

        <size>100M</size>

        <count>3</count>

    </logger>

    <zookeeper>

        <node index="1">

            <host>127.0.0.1</host>

            <port>2181</port>

        </node>

    </zookeeper>

</yandex>

 

6. 现在执行下面的命令,运行clickhouse-copier备份任务。

clickhouse-copier --config-file=/etc/clickhouse-server/copytasks/task1/zookeeper.xml --task-path=/clickhouse/copytasks/task1 --base-dir /etc/clickhouse-server/copytasks/task1/

 

下面解释上面的参数的含义:

--config-file  任务的zookeeper配置文件,xml文件中指定zk节点信息及copierlog配置信息

--task-path  上一步创建的任务的znode路径,此节点用于同步copier进程和存储任务。任务存储于 $task-path/description.

--base-dir  辅助文件的路径。设置这个参数后,clickhouse-copier会在$ base-dir中创建clickhouse-copier_YYYYMMHHSS_ <PID>子目录。如果省略此参数,则会在启动clickhouse-copier的目录中创建目录。

 

上述工作执行后,需要一定时间完成备份,具体取决于要复制的表的大小。此外,在完成此过程之前,它不会显示任何内容。之后,您应该检查日志文件以确认没有错误。

    上述的备份是一次性的,如果想周期性地备份,可以在定时任务中运行第5部中的命令。

10.6 备份工具ClickHouse-Backup

ClickHouse-Backup 是一个第三方备份工具。

它有以下特点:

1. 可以轻松创建和恢复所有或特定表的备份

2. 在文件系统上高效存储多个备份

3. 通过流压缩上传和下载

4. 支持增量备份在远程存储上

5. AWSAzureGCS、腾讯COSFTP兼容

 

安装和配置方法如下:

1. github 上下载 clickhouse-backup.tar.gz。本文下载的版本是clickhouse-backup-0.6.3

 

2. 解压下载的文件

    tar zxvf clickhouse-backup.tar.gz

3. 将解压后的目录clickhouse-backup移动到 /etc/ 中,这是官方推荐的地方。然后将目录clickhouse-backup中的命令文件 clickhouse-backup移动到 /usr/bin/中。

   mv ./clickhouse-backup /etc/

   mv /etc/clickhouse-backup/clickhouse-backup /usr/bin/

 

4. 进入解压后的目录,编辑config.xml

    cd /etc/clickhouse-backup

vi config.xml

 

   然后根据实际,设置下面的参数。这里分为全局配置项(general) clickhouse专有的配置项。

 

general:

  remote_storage: none

  disable_progress_bar: false

  backups_to_keep_local: 7

  backups_to_keep_remote: 31

clickhouse:

  username: clickhouse

  password: "clickhouse"

  host: localhost

  port: 9000

  data_path: "/var/lib/clickhouse/"

  skip_tables:

  - system.*

  timeout: 5m

  freeze_by_part: false

 

下面我们一些重要参数的含义:

    backups_to_keep_local:本地数据库备份的保留期限

    backups_to_keep_remote: 远程数据库的备份的保留期限

  data_pathClickhouse服务的总的数据目录的路径。ClickHouse的总数据目录默认 /var/lib/clickhouse

 

执行下列命令即可备份:

su clickhouse-backup

clickhouse-backup create my_backup --config /etc/clickhouse-backup/config.yml 

 

这条命令的作用是,读取 /etc/clickhouse-backup/config.yml 中的信息,并在本地的备份总目录 /var/lib/clickhouse/backup(如果没有则会创建)中,创建名为 my_backup的备份。

--config的默认参数值是 /etc/clickhouse-backup/config.yml

 

 

如果不指定备份的名称,它生成的备份的名称格式是 yyyy-mm-ddThh-mi-ss 例如2020-12-24T12-34-05,这是伦敦时间。

 

 

如果想备份多个集群节点,你可以创建多个配置文件,每次运行clickhouse-backup 加载不同的配置文件。

 

要查看备份文件可以执行

clickhouse-backup list

 

 

   使用备份文件mybackup恢复数据库:

   clickhouse restore my_backup

 

 

关于更多用法可以查看clickouse 的帮助信息:

 

[root@node02 backup]# clickhouse-backup --help

NAME:

   clickhouse-backup - Tool for easy backup of ClickHouse with cloud support

 

USAGE:

   clickhouse-backup <command> [-t, --tables=<db>.<table>] <backup_name>

 

VERSION:

   0.6.2

 

DESCRIPTION:

   Run as 'root' or 'clickhouse' user

 

COMMANDS:

   tables          Print list of tables

   create          Create new backup

   upload          Upload backup to remote storage

   list            Print list of backups

   download        Download backup from remote storage

   restore         Create schema and restore data from backup

   flashback       flashback to backup

   delete          Delete specific backup

   default-config  Print default config

   freeze          Freeze tables

   clean           Remove data in 'shadow' folder

   server          Run API server

   help, h         Shows a list of commands or help for one command

 

GLOBAL OPTIONS:

   --config FILE, -c FILE  Config FILE name. (default: "/etc/clickhouse-backup/config.yml") [$CLICKHOUSE_BACKUP_CONFIG]

   --help, -h              show help

   --version, -v           print the version

参考资料

[1] Yandex. Clickhouse Document

[2] Yandex. 如何构建 ClickHouse 发布包 

[3] digdeep.clickhouse安装和入门. 2020-04-06

[4] 技术即艺术. Clickhouse集群部署. 2019-12-05

[5] 小琪的大爷Clickhouse集群应用、分片、复制. 2018-09-05

[6] gentleman_hai. centos7下编译clickhouse. 2019-11-30

[7] 金科. Clickhouse-copier简介. 2019-01-22

[8] 小得盈满.ClickHouse高可用集群的配置. 2018-07-23

[9] 万能修实验室. ClickHouse 备份与恢复. 2020-10-30

 

posted @ 2021-02-06 12:17  草色青青送马蹄  阅读(2564)  评论(0编辑  收藏  举报