ES 학습 노트 의 - Christer State 학습

앞에서 ES 의 get api 전체적인 사고방식 을 연구 하여 ES 플러그 인 을 작성 할 때 참고 로 삼 았 다.그 당시 의 중점 은 전체 절 차 를 이해 하 는 데 있 었 는데 주로 shardOperation() 의 방법 내부 의 호출 논 리 였 고 shards() 방법 을 약화 시 켰 다.실제로 shards() 방법 은 ES 의 구조 적 측면 을 이해 하 는 데 더 큰 역할 을 한다.우 리 는 get api 부터 이해 해 야 한다 shards().
먼저 get api 의 사용 절 차 를 돌 이 켜 보 자.
      ES:
 curl -XPUT 'http://localhost:9200/test1/type1/1' -d '{"name":"hello"}'

     ID    :
 curl -XGET 'http://localhost:9200/test1/type1/1' 

사용 이 간단 합 니 다.그러나 분포 식 을 감안 하면 뒤의 논 리 는 쉽 지 않다.만약 ES 클 러 스 터 에 3 개의 노드 가 있다 면 데이터 가 있 는 색인 도 3 개의 블록 이 있 고 각각 하나의 사본 이 있다.즉 index 의 설정 은 다음 과 같 습 니 다.
{
  "test1" : {
    "settings" : {
      "index" : {
        "number_of_replicas" : "1",
        "number_of_shards" : "3"
      }
    }
  }
}

그럼 id 가 1 인 doc 는 그 조각 에 나 눠 줘 야 하나 요?이 문 제 는 상세 한 박문 해답 이 필요 하 다. 여기 서 우 리 는 먼저 간단하게 결론 을 내 려 야 한다.
     ,ES     id    hash ,     Murmur3HashFunction,      id      。     MathUtils.mod(hash, indexMetaData.getNumberOfShards());               id,  ES       0   。

존재 할 줄 모 르 는데, 어찌 취 할 줄 알 겠 는가?
데이터 추출 의 핵심 절 차 를 다시 정리 합 니 다.
s1:     id         。          ,              。

s2:            ,      ,     。                ,    ,        ,            。

위의 두 단 계 는 모두 하나의 핵심 데이터 구조 ClusterState 와 관련 되 어 있 습 니 다. 우 리 는 _cluster/state?pretty 를 사용 하여 이 데이터 구 조 를 볼 수 있 습 니 다.
# http://localhost:9200/_cluster/state?pretty

{
  "cluster_name" : "elasticsearch",
  "version" : 4,
  "state_uuid" : "b6B739p5SbanNLyKxTMHfQ",
  "master_node" : "KnEE25tzRjaXblFJq5jqRA",
  "blocks" : { },
  "nodes" : {
    "KnEE25tzRjaXblFJq5jqRA" : {
      "name" : "Mysterio",
      "transport_address" : "127.0.0.1:9300",
      "attributes" : { }
    }
  },
  "metadata" : {
    "cluster_uuid" : "ZIl7g86YRiGv8Dqz4DCoAQ",
    "templates" : { },
    "indices" : {
      "test1" : {
        "state" : "open",
        "settings" : {
          "index" : {
            "creation_date" : "1553995485603",
            "uuid" : "U7v5t_T7RG6rNU3JlGCCBQ",
            "number_of_replicas" : "1",
            "number_of_shards" : "1",
            "version" : {
              "created" : "2040599"
            }
          }
        },
        "mappings" : { },
        "aliases" : [ ]
      }
    }
  },
  "routing_table" : {
    "indices" : {
      "test1" : {
        "shards" : {
          "0" : [ {
            "state" : "STARTED",
            "primary" : true,
            "node" : "KnEE25tzRjaXblFJq5jqRA",
            "relocating_node" : null,
            "shard" : 0,
            "index" : "test1",
            "version" : 2,
            "allocation_id" : {
              "id" : "lcSHbfWDRyOKOhXAf3HXLA"
            }
          }, {
            "state" : "UNASSIGNED",
            "primary" : false,
            "node" : null,
            "relocating_node" : null,
            "shard" : 0,
            "index" : "test1",
            "version" : 2,
            "unassigned_info" : {
              "reason" : "INDEX_CREATED",
              "at" : "2019-03-31T01:24:45.845Z"
            }
          } ]
        }
      }
    }
  },
  "routing_nodes" : {
    "unassigned" : [ {
      "state" : "UNASSIGNED",
      "primary" : false,
      "node" : null,
      "relocating_node" : null,
      "shard" : 0,
      "index" : "test1",
      "version" : 2,
      "unassigned_info" : {
        "reason" : "INDEX_CREATED",
        "at" : "2019-03-31T01:24:45.845Z"
      }
    } ],
    "nodes" : {
      "KnEE25tzRjaXblFJq5jqRA" : [ {
        "state" : "STARTED",
        "primary" : true,
        "node" : "KnEE25tzRjaXblFJq5jqRA",
        "relocating_node" : null,
        "shard" : 0,
        "index" : "test1",
        "version" : 2,
        "allocation_id" : {
          "id" : "lcSHbfWDRyOKOhXAf3HXLA"
        }
      } ]
    }
  }
}

