菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
154
0

[ElasticSearch] ES集群状态由非正常状态(red)恢复为正常状态(green)的思路与实践

原创
05/13 14:22
阅读数 57540

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 文献

发表评论

0/200
154 点赞
0 评论
收藏