ElasticSearch 存储时序数据

公司有一个业务需要用到 ES 来存储时序数据, 然而 ES 是一个搜索引擎, 我们需要做一些结合 ES 和业务的设计.
我们采用了基于时间的 indice 策略, 即每天新建一个 indice 存储当天的数据.

为什么

主要有以下几点考虑:

删除数据

目前每天需要存储 TB 级别的数据, 但因为存储是有限的, 而且业务上不需要永久存储长期数据, 只保留一个时间段的数据 ( 比如半年 ).
那么, 如何来删除数据呢 ?

如果是使用一个 indice , 那删除时只能查询后 bulk delete , 但 ES 的删除文档并不是物理删除, 只是 marked as deleted, 只有在下一次段合并时进行删除.

因此, 采用基于时间的 indice 就有这个好处, 删除数据是只需要调用 Index Delete 接口就可以完成, 更加方便和可靠.

分片大小

如果不按时间切分, 由于 shard 数目是不可修改的, 这将会导致 shard 过大.
shard 过大, 在 shard 初始化或 reallocate 时将是灾难, 网络和磁盘 IO 开销巨大, 加载时间过长.

搜索性能

  1. 搜索时间范围时速度更快, 因为有些 indice 可以通过 indice name 判断是否加入到搜索范围.
  2. 分片数目不是固定的, 容易拓展, 并行度可以提高.

易用性

AliasIndex Template 可以让我们很方便的应用这个设计策略, 不用担心有过多的额外开发.

我们可以建立 Alias 来映射多个 indice , 比如 last_week :

POST /_aliases
{
"actions": [
{ "add": { "alias": "data_last_week", "index": "data_20170115" }},
{ "remove": { "alias": "data_last_week", "index": "data_20180107" }}
]
}

使用 Index Template 可以不用每天手动去创建索引, 具体参考 Index Templates | Elasticsearch Reference [master] | Elastic