[ElasticSearch] ES集群状态由非正常状态(red)恢复为正常状态(green)的思路与实践
阅读原文时间:2023年07月05日阅读:1

1 场景描述

1.1 资源与原规划

三台主机组成ES集群的规划:

集群名: xxx_elastic

  • 172.15.3.7 es1 master
  • 172.15.3.8 es2 (非master)
  • 172.15.3.9 es3 (非master)

1.2 原集群状态

https://172.15.3.7:9200/_cluster/health?pretty
{
  "cluster_name" : "xxx_elastic",
  "status" : "red",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 492,
  "active_shards" : 553,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 95,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 85.3395061728395
}

集群的异常之处: number_of_nodes / cluster status / unassigned_shards

  • number_of_nodes: 3

    (正常情况下,应该是: 3)

  • cluster status: red

    (正常情况下,应该是: green)

    red: 非健康状态; 部分的分片可用,表明分片有一部分损坏。一般情况下,表明存在 unassigned 的索引分片(shards:碎片,分片)。
    此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好;
    这种情况Elasticsearch集群至少一个主分片(以及它的全部副本)都在缺失中。
    这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

    yellow: 亚健康状态;基本的分片可用,但是备份不可用(或者是没有备份);
    这种情况Elasticsearch集群所有的主分片已经分片了,但至少还有一个副本是缺失的。
    不会有数据丢失,所以搜索结果依然是完整的。
    不过,你的高可用性在某种程度上被弱化。
    如果更多的分片消失,就会丢数据了。
    把 yellow 想象成一个需要及时调查的警告。

    green: 最健康状态;说明所有的分片包括备份都可用; 这种情况Elasticsearch集群所有的主分片和副本分片都已分配, Elasticsearch集群是 100% 可用的。

  • unassigned_shards: 95

    (正常情况下,应该是: 0)

unssigned 即 未分配副本分片的问题

2 解决思路

以消除 unassigned_shards:0 为主要目标

step1 确保集群节点数达到理论节点数

即 恢复全部ES节点合为1个ES集群

(这能大幅度,乃至完全地消除 unassigned_shards 的数量)

本操作完成后,unsigned状态的索引碎片(shards)由95个降低为25个

  • 修正为正确的ES节点名称(node.name)

    vi /etc/elasticsearch/elasticsearch.yml
    #
    # Use a descriptive name for the node:
    #
    node.name: es3

  • 确保集群所有节点: 启动状态 + 开机自启

    [CentOS6]
    [root@es1 ~]# chkconfig elasticsearch on (开机自启)
    [root@es3 ~]# service elasticsearch start (启动ES服务)

    [CentOS7]
    [root@es1 ~]# systemctl enable elasticsearch (开机自启)
    [root@es3 ~]# systemctl start elasticsearch (启动ES服务)

  • 新节点加入集群

    以 配置丢失的节点node8(es2)加入目标集群 为例

    elasticsearch.yml的配置项 推荐文献: elasticsearch配置

    [node7 / node8 / node9]
    vi /etc/elasticsearch/elasticsearch.yml
    # 配置向master节点单播通信的IP(默认通信端口为9200)
    # 单播配置下,节点向指定的主机发送单播请求
    # 默认配置中的主机对应的对外通信端口为9200;若该主机对外通信端口非9200端口时,需具体指定
    # 一般可只填写master节点
    discovery.zen.ping.unicast.hosts: ["172.15.3.7"]
    # 设置master的个数
    discovery.zen.minimum_master_nodes: 1
    transport.tcp.port: 9300

    [node8 / node9] 取消 node8 / node9 节点的默认(master)配置;
    vi /etc/elasticsearch/elasticsearch.yml
    node.master: false

step2 消除剩余 unassigned 的 索引分片(shards)

red状态的索引,要么reroute,要么删除之

[浏览器] https://172.15.3.7:9200/_nodes?pretty
    找到node8节点的唯一主机标识 jprFXcCqRVGCSNU3M02ZbQ

[浏览器] https://172.15.3.7:9200/_cat/shards?v
    查找 UNASSIGNED 的索引
或者
[root@es1 ~]# curl --insecure -u admin:admin "https://172.15.3.9:9200/_cat/shards" | grep UNASSIGNED
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
sharedb_bae200fe08354928976fd075bb944a5e_20191223160406                              1 p UNASSIGNED
sharedb_bae200fe08354928976fd075bb944a5e_20191223160406                               3 p UNASSIGNED
sharedb_01d4aa88707448dc9010030249a0b8ab_20200401151836                                p UNASSIGNED
...

[root@es1]# curl -XDELETE -u admin:admin --insecure "https://172.15.3.7:9200/sharedb_bae200fe08354928976fd075bb944a5e_20191223160406 "
{"acknowledged":true}

(逐次删除状态为red的索引, sharedb_bae200fe08354928976fd075bb944a5e_20191223160406 为索引号)

Over~~

{
  "cluster_name" : "xxx_elastic",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 542,
  "active_shards" : 609,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

补充:ES的安装/配置 文件的一般路径

ps -ef | grep elasticsearch

/etc/elasticsearch/...
/etc/elasticsearch/elasticsearch.yml

/usr/share/elasticsearch/...
/usr/share/elasticsearch/logs/...
/usr/share/elasticsearch/plugins/search-guard-6/tools/hash.sh
/usr/share/elasticsearch/plugins/search-guard-6/tools/sgadmin.sh
/usr/share/elasticsearch/plugins/search-guard-6/sgconfig/sg_internal_users.yml

/opt/elsatic-6.4.1/...
/opt/elsatic-6.4.1/configure_file/elasticsearch.yml

/home/elasticsearch/...

X 文献

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章