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


node.roles: ["data_hot", "data_content"]生命周期策略在了解完 Data Stream 、Index Lifecycle Management、Node Role 这些概念以后,就可以为数据创建一些不同的生命周期策略(Lifecycle Policy) 。
【JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践】根据生命周期策略中定义的不同维度的索引特征,如索引的大小、索引里的文档的数量、索引创建的时间,ES 可以自动地帮用户把某个生命周期阶段的数据滚动到另一个阶段,在 ES 中的术语是 rollover 。
比如,用户可以制定基于索引大小维度的特征 , 把热数据滚动到温数据 , 或者根据一些其它规则 , 再把温数据滚动到冷数据 。这样 , 索引在不同生命周期的阶段之间去滚动的时候,相应的它索引的数据也会去做迁移和滚动 。ES 可以自动完成这些工作,但是生命周期策略则需要用户自己来定义 。
下面的截图,是 Kibana 的管理界面,用户可以通过图形化的方式去配置生命周期策略 。可以看到有三个阶段,从上到下分别是热数据、温数据以及冷数据 。

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

文章插图
展开其中热数据阶段的高级设置,可以看到更详细,上文提到的基于不同维度特征的策略配置,如在下图右边看到的这三个选项 。
JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践

文章插图
  1. 索引的大?。疽馔忌系睦邮?50GB,当索引的大小超过 50GB 的时候,就会把它从热数据阶段滚动到温数据阶段 。
  2. 最大的文档数,ES 里索引的单元是文档,用户数据是以文档的形式写入 ES 中的,所以文档数也是一个可以衡量的指标 。
  3. 最大索引创建时间,这里的示例是 30 天,假设某个索引已经创建了 30 天了,这个时候就会触发刚刚提到的从热数据阶段到温数据的滚动 。
02- ClickHouse 数据分层架构详解下图是一组从大到小的俄罗斯套娃,它非常形象地展现了 ClickHouse 的数据管理模式 ,  MergeTree 引擎 。
  • Table: 在图片的最右边是一个最大的概念,用户最开始要创建或者能够直接接触到的就是 Table;
  • Partition:是一个更小的维度或者更小的粒度 。在 ClickHouse 里,数据分成 Partition 来存储,每个 Partition 会有一个标识;
  • Part:在每个 Partition 中,又会再进一步地细分为多个 Part 。如果查看 ClickHouse 磁盘上存储的数据格式,可以认为每一个子目录就是一个 Part;
  • Column:在 Part 里会看到一些更小粒度的数据,即 Column 。ClickHouse 的引擎使用的是列式存储,所有的数据都是按照列存的方式来组织 。在 Part 目录里会看到很多列,比如 Table 可能有100 列,就会有 100 个 Column 文件;
  • Block:每个 Column 文件里是按照 Block 的粒度来组织 。

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

推荐阅读