当前位置:快读报网 >> 生活资讯 >> 文章正文
ClickHouse和他的朋友(14)存储计算分离方案及实现
原文来源: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的存储-计算分离是一个小氢弹,具有无与伦比的力量。