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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM