Clickhouse--AB表切换

20 篇文章 2 订阅
8 篇文章 0 订阅

☀️定义


AB 表切换的使用场景应该说还是很广泛的,比如历史表归档、批量抽数的时候都可以采用 AB 表切换的思路来实现。

比如有这样一个场景,test_a 是面向终端查询的数据表,数据每天定点全量更新。为了减少数据更新对查询的影响,这里准备用 AB 表切换的思路进行。

Clickhouse对于更新删除数据支持不友好,对于数据的更新采用整体更新AB表切换的方式的方式


⭐️工作使用

-- 切换表【在集群环境】
RENAME TABLE 
enterprise.company_info_125city_temp TO enterprise.company_info_125city_temp_temp, enterprise.company_info_125city TO enterprise.company_info_125city_temp, enterprise.company_info_125city_temp_temp TO enterprise.company_info_125city 
on cluster perftest_1shards_3replicas;
-- 清空临时表
TRUNCATE TABLE enterprise.company_info_125city_temp on cluster perftest_1shards_3replicas;

🏆资料

ClickHouse中快速实现AB表切换


以下内容为资料内容,方式2 未验证

🍍利用 RENAME 语法

  • 首先新建 AB 两张表
CREATE TABLE test_a_2021_04_29(
   id UInt32,
   name String,
   value UInt32
 )ENGINE = MergeTree()
 ORDER BY id
 
 CREATE TABLE test_a(
   id UInt32,
   name String,
   value UInt32
 )ENGINE = MergeTree()
 ORDER BY id
  • 首先向 test_a_2021_04_29 写入一千万测试数据:
INSERT INTO TABLE test_a_2021_04_29(id,name,value)
WITH(
  SELECT ['A','B','C','D','E','F','G']
)AS dict
SELECT number AS id, dict[number%7+1],id FROM numbers(10000000)
  • 写完之后进行 AB 切换:
RENAME TABLE test_a_2021_04_29 TO tmp, test_a TO test_a_2021_04_29, tmp TO test_a

Query id: d23eda37-b494-48ea-8a6f-64f319b172f6

Ok.

0 rows in set. Elapsed: 0.013 sec.
  • 可以发现,这里利用了一张临时表 tmp,实现了 AB 表名的切换

RENAME TABLE A TO C, B TO A, C TO B 虽然很方便,但也存在一定的风险,因为利用到了中间临时表,所以整个过程不是原子的,如果出现意外可能会导致不一致的情况发生.

🍋利用 EXCHANGE TABLES 语法

在新版本中,ClickHouse 提供了一种新的 Atomic 数据库引擎,在这个引擎下创建的数据表,能够支持无锁的 CREATE/DROP/RENAME 操作,并且支持
EXCHANGE TABLES A and B 直接交换两张表。

  • 首先新建一个 Atomic 数据库:
首先新建一个 Atomic 数据库:
  • 查看它的元数据,就会发现它和 Ordinary 数据库的不同:
% cat ./data/metadata/test_atom.sql 
ATTACH DATABASE _ UUID 'fa22ace8-05a9-4cba-9366-97e625fad12f'
ENGINE = Atomic
  • 元数据中,Atomic 数据库没有名字,取而代之的是一个 UUID。
    进一步查看数据库文件,也能发现不同。Ordinary 数据库是一个目录,而 Ordinary 数据库则是一个文件链接,指向了 store 目录下,以 UUID 为名称的目录。
% ls -l
total 24
drwxr-xr-x  27 nauu  staff  864  4 29 21:17 default
-rw-r-----   1 nauu  staff   42  8 10  2020 default.sql
drwxr-xr-x   6 nauu  staff  192  1 28 21:52 system
-rw-r-----   1 nauu  staff   41  1 28 21:51 system.sql
lrwxr-xr-x   1 nauu  staff   71  4 29 21:41 test_atom -> /media/psf/ch9-data/data/store/fa2/fa22ace8-05a9-4cba-9366-97e625fad12f
-rw-r-----@  1 nauu  staff   78  4 29 21:41 test_atom.sql
  • 在 Atomic 数据库下新建 AB 表:
CREATE TABLE test_atom.test_a_2021_04_29(
   id UInt32,
   name String,
   value UInt32
 )ENGINE = MergeTree()
 ORDER BY id
 
 CREATE TABLE test_atom.test_a(
   id UInt32,
   name String,
   value UInt32
 )ENGINE = MergeTree()
 ORDER BY id
  • 在以 test_atom 数据库 UUID 命名的目录下,发现了两张表的元数据:
% pwd
/data/store/fa2/fa22ace8-05a9-4cba-9366-97e625fad12f

% ls -l
total 16
-rw-r-----  1 nauu  staff  183  4 29 21:52 test_a.sql
-rw-r-----  1 nauu  staff  183  4 29 21:52 test_a_2021_04_29.sql
  • 同样的,这些表的元数据也没有表名,用唯一的 UUID 取而代之:
% cat ./test_a_2021_04_29.sql 
ATTACH TABLE _ UUID 'ae429533-a558-4e59-8232-950f5dc970be'
(
    `id` UInt32,
    `name` String,
    `value` UInt32
)
ENGINE = MergeTree
ORDER BY id
SETTINGS index_granularity = 8192

 % cat ./test_a.sql 
ATTACH TABLE _ UUID '2839166f-4c7c-4d57-ad21-8615a79d71f6'
(
    `id` UInt32,
    `name` String,
    `value` UInt32
)
ENGINE = MergeTree
ORDER BY id
SETTINGS index_granularity = 8192
  • 从系统表也能看出两种数据库的表差异,非 Atomic 是没有 UUID 的:
SELECT database ,name,uuid ,data_paths ,metadata_path FROM  `system`.tables t WHERE name = 'test_a'

请添加图片描述

  • 现在可以直接用 EXCHANGE TABLES 交换两张表,这个操作是原子的。
EXCHANGE TABLES test_atom.test_a AND test_atom.test_a_2021_04_29;

不过这里有一点值得注意,EXCHANGE TABLES 的原子性是利用了底层系统的 renameat2 命令。它只有至少在 linux kernel 3.15 的操作系统上才能支持。
所以如果你的 linux kernel 版本不够,是不能使用 EXCHANGE TABLES 的,会得到 RENAME EXCHANGE is not supported 的错误。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值