Databend 是一个运用 Rust 研制、开源、彻底面向云架构的新式数仓,供给极速的弹性扩展才能,致力于打造按需、按量的 Data Cloud 产品体验。具有以下特色:

  • 开源 Cloud Data Warehouse 明星项目

  • Vectorized Execution 和 Pull&Push-Based Processor Model

  • 真实的存储、计算别离架构,高性能、低成本,按需按量运用

  • 完好的数据库支撑,兼容 MySQL ,Clickhouse 协议

  • 完善的业务性,支撑 Time Travel, Database Clone, Data Share 等功能

  • 支撑根据同一份数据的多租户读写、共享操作

现在运用 Databend 的用户越来越多后,咱们面对一个问题,运用 Databend 怎么备份呢?是不是需要好像 MySQL 相同每天做一个物理备份或是逻辑备份呢?答案是:或许还有更好的办法。这篇文章和咱们聊一下 Databend 中数据的生命周期,然后再来看 Databend 怎么做备份管理。

首先咱们来看一下 Databend 的架构

图片

Databend 的写入操作是有业务性确保,根据业务隔离 RR 完成的,底层的数据存储是根据目标存储,实质上数据的持久化安全也是依赖于底层的目标存储,所以挑选云厂商的 S3, OSS, COS 也是不错的挑选,假如是自建的 minio, ceph 一定要做集群确保。因为是根据目标存储写入,所以使命的写入都能够理解为是一个增量操作,这也让 Databend 省掉了日志管理,更多的需要把表和对应的 snapshot 相关起来就能够让数据康复到恣意的时刻点。接下来分 4 个方面看看 Databend 怎么运用目标存储完成一个无须备份,但数据永久不丢失的方案。

Databend 数据生命周期中心:Snapshot

在讲 Databend snapshot 之前,抛出来一个问题:

  • 假如想拜访一个表 5 分钟前的数据怎么处理,

  • 一个 delete from tb ; 没有 where 条件怎么康复?

假如在其他数据库这两个需求,根本都是灾祸。但在 Databend 中,这些是非常轻松能够完成的。演示如下:

MySQL [default]> create table d_tb1(c1 int, c2 varchar);
Query OK, 0 rows affected (0.011 sec)
MySQL [default]> insert into d_tb1 values(1,'databend');
Query OK, 0 rows affected (0.018 sec)
MySQL [default]> insert into d_tb1 values(2,'MySQL');
Query OK, 0 rows affected (0.016 sec)
MySQL [default]> insert into d_tb1 values(3,'Hive');
Query OK, 0 rows affected (0.016 sec)
MySQL [default]> insert into d_tb1 values(4,'Hbase');
Query OK, 0 rows affected (0.016 sec)
MySQL [default]> select * from d_tb1;
+------+----------+
| c1   | c2       |
+------+----------+
|    1 | databend |
|    3 | Hive     |
|    2 | MySQL    |
|    4 | Hbase    |
+------+----------+
4 rows in set (0.018 sec)

根据 snapshot 读取数据

一共写入了 4 行数据,咱们来看一下对应的 snapshot 相关的数据:

MySQL [default]> select snapshot_id,previous_snapshot_id, timestamp from fuse_snapshot('default','d_tb1');
+----------------------------------+----------------------------------+----------------------------+
| snapshot_id                      | previous_snapshot_id             | timestamp                  |
+----------------------------------+----------------------------------+----------------------------+
| b031e57aa06443cc9d3ffadb3023dec6 | 34b8df220edc4d8cb9e3e76118788686 | 2022-08-30 01:19:06.367120 |
| 34b8df220edc4d8cb9e3e76118788686 | 4bb479751b7144d8aa2b53e5b281453f | 2022-08-30 01:18:53.202724 |
| 4bb479751b7144d8aa2b53e5b281453f | a2801ed9656d42c9812f2921214f0795 | 2022-08-30 01:18:35.597615 |
| a2801ed9656d42c9812f2921214f0795 | NULL                             | 2022-08-30 01:18:21.750208 |
+----------------------------------+----------------------------------+----------------------------+
4 rows in set (0.007 sec)

咱们看到 previouse_snapshot_id 为 NULL 是第一次写入的操作。对应的数据是:insert into d_tb1 values(1,’databend’);假如想读取这个 snapshot 的数据办法:

MySQL [default]> select * from d_tb1 at(SNAPSHOT=>'a2801ed9656d42c9812f2921214f0795');
+------+----------+
| c1   | c2       |
+------+----------+
|    1 | databend |
+------+----------+
1 row in set (0.010 sec)

看到这儿是不是觉得这儿充满了魔法了。同样也能够运用时刻来拜访前史的数据:

MySQL [default]> select * from d_tb1 at(timestamp=>'2022-08-30 01:18:21.750208'::timestamp);
+------+----------+
| c1   | c2       |
+------+----------+
|    1 | databend |
+------+----------+
1 row in set (0.010 sec)

这个时刻不用精确值,只用比当行对应的 timestamp 值大,小于上面一行的 timestamp 就能够获取对应的精确数据。

再来看一下 delete 没有 where 条件的操作:

