elasticsearch冷热数据、读写分离

转载至:https://elasticsearch.cn/article/6127

前言

冷数据索引:查询频率低,基本无写入,一般为当天或最近2天以前的数据索引

热数据索引:查询频率高,写入压力大,一般为当天数据索引

一、冷热数据分离

几个ES关键配置解读:

  • 节点属性(后续索引及集群路由分布策略均依据此属性)
node.attr.box_type: hot
node.attr.zone: xxx
. . .

elasticsearch.yml 中可增加自定义配置,配置前缀为 node.attr,后续属性及值可自定义,如:box_type、zone、tag等,即为当前 es 节点增加标签,亦可在启动命令时设置:bin/elasticsearch -d -Enode.attr.box_type=hot

  • 索引路由分布策略
"index.routing.allocation.require.box_type": "hot"

可在索引模板setting中设置,也可通过rest api动态更新。意义为索引依据哪个属性标签,对分片、副本进行路由分布。

  • 集群路由分布策略(此策略比索引级路由策略权重高

目的:不将鸡蛋放进一个篮子中。

"cluster.routing.allocation.awareness.attributes": "box_type"

如上配置,新建索引时,索引分片及副本只会分配到含有 node.attr.box_type 属性的节点上。(该值可以为多个,如"box_type,zone"

若集群中的节点 box_type 值只有一个,如只有 hot,索引分片及副本会落在hot标签的节点上;若 box_type值包括hot、cool,则同一个分片与其副本将尽可能不在相同的box_type节点上。

此种场景使用于:同一个物理机含有多个ES节点,若这多个节点标签相同,使用此路由分布策略将尽可能保证相同物理机上不会存放同一个分片及其副本。

"cluster.routing.allocation.awareness.force.box_type.values": "hot,cool"

强制使分片与副本分离。若只有hot标签的节点,索引只有分片可以写入,副本无法分配;若有hot、cool两种标签节点,相同分片与其副本绝不在相同标签节点上。

二、数据读写分离

几点结论:

  • 若使当天索引及副本都写在SSD磁盘上,SSD磁盘使用量需20T以上,代价可能过高。(读写效率最高,但由于SSD节点肯定较少,读写都在相同节点上,节点压力会非常大)
  • 现有的方式,只使用普通的SATA磁盘存储,代价最低。(读写效率最低,即为当前运行状况)
  • 使用集群路由分配策略,SSD与SATA各存放1份数据,SSD磁盘需分配10T以上。(读写效率折中,均有较大提升)

若使用折中方案,另一个问题考虑:

SSD节点即有读操作,也有写操作,节点较少,压力还是较大,怎么实现mysql的主从模式,达到读写分离的效果?

目标:使主分片分配在SSD磁盘上,副本落在SATA磁盘上,读取时优先从副本中查询数据,SSD节点只负责写入数据。

实现步骤:

  1. 修改集群路由分配策略配置

    增加集群路由配置

    "allocation.awareness.attributes": "box_type",
    "allocation.awareness.force.box_type.values": "hot,cool"
    
  2. 提前创建索引

    提前创建下一天的索引,索引配置如下(可写入模板中):

    PUT log4x_trace_2018_08_11
    {
       "settings": {
         "index.routing.allocation.require.box_type": "hot",
         "number_of_replicas": 0
    }
    }
    

    此操作可使索引所有分片都分配在SSD磁盘中。

  3. 修改索引路由分配策略配置

    索引创建好后,动态修改索引配置

    PUT log4x_trace_2018_08_11/_settings
    {
     "index.routing.allocation.require.box_type": null,
     "number_of_replicas": 1
    }
    
  4. 转为冷数据

动态修改索引配置,并取消副本数

PUT log4x_trace_2018_08_11/_settings
{
 "index.routing.allocation.require.box_type": "cool",
 "number_of_replicas": 0
}

JAVA API

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.3/java-rest-high-indices-put-settings.html

上次更新时间: 2024/5/7 05:59:02