JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践( 三 )

JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
文章插图
下面这个示例中,在 table 目录下可以看到有 4 个子目录,每个子目录就是上文提到的 Part 。
$ ls -l /var/lib/clickhouse/data/<database>/<table>drwxr-xr-x2 testtest 64B Aug8 13:46 202208_1_3_0drwxr-xr-x2 testtest 64B Aug8 13:46 202208_4_6_1drwxr-xr-x2 testtest 64B Sep8 13:46 202209_1_1_0drwxr-xr-x2 testtest 64B Sep8 13:46 202209_4_4_图示的最右边这一列,每个子目录的名字前面可能是一个时间,比如 202208 类似这样的前缀,202208 其实就是 Partition 名 。Partition 名字是用户自己来定义的,但是按照约定俗成或者一些实践习惯,通常会使用时间来命名 。
比如,202208 这个 Partition,它会有两个子目录,子目录就是 Part,一个 Partition 通常会由多个 Part 来构成 。用户在往 ClickHoue 写入数据时,会先写到内存里,再根据内存里的数据结构,持久化到磁盘上 。同一个Partition 里面的数据如果比较大的话,在磁盘上就会变成很多 part 。ClickHouse 官方建议不要在一个 Table 下创建太多 Part,它会定期或者不定期地对 Part 进行合并,减少总的 Part 数量 。Merge 的概念就是合并 Part,这也是 MergeTree 这个引擎的名字来源之一 。
再通过一个例子来了解 Part 。Part 里会有很多小文件,有一些是元信息,比如索引信息,帮助用户快速查找数据 。
$ ls -l /var/lib/clickhouse/data/<database>/<table>/202208_1_3_0-rw-r--r--1 testtest?? Aug8 14:06 ColumnA.bin-rw-r--r--1 testtest?? Aug8 14:06 ColumnA.mrk-rw-r--r--1 testtest?? Aug8 14:06 ColumnB.bin-rw-r--r--1 testtest?? Aug8 14:06 ColumnB.mrk-rw-r--r--1 testtest?? Aug8 14:06 checksums.txt-rw-r--r--1 testtest?? Aug8 14:06 columns.txt-rw-r--r--1 testtest?? Aug8 14:06 count.txt-rw-r--r--1 testtest?? Aug8 14:06 minmax_ColumnC.idx-rw-r--r--1 testtest?? Aug8 14:06 partition.dat-rw-r--r--1 testtest?? Aug8 14:06 primary.id在示例的右侧,以 Column 作为前缀的这些文件是实际的数据文件,相比元信息通常会比较大 。这个示例中只有 A、B 两列,实际的表里可能有很多列 。所有这些文件,包括元信息、索引信息,都会共同帮助用户快速地在不同文件之间去做跳转或者查找 。
ClickHouse 存储策略如果要在 ClickHouse 里做冷热数据分层,会用到类似于 ES 中提到的生命周期策略,在 ClickHouse 里称为存储策略(Storage Policy) 。
与 ES 稍有不同,ClickHouse 官方并没有将数据划分不同的阶段,比如热数据、温数据、冷数据这些不同的阶段,ClickHouse 提供了一些规则和配置方法,需要用户自己来制定分层策略 。
每个 ClickHouse 节点支持同时配置多块磁盘,存储介质可以是多种多样的 。比如,一般用户为了性能会给 ClickHouse 节点配置 SSD 盘;对于一些温冷数据,用户可以把数据存储在成本更低的介质,如机械盘 。ClickHouse 的用户对底层存储介质是无感知的 。
与 ES 相似,ClickHouse 用户需要根据数据不同的维度特征去制定存储策略,比如每个 part 子目录的大小、整个磁盘的剩余空间比例等,当满足某个维度特征设定的条件时就会触发存储策略的执行 。这个策略会将某一个 part 从一块盘迁移到另外一块盘 。在 ClickHouse 中,一个节点配置的多块盘是有优先级的,默认情况下数据会优先落在最高优先级的盘上 。这样实现了 Part 从一个存储介质转移到另外一个存储介质上 。
通过 ClickHouse 的一些 SQL 命令,如 MOVE PARTITION/PART 命令可以手动触发数据迁移,用户也可以通过这些命令做一些功能性的验证 。其次有某些情况下,可能也希望能够通过手动的方式,而不是自动转移的方式来显式把 part 从当前的存储介质上转移到另外一个存储介质上 。

经验总结扩展阅读