전체 구조 가 비교적 복잡 해서 우 리 는 천천히 분해 하여 한 걸음 한 걸음 씩 격파 했다.해체 의 사 고 는 역시 장면 을 사용 하 는 것 부터 시작 하 는 것 이다.
  • IndexMetaData 의 학습 metaData 의 형식 은 다음 과 같다.
    "metadata" : {
    "cluster_uuid" : "ZIl7g86YRiGv8Dqz4DCoAQ",
    "templates" : { },
    "indices" : {
      "test1" : {
        "state" : "open",
        "settings" : {
          "index" : {
            "creation_date" : "1553995485603",
            "uuid" : "U7v5t_T7RG6rNU3JlGCCBQ",
            "number_of_replicas" : "1",
            "number_of_shards" : "1",
            "version" : {
              "created" : "2040599"
            }
          }
        },
        "mappings" : { },
        "aliases" : [ ]
      }
    }
    }
  • 즉, metadata 에는 클 러 스 터 에 있 는 모든 색인 의 조각 과 사본 수량, 색인 상태, 색인 의 mapping, 색인 의 별명 등 이 저 장 됩 니 다.이런 구조 에서 제공 할 수 있 는 기능 은 바로 이 고 코드 는 다음 과 같다.
    # OperationRouting.generateShardId()
    
            IndexMetaData indexMetaData = clusterState.metaData().index(index);
            if (indexMetaData == null) {
                throw new IndexNotFoundException(index);
            }
            final Version createdVersion = indexMetaData.getCreationVersion();
            final HashFunction hashFunction = indexMetaData.getRoutingHashFunction();
            final boolean useType = indexMetaData.getRoutingUseType();
    

    여기 서 우리 의 관심 사 는 바로 clusterState.metaData().index(index) 이 코드 가 실현 되 었 다 는 것 이다 .메타 데이터 의 분 편 수 를 통 해 문서 id 와 결합 하면 문서 가 있 는 분 편 을 찾 을 수 있 습 니 다.이 기능 은 Delete, Index, Get 세 가지 API 에서 모두 필요 합 니 다.여기 서 우 리 는 왜 ES 의 색인 분할 수량 을 수정 할 수 없 는 지 이해 할 수 있다. 만약 에 수정 하면 hash 함수 가 데이터 가 있 는 부분 을 정확하게 찾 을 수 없다.
  • IndexRouting Table 의 학습
  • "routing_table" : {
        "indices" : {
          "test1" : {
            "shards" : {
              "0" : [ {
                "state" : "STARTED",
                "primary" : true,
                "node" : "KnEE25tzRjaXblFJq5jqRA",
                "relocating_node" : null,
                "shard" : 0,
                "index" : "test1",
                "version" : 2,
                "allocation_id" : {
                  "id" : "lcSHbfWDRyOKOhXAf3HXLA"
                }
              }, {
                "state" : "UNASSIGNED",
                "primary" : false,
                "node" : null,
                "relocating_node" : null,
                "shard" : 0,
                "index" : "test1",
                "version" : 2,
                "unassigned_info" : {
                  "reason" : "INDEX_CREATED",
                  "at" : "2019-03-31T01:24:45.845Z"
                }
              } ]
            }
          }
        }
      }
    routing_table 모든 색인 의 분 편 정 보 를 저장 하고 이 구 조 를 통 해 우 리 는 다음 과 같은 정 보 를 뚜렷하게 이해 할 수 있다.
    1.             
    2.           

    만약 에 한 조각 에 두 개의 복사 본 이 있 고 서로 다른 노드 에 분배 된다 면 get api 모두 세 개의 데이터 노드 가 선택 할 수 있 고 어느 것 을 선택 할 수 있 습 니까?여 기 는 밴드 preference 인 자 를 잠시 고려 하지 않 습 니 다.모든 노드 가 공평하게 선택 되 고 부하 균형 의 목적 을 달성 하기 위해 무 작위 수 를 사용 했다.RotateShuffer 참조
    /**
     * Basic {@link ShardShuffler} implementation that uses an {@link AtomicInteger} to generate seeds and uses a rotation to permute shards.
     */
    public class RotationShardShuffler extends ShardShuffler {
    
        private final AtomicInteger seed;
    
        public RotationShardShuffler(int seed) {
            this.seed = new AtomicInteger(seed);
        }
    
        @Override
        public int nextSeed() {
            return seed.getAndIncrement();
        }
    
        @Override
        public List shuffle(List shards, int seed) {
            return CollectionUtils.rotate(shards, seed);
        }
    
    }

    즉, ThreadLocalRandom.current().nextInt() 를 사용 하여 무 작위 수 를 생 성하 여 씨앗 으로 한 다음 에 취 할 때 순서대로 회전 하 는 것 이다.Collections.rotate() 의 효 과 는 다음 과 같은 코드 로 보 여줄 수 있다.
        public static void main(String[] args) {
    
            List list = Lists.newArrayList("a","b","c");
            int a = ThreadLocalRandom.current().nextInt();
            List l2 = CollectionUtils.rotate(list, a );
            List l3 = CollectionUtils.rotate(list, a+1);
            System.out.println(l2);
            System.out.println(l3);
    
        }
    
    -----
    [b, c, a]
    [c, a, b]
    

    예 를 들 어 A 에 게 요청 한 노드 목록 은 [b, c, a] 이 고 B 에 게 요청 한 노드 목록 은 [c, a, b] 입 니 다.이렇게 해서 부하 균형 의 목적 을 달성 했다.
  • Discovery Nodes 의 학습.routing_table 에 저 장 된 것 은 노드 의 id 이기 때문에 요청 을 대상 노드 에 보 낼 때 노드 의 ip 와 포트 등 설정 정 보 를 알 아야 합 니 다.이 정 보 는 nodes 에 저장 되 어 있다.
  •   "nodes" : {
        "KnEE25tzRjaXblFJq5jqRA" : {
          "name" : "Mysterio",
          "transport_address" : "127.0.0.1:9300",
          "attributes" : { }
        }
      }

    nodes 를 통 해 노드 정 보 를 얻 으 면 요청 을 보 낼 수 있 습 니 다. ES 모든 내부 노드 의 통신 은 transportService.sendRequest() 을 바탕 으로 합 니 다.
    요약 하면 본 고 는 get api 을 바탕 으로 ES 의 Cluster State 중의 몇 가지 핵심 구 조 를 정리 했다. metadata, nodes, routing_table.하나 더 있어 요.뒤에 잘 빗 고 장면 을 사용 한 후에 기록 하 세 요.
    다음으로 전송:https://blog.51cto.com/sbp810050504/2372032

    좋은 웹페이지 즐겨찾기