zoukankan      html  css  js  c++  java
  • [ElasticSearch] ES集群状态由非正常状态(red)恢复为正常状态(green)的思路与实践

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

  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/13574008.html
Copyright © 2011-2022 走看看