ES 학습 노트 의 - Christer State 학습
10429 단어 자바데이터 구조 와 알고리즘빅 데이터
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"
}
} ]
}
}
}
전체 구조 가 비교적 복잡 해서 우 리 는 천천히 분해 하여 한 걸음 한 걸음 씩 격파 했다.해체 의 사 고 는 역시 장면 을 사용 하 는 것 부터 시작 하 는 것 이다.
"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" : [ ]
}
}
}
이 고 코드 는 다음 과 같다.# 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 함수 가 데이터 가 있 는 부분 을 정확하게 찾 을 수 없다."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] 입 니 다.이렇게 해서 부하 균형 의 목적 을 달성 했다.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.