TimeStream内置了downsample功能,用户可以直接通过简单的配置,就能用到时序场景常用的downsample功能。
我们来看一个简单的downsample配置:
PUT _time_stream/test_stream
{
"time_stream": {
"downsample": [
{
"interval": "1m",
"settings": {
"index.lifecycle.name": "my-rollup-ilm-policy_60m",
"index.number_of_shards": "1"
}
},
{
"interval": "10m"
}
]
}
}
创建test_stream索引时,指定了2个downsample配置。一个是1分钟精度的donwsample规则,一个是10分钟精度的downsample。
downsample具体使用可见:https://help.aliyun.com/document_detail/437036.html#section-f4y-zgp-fvk
这里有详细的介绍。
这里主要简单说下TimeStream downsample原理。
TimeStream downsample功能利用了前面说到的ES的downsample功能。downsample提供了原子API,可以将一个索引downsample成指定精度的索引。
TimeStream就是使用这个接口,然后增加了调度功能。在索引进行rollover后,旧的索引一段时间不再写入后(目前TimeStream会等到旧索引24小时不再写入数据),将索引设置write block,然后开始对索引进行downsample操作。
这里TimeStream有个优化,在配置多个downsample规则时,TimeStream会对interval进行排序,downsample使用的原索引不是原始索引,而是上一个downsample索引。比如上述interval=10m的downsample操作,TimeStream是将interval=1m的索引作为原索引,而不是原始索引。
优化前:
source_index -> interval_1m_index
source_index -> interval_10m_index
优化后:
source_index -> interval_1m_index -> interval_10m_index
由于使用了更粗粒度的索引作为downsample原索引,可以极大的加速downsample的时间。