MySQL [default]> delete from d_tb1;
Query OK, 0 rows affected (0.012 sec)
MySQL [default]> select * from d_tb1;
Empty set (0.010 sec)
MySQL [default]> select snapshot_id,previous_snapshot_id, timestamp from fuse_snapshot('default','d_tb1');
+----------------------------------+----------------------------------+----------------------------+
| snapshot_id                      | previous_snapshot_id             | timestamp                  |
+----------------------------------+----------------------------------+----------------------------+
| ec52197b4c344f8d8a353eff8a812de7 | b031e57aa06443cc9d3ffadb3023dec6 | 2022-08-30 01:32:03.227960 |
| b031e57aa06443cc9d3ffadb3023dec6 | 34b8df220edc4d8cb9e3e76118788686 | 2022-08-30 01:19:06.367120 |
| 34b8df220edc4d8cb9e3e76118788686 | 4bb479751b7144d8aa2b53e5b281453f | 2022-08-30 01:18:53.202724 |
| 4bb479751b7144d8aa2b53e5b281453f | a2801ed9656d42c9812f2921214f0795 | 2022-08-30 01:18:35.597615 |
| a2801ed9656d42c9812f2921214f0795 | NULL                             | 2022-08-30 01:18:21.750208 |
+----------------------------------+----------------------------------+----------------------------+
5 rows in set (0.007 sec)

从上面的 snapshot 来看,添加一个新的 snapshot,所以咱们为了拜访 delete 的数据,就能够运用 at 句子拜访前一个 snapshot 就能够,如下:

MySQL [default]> select * from d_tb1 at(snapshot=>'ec52197b4c344f8d8a353eff8a812de7');
Empty set (0.010 sec)
MySQL [default]> select * from d_tb1 at(snapshot=>'b031e57aa06443cc9d3ffadb3023dec6');
+------+----------+
| c1   | c2       |
+------+----------+
|    3 | Hive     |
|    4 | Hbase    |
|    2 | MySQL    |
|    1 | databend |
+------+----------+
4 rows in set (0.011 sec)

康复这个表,也能够考虑:

create table d_tb1_new as select * from d_tb1 at(snapshot=>'b031e57aa06443cc9d3ffadb3023dec6')

再进行 rename 操作即可。关于 at 语法参考:databend.rs/doc/referen… Databend 运用底层时运用的目标存储,一切的写入都是增量写入。例如:关于 Delete 也只是操作的 meta 并没有真实的删除数据。这也是 Databend 的一个特性:Time travle。

Snapshot 终极大招

在上面的演示中,咱们看到运用 Databend 的 at 句子加上 snapshot 和 timestamp 完成对表恣意时刻点和操作前的拜访。在最终康复数据时,咱们还需要借助于建一个新表,然后 Select 出来数据,然后对外拜访。那有没有更快的办法呢?Databend 永久不会让你绝望,当然更快的办法。接下来给你演示一下。首先咱们来一下 d_tb1 和 snapshot_location 对应联系:

MySQL [default]> select snapshot_id, snapshot_location from fuse_snapshot('default','d_tb1');
+----------------------------------+------------------------------------------------------+
| snapshot_id                      | snapshot_location                                    |
+----------------------------------+------------------------------------------------------+
| ec52197b4c344f8d8a353eff8a812de7 | 1/15967/_ss/ec52197b4c344f8d8a353eff8a812de7_v1.json |
| b031e57aa06443cc9d3ffadb3023dec6 | 1/15967/_ss/b031e57aa06443cc9d3ffadb3023dec6_v1.json |
| 34b8df220edc4d8cb9e3e76118788686 | 1/15967/_ss/34b8df220edc4d8cb9e3e76118788686_v1.json |
| 4bb479751b7144d8aa2b53e5b281453f | 1/15967/_ss/4bb479751b7144d8aa2b53e5b281453f_v1.json |
| a2801ed9656d42c9812f2921214f0795 | 1/15967/_ss/a2801ed9656d42c9812f2921214f0795_v1.json |
+----------------------------------+------------------------------------------------------+
5 rows in set (0.007 sec)
MySQL [default]> show create table d_tb1;
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
| d_tb1 | CREATE TABLE `d_tb1` (
  `c1` INT,
  `c2` VARCHAR
) ENGINE=FUSE SNAPSHOT_LOCATION='1/15967/_ss/ec52197b4c344f8d8a353eff8a812de7_v1.json' |
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.006 sec)

从上面的信息中能够看来,每个表后面经过 SNAPSHOT_LOCATION 的对应的版别对应起来。那么假如咱们创立一个根据前面 snapshot_id 对应的 snapshot_location 对应的位置,会怎么样呢?来操作一下:

MySQL [default]> CREATE TABLE `d_tb2` (
    ->   `c1` INT,
    ->   `c2` VARCHAR
    -> ) ENGINE=FUSE SNAPSHOT_LOCATION='1/15967/_ss/b031e57aa06443cc9d3ffadb3023dec6_v1.json';
Query OK, 0 rows affected (0.013 sec)
MySQL [default]> select * from d_tb2;
+------+----------+
| c1   | c2       |
+------+----------+
|    3 | Hive     |
|    1 | databend |
|    2 | MySQL    |
|    4 | Hbase    |
+------+----------+
4 rows in set (0.010 sec)

能够看到数据又回来了。这样也能够经过 rename 的办法直接对外,供给服务。是不是感觉到更神奇。根据 Snapshot 的引用创立表,也是咱们 Databend 数据 Share 的一个中心。Snapshot 办法的数据管理,也让 Databend 天然具有了 RR 业务隔离级的读写操作。

总结

在上面的文章中咱们演示了 snapshot 在 Databend 关于数据生命周期的拜访操控。这儿有一个中心便是云目标存储不能炸了。在这个前题下,假如备份 Databend 的数据能够有以下几种办法:

  • 每天备份一下对应的表结构。
  • 每天备份一下对应表的 fuse_snapshot 对应输出。
  • 假如是自建的存储能够添加副本数来添加安全性。

关于 Databend

Databend 是一款开源、弹性、低成本,根据目标存储也能够做实时分析的新式数仓。期待您的关注,一同探索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend 文档:databend.rs/

  • Twitter:twitter.com/Datafuse_La…

  • Slack:datafusecloud.slack.com/

  • Wechat:Databend

  • GitHub :github.com/datafuselab…

图片
文章首发于公众号:Databend