当前位置:快读报网 >> 生活资讯 >> 文章正文

ClickHouse和他的朋友(14)存储计算分离方案及实现

发布于:2020-12-27 被浏览:3099次

原文来源:https://Bohu Tang . me/2020/09/18/click house-and-friends-compute-storage/

最后更新: 2020年9月18日

如果多个ClickHouse服务器可以挂载相同的数据(分布式存储等。),而且每个服务器都能写,会有什么好处?

首先,我们可以把复制机制交给分布式存储,保证上层架构变得简单易行;

其次,clickhouse-server可以在任何机器上增加或减少,以充分发挥存储和计算能力。

本文将讨论ClickHouse的存储和计算分离方案,该方案在实现上并不复杂。

1.问题

ClickHouse运行时数据由两部分组成:内存元数据和磁盘数据。

我们先来看看写作过程:

W1。开始写数据

W2。生成存储零件信息并维护零件元数据列表

W3。将零件数据写入磁盘

我们来看看阅读过程:

R1。找到要从零件元数据中读取的零件

R2。从磁盘读取零件数据

R3。数据返回到上层

这样,如果server1写入一条数据,它只会更新自己内存中的部分元数据,其他服务器并不会察觉到,所以无法查询刚刚写入的数据。

在存储和计算的分离中,首先要解决的问题是内存状态数据的同步。

在ClickHouse中,我们需要解决内存中部分元数据的同步问题。

2.内存数据同步

在前面的ReplicatedMergeTree表引擎及同步机制,中,我们知道了副本之间的数据同步机制:首先,同步元数据,然后通过元数据获取相应的部分数据。

这里借用ReplicatedMergeTree同步通道,然后做减法。在同步元数据之后,我们跳过了部分数据的同步,因为只需要一个服务器来更新磁盘数据(需要fsync语义)。

核心代码:mergetreedata :重命名Tempartandreplace

if(!share_storage)

part-renameTo(part_name,true);

3.演示演示

两台clickhouse-server启动,它们都挂载同一个数据路径/home/Bohu/work/cluster/D1/data//path

通过clickhouse-server1(端口9101)写入记录:(111,3333)

通过clickhouse-server2(端口9102)查询正常

使用clickhouse-server2(端口9102)截断表

通过clickhouse-server1(端口9101)查询正常

4.代码实现

因为没有实现DDL,所以zookeeper上的注册方式比较棘手,demo中的副本都是手工注册的。

5.摘要

本文提供了一个思路,算是抛砖引玉。同时也期待更系统的工程实现。

ClickHouse还不支持分布式查询功能。如果这种能力支持它,ClickHouse的存储-计算分离是一个小氢弹,具有无与伦比的力量。

标签: 数据 内存 磁盘
最新文章
猜你喜欢
本类推荐
TOP 10