使用clickhouse-backup备份和恢复数据

命名难
• 阅读 179

作者:俊达

介绍

clickhouse-backup是altinity提供的一个clickhouse数据库备份和恢复的工具,开源项目地址:https://github.com/Altinity/clickhouse-backup

功能上能满足日常数据库备份恢复的需求:

  • 支持单表/全库备份
  • 支持备份上传到S3/FTP等存储
  • 支持单表/全库恢复

本文对备份工具的使用做一些介绍。

clickhouse-backup工具介绍

clickhouse-backup命令行

可以使用clickhouse-backup命令行工具进行备份和恢复操作。使用clickhoues-backup有几个前提条件

  • 需要能访问clickhoues的数据目录(如/var/lib/clickhoues, 在docker或k8s环境中,需要将数据卷挂载到同样的路径)
  • 需要有clickhouse账号,能访问clickhouse服务,执行一些sql
  • 可以使用参数文件进行配置,默认在/etc/clickhouse-backup/config.yml

命令行参数:

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

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

VERSION:
   1.3.2

DESCRIPTION:
   Run as 'root' or 'clickhouse' user

COMMANDS:
   tables          Print list of tables
   create          Create new backup
   create_remote   Create and upload
   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
   restore_remote  Download and restore
   delete          Delete specific backup
   default-config  Print default config
   print-config    Print current config
   clean           Remove data in 'shadow' folder from all `path` folders available from `system.disks`
   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

命令行参数比较直观,

  • print-config: 打印当前配置
  • default-config: 打印默认配置
  • create: 创建备份
  • create_remote: 创建备份,并上传到指定存储
  • restore:创建表结构,恢复数据
  • restore_remote: 下载备份文件,恢复数据
  • list:列出备份集
  • download:下载备份集
  • delete:删除备份集
  • server:启动服务。外部可以使用api方式发起备份、恢复任务。适合在容器化环境中使用。

clickhouse-backup 工作机制(k8s)

可以通过命令行的方式使用clickhouse-backup。

如果clickhouse server运行在k8s中,可以开启clickhouse-backup server模式,将clickhouse-backup和clickhouse-server运行在同一个pod中,便于访问数据目录。

整体架构如下图:
使用clickhouse-backup备份和恢复数据

上图中的文件操作,除上传下载外,都是使用了硬连接(hard link)的方式,效率很高,也不会占用大量额外的磁盘空间。

clickhouse-backup也支持增量备份。增量备份通过对比2次全量备份产生的part文件来实现。只在将文件上传到remote存储时进行(create_remote, upload),才会进行增量文件对比,恢复一个增量备份时,会以递归的方式下载对应的基础备份。

备份流程

数据备份的步骤大致如下:

1、获取需要备份的表的列表、表的相关元数据(如show create table)。
2、对每一个需要备份的表,使用alter table freeze命令创建表的一个快照
3、将步骤2创建的快照文件,move到backup目录。由于在同一个文件系统,move通常很快。
4、如果需要上传,处理文件上传。

数据恢复流程

数据恢复的步骤和备份的步骤相反

1、创建表结构(使用备份过程中生成的建表语句)
2、如果需要,下载备份文件
3、将文件move到clickhouse 相关表的detatched目录
4、执行alter table attach part命令,将数据恢复到表中。

clickhouse-backup api

clickhouse-backup server开启api服务。可以通过调用api来发起备份/恢复。

# clickhouse-backup server
2022/05/06 16:12:50.845160  info Starting API server on localhost:7171
2022/05/06 16:12:50.869711  info Update last backup size metrics start (onlyLocal=false)
2022/05/06 16:12:50.906673  info SELECT value FROM `system`.`build_options` where name='VERSION_INTEGER'
2022/05/06 16:12:50.921257  info SELECT * FROM system.disks;
2022/05/06 16:12:50.934209  info Update last backup size metrics finish duration=64ms
root@node1:~# curl localhost:7171
Documentation: https://github.com/AlexAkulov/clickhouse-backup#api-configuration
/
/
/backup/tables
/backup/tables/all
/backup/list
/backup/list/{where}
/backup/create
/backup/clean
/backup/upload/{name}
/backup/download/{name}
/backup/restore/{name}
/backup/delete/{where}/{name}
/backup/status
/backup/actions
/backup/actions

Intergration tables
配置文件中开启create_integration_tables,会在system库中创建backup_actions、backup_list表

## /etc/clickhouse-backup/config.yml

api:
  listen: localhost:7171
  enable_metrics: true
  enable_pprof: false
  username: ""
  password: ""
  secure: false
  certificate_file: ""
  private_key_file: ""
  create_integration_tables: true
  allow_parallel: false

backup_actions

CREATE TABLE system.backup_actions
(
    `command` String,
    `start` DateTime,
    `finish` DateTime,
    `status` String,
    `error` String
)
ENGINE = URL('http://127.0.0.1:7171/backup/actions', 'JSONEachRow')
SETTINGS input_format_skip_unknown_fields = 1

backup_list

CREATE TABLE system.backup_list
(
    `name` String,
    `created` DateTime,
    `size` Int64,
    `location` String,
    `required` String,
    `desc` String
)
ENGINE = URL('http://127.0.0.1:7171/backup/list', 'JSONEachRow')
SETTINGS input_format_skip_unknown_fields = 1

这是2个URL存储引擎的表。
往backup_actions表写入数据,就会调用clickhouse-backup server对应的借口,发起备份任务。
查询backup_list表,可以获取到备份列表。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
RMAN备份恢复
1介绍RMAN是RecoveryManager的缩写,为Oracle的恢复管理器,是Oracle数据库推荐提供的一种恢复和备份数据库的工具,也是数据库管理员管理数据库常用的工具之一。它是物理备份,而EXP是逻辑备份它可以实现一致性备份,非一致性备份,增量备份,而exp且做不到很多第三方的工具也是调用rman的脚本来实现备份功能,如赛门铁克,NBU
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(