Elasticsearchソースコード分析のクラスタ健康


一つのESクラスターを、王朝にたとえると、3つの状態は、こんなものです.
  • 緑、太平盛世、国はとても良い
  • 黄色、奸臣当道、国家危在旦夕
  • 赤、皇上は朝に行かないで、どちらが我慢できないのか
  • 緑なら男耕女織、何をするべきか、気にしないで、黄色なら、どの王朝に奸臣がいないのか、我慢できます.しかし赤色であれば、ひどく、ひどく、ほぼしばらく待ってからクラスタが回復します.はい、感性的な認識がありますが、それはいったいどういうことですか.
  • 緑、すべて正常
  • 黄色、コピー損失
  • 赤、プライマリスライス損失
  • ここを見て、おおらかで、こんなに簡単ですね.分かりました.でも、ちょっと待って、ブログを閉じないでください.私たちとして、追求している私たちがいて、このように簡単にだまされてはいけませんか.コードを見なければならないのは真理であり、コードこそ最も真実である.もし学生たちが比喩に満足しなければ、私たちは続けて、私たちは本当に来ます.
    クラスタの健全性の表示
    curl http://localhost:9200/_cluster/health?pretty=true
    {
      "cluster_name" : "mycluster",
      "status" : "green",
      "timed_out" : false,
      "number_of_nodes" : 4,
      "number_of_data_nodes" : 4,
      "active_primary_shards" : 778,
      "active_shards" : 1556,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 0
    }

    集団健康類
    返されるこれらの情報は、どういう意味ですか?IDEを開いて探します...最後に
    クラスタ状態
    public enum ClusterHealthStatus {
        GREEN((byte) 0),
        YELLOW((byte) 1),
        RED((byte) 2);
        //....

    スライスルーティングテーブルの状態
    public enum ShardRoutingState {
        /**
         *             .
         */
        UNASSIGNED((byte) 1),
        /**
         *         (                  ).
         */
        INITIALIZING((byte) 2),
        /**
         *       .
         */
        STARTED((byte) 3),
        /**
         *       .
         */
        RELOCATING((byte) 4);
        //....

    スライスルーティングテーブル
    public class ImmutableShardRouting implements Streamable, Serializable, ShardRouting {
    //...
    @Override
        public boolean unassigned() {
            return state == ShardRoutingState.UNASSIGNED;
        }
    
        @Override
        public boolean initializing() {
            return state == ShardRoutingState.INITIALIZING;
        }
    
        @Override
        public boolean active() {
            return started() || relocating();
        }
    
        @Override
        public boolean started() {
            return state == ShardRoutingState.STARTED;
        }
    
        @Override
        public boolean relocating() {
            return state == ShardRoutingState.RELOCATING;
        }
     //...

    ここを見て、少し分かったようですが、始まったり移転中のスライスは、アクティブスライスで、ちょうどメインスライスで、それはアクティブマスタースライスです.なるほど、しかし、学生たちはまた言います.これらは実体類にすぎません.せいぜい小さいですね.焦らないで、見続けましょう.
    クラスタヘルスコンピューティング
    TransportClusterHealthActionクラスのclusterHealth()メソッドは、クラスタの健康的な計算を担当し、親クラスから優れた伝統を受け継ぎ、Masterノードでこれらの操作を実行します.Masterノードにこの要求を送信していない場合は、大丈夫です.転送します.先にいくつかの待機情報の処理をして、私たちはしばらく関心を持っていないで、テーマに直行します.
    private ClusterHealthResponse clusterHealth(ClusterHealthRequest request, ClusterState clusterState) {
            if (logger.isTraceEnabled()) {
                logger.trace("            ,   [{}]", clusterState.version());
            }
            
            //       ,    ,      routingTable   metaData     。
            //   :       ,     5   ,    routingTable ,  4 ,     。
            RoutingTableValidation validation = clusterState.routingTable().validate(clusterState.metaData());
            
            ClusterHealthResponse response = new ClusterHealthResponse(clusterName.value(), validation.failures());
            response.numberOfNodes = clusterState.nodes().size();
            response.numberOfDataNodes = clusterState.nodes().dataNodes().size();
    
            String[] concreteIndices;
            try {
                concreteIndices = clusterState.metaData().concreteIndicesIgnoreMissing(request.indices());
            } catch (IndexMissingException e) {
                return response;
            }
            //    ,  3   ,    ,    
            for (String index : concreteIndices) {
                IndexRoutingTable indexRoutingTable = clusterState.routingTable().index(index);
                IndexMetaData indexMetaData = clusterState.metaData().index(index);
                if (indexRoutingTable == null) {
                    continue;
                }
                ClusterIndexHealth indexHealth = new ClusterIndexHealth(index, indexMetaData.numberOfShards(), indexMetaData.numberOfReplicas(), validation.indexFailures(indexMetaData.index()));
    
                for (IndexShardRoutingTable shardRoutingTable : indexRoutingTable) {
                    ClusterShardHealth shardHealth = new ClusterShardHealth(shardRoutingTable.shardId().id());
                    for (ShardRouting shardRouting : shardRoutingTable) {
                        if (shardRouting.active()) {	//        ,      ,   
                            shardHealth.activeShards++;
                            if (shardRouting.relocating()) {
                                // the shard is relocating, the one he is relocating to will be in initializing state, so we don't count it
                                shardHealth.relocatingShards++;		//       
                            }
                            if (shardRouting.primary()) {
                                shardHealth.primaryActive = true;	//  ,      
                            }
                        } else if (shardRouting.initializing()) {
                            shardHealth.initializingShards++;	//       
                        } else if (shardRouting.unassigned()) {
                            shardHealth.unassignedShards++;	//    
                        }
                    }
                    if (shardHealth.primaryActive) {
                        if (shardHealth.activeShards == shardRoutingTable.size()) {	//            
                            shardHealth.status = ClusterHealthStatus.GREEN;
                        } else {
                            shardHealth.status = ClusterHealthStatus.YELLOW;
                        }
                    } else {
                    	//     ,     ,     ,         
                        shardHealth.status = ClusterHealthStatus.RED;
                    }
                    indexHealth.shards.put(shardHealth.getId(), shardHealth);
                }
    
                for (ClusterShardHealth shardHealth : indexHealth) {
                    if (shardHealth.isPrimaryActive()) {
                        indexHealth.activePrimaryShards++;
                    }
                    indexHealth.activeShards += shardHealth.activeShards;
                    indexHealth.relocatingShards += shardHealth.relocatingShards;
                    indexHealth.initializingShards += shardHealth.initializingShards;
                    indexHealth.unassignedShards += shardHealth.unassignedShards;
                }
                //          
                indexHealth.status = ClusterHealthStatus.GREEN;
                if (!indexHealth.getValidationFailures().isEmpty()) {
                    indexHealth.status = ClusterHealthStatus.RED;
                } else if (indexHealth.getShards().isEmpty()) { // might be since none has been created yet (two phase index creation)
                    indexHealth.status = ClusterHealthStatus.RED;
                } else {
                    for (ClusterShardHealth shardHealth : indexHealth) {
                        if (shardHealth.getStatus() == ClusterHealthStatus.RED) {	//           ,          
                            indexHealth.status = ClusterHealthStatus.RED;
                            break;
                        }
                        if (shardHealth.getStatus() == ClusterHealthStatus.YELLOW) {
                            indexHealth.status = ClusterHealthStatus.YELLOW;
                        }
                    }
                }
    
                response.indices.put(indexHealth.getIndex(), indexHealth);
            }
    
            for (ClusterIndexHealth indexHealth : response) {
                response.activePrimaryShards += indexHealth.activePrimaryShards;
                response.activeShards += indexHealth.activeShards;
                response.relocatingShards += indexHealth.relocatingShards;
                response.initializingShards += indexHealth.initializingShards;
                response.unassignedShards += indexHealth.unassignedShards;
            }
            response.status = ClusterHealthStatus.GREEN;
            if (!response.getValidationFailures().isEmpty()) {
                response.status = ClusterHealthStatus.RED;
            } else if (clusterState.blocks().hasGlobalBlock(RestStatus.SERVICE_UNAVAILABLE)) {	//Ping   
                response.status = ClusterHealthStatus.RED;
            } else {
            	//         ,          
            	// The cluster status is controlled by the worst index status.
                for (ClusterIndexHealth indexHealth : response) {
                    if (indexHealth.getStatus() == ClusterHealthStatus.RED) {
                        response.status = ClusterHealthStatus.RED;
                        break;
                    }
                    if (indexHealth.getStatus() == ClusterHealthStatus.YELLOW) {
                        response.status = ClusterHealthStatus.YELLOW;
                    }
                }
            }
    
            return response;
        }