天天看点

elasticsearch 集群unassign shards故障二 ---磁盘分片配额策略*介绍磁盘分片配额策略 介绍

磁盘分片配额策略 介绍

问题:集群unassign shards 故障

[2019-08-07T10:24:26,053][INFO ][o.e.c.r.a.DiskThresholdMonitor] [skye-1] low disk watermark [85%] exceeded on [sCr8-8UdSI2Di06LAdnpbg][skye-3][/data/elasticsearch-6.2.0/data/nodes/0] free: 134.7gb[13.6%], replicas will not be assigned to this node
[2019-08-07T10:24:56,058][INFO ][o.e.c.r.a.DiskThresholdMonitor] [skye-1] low disk watermark [85%] exceeded on [5uby7FwmQ2uk41lirnyiNw][skye-1][/data/elasticsearch-6.2.0/data/nodes/0] free: 132.2gb[13.4%], replicas will not be assigned to this node
[2019-08-07T10:24:56,058][INFO ][o.e.c.r.a.DiskThresholdMonitor] [skye-1] low disk watermark [85%] exceeded on [sCr8-8UdSI2Di06LAdnpbg][skye-3][/data/elasticsearch-6.2.0/data/nodes/0] free: 134.7gb[13.6%], replicas will not be assigned to this node
           

原因:

ES的分片默认情况下受控于ES集群节点的数据盘磁盘空间,有4个参数进行控制。默认情况下,当数据盘使用超过85%,Elasticsearch不会将分片分配给使用磁盘超过85%的节点。

可以通过"cluster.routing.allocation.disk.threshold_enabled=false" 来关闭磁盘容量的限制,看网上好多人的解决方案是这样的,简单粗暴。但当系统磁盘真的满了的时候,这个是不安全的。elasticsearch 为了保障数据的安全可用才做了基于磁盘容量的分片策略。我们来看下这四个控制参数:

cluster.routing.allocation.disk.threshold_enabled
默认为true。设置为false禁用磁盘分配决策程序。

cluster.routing.allocation.disk.watermark.low
控制磁盘使用的低水位线。它默认为85%,这意味着Elasticsearch不会将分片分配给使用磁盘超过85%的节点。它也可以设置为绝对字节值(如500mb),以防止Elasticsearch在小于指定的可用空间量时分配分片。此设置不会影响新创建的索引的主分片,或者特别是之前从未分配过的任何分片。

cluster.routing.allocation.disk.watermark.high
控制高水印。它默认为90%,意味着Elasticsearch将尝试从磁盘使用率超过90%的节点重新定位分片。它也可以设置为绝对字节值(类似于低水印),以便在节点小于指定的可用空间量时将其从节点重新定位。此设置会影响所有分片的分配,无论先前是否分配。

cluster.routing.allocation.disk.watermark.flood_stage
控制洪水阶段水印。它默认为95%,这意味着Elasticsearch index.blocks.read_only_allow_delete对每个索引强制执行只读索引块(),该索引在至少有一个磁盘超过泛洪阶段的节点上分配了一个或多个分片。这是防止节点耗尽磁盘空间的最后手段。一旦有足够的可用磁盘空间允许索引操作继续,就必须手动释放索引块。
           

简单来讲,ES 有4个参数:是否启用磁盘分片策略,高水位,低水位,最后的防线洪水水位。高低水位洪水水位默认情况下的值为85%,90%,95%。

当ES数据节点所在磁盘使用率超过85%,ES进去低水位线,Elasticsearch不会将分片分配给该节点。

当ES数据节点所在磁盘使用率超过90%,ES进去高水位线,Elasticsearch将分片重新定位分配到其他节点。

当ES数据节点所在磁盘使用率超过95%,ES进去洪水水位线,Elasticsearch将进入只读状态。

ES的磁盘分片配额策略在很多情况下可能不符合需求,比如我们的数据盘又1T,当磁盘使用率在85%是可用磁盘还有150G,在某种场景下该磁盘还可以存储"大量"数据,我们需要手动修改磁盘配额值:

修改磁盘分片策略:

方法一: API 在线修改

curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "98%",
  }
}
'
           

此方案可以临时修改集群的磁盘配额值,但重启后失效。集群环境下,我们可以在业务低峰期手动修改每台的值,依次重启服务。但在单节点或压力较大的情况下,可以使用临时修改的方式,修改集群状态,然后修改ES的配置文件,再下次重启后自动生效。

方法二:

# vim elasticsearch.yml

  cluster.routing.allocation.disk.threshold_enabled: true 
  cluster.routing.allocation.disk.watermark.flood_stage: 200mb
  cluster.routing.allocation.disk.watermark.low: 500mb 
  cluster.routing.allocation.disk.watermark.high: 300mb
           

注意事项:

  1. ES的三个水位控制可以配置为磁盘使用量百分比,也设置为具体的数值(比如300G),但设置要统一,要么都是百分比,要么都是具体的值
  2. ES的三个水位控制的值要遵循下面的原则,否则不生效:

    低水位 < 高水位 < 水平水位

  3. ES的三个水位控制 均存在默认值,若不设置则采用默认值。但若配置,则需要注意四个值都要配置,经常被人忽略的就是

    cluster.routing.allocation.disk.watermark.flood_stage

    ,该值不设置将不生效。

参考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html#disk-allocator

https://stackoverflow.com/questions/33369955/low-disk-watermark-exceeded-on

继续阅读