Shard
여러 노드를 효율적으로 사용하기 위해 노드에선느 데이터를 샤드라는 단위로 분산 저장한다.
샤드 하나의 크기는 10~40GB 정도로 관리하는 것이 좋다고 권고된다.
노드 수에 비해 샤드가 너무 많으면 필요 이상으로 리소스를 소비하게되고, 인덱스 검색을 위해서는 모든 샤드에 접근해야하기에 성능에 좋지 않습니다.
Primary Shard 는 문서가 저장되는 원본 샤드이다.
색인과 검색 성능에 모두 영향을 준다.
Replica Shard 는 복제 샤드로써 문제가 생기면 Primary Shard 로 승격된다.
Primary Shard 의 개수가 성능에 영향을 준다.
PS 3 에 장애가 발생하면 RS 3 을 PS 3 으로 승격한다.
새로운 PS 3 이 RS 3 을 생성한다.
PS 1 은 Replica를 잃었기 떄문에 RS 1 을 새롭게 만들어준다.
PUT /movie
{
"settings": {
"number_of_shards" : 5,
"number_of_replicas" : 2
}
}
위와 같은 방식으로 샤드를 설정할 수 있다.
이 때 movie 인덱스의 총 샤드 개수는
number_of_shard * (number_of_replicas + 1) = 15
각 노드당 3개의 샤드를 가지게 된다.
샤드 라우팅
샤드 라우팅은 문서가 샤드에 저장되는 방법 및 순서를 의미한다.
Routing Rule = (문서의 id) % (프라이머리 샤드의 개수)
Routing Rule에 따라 문서가 샤드에 저장되므로 샤드의 개수가 바뀐다면 문서가 저장되는 규칙이 완전히 바뀌게 된다.
아래와 같이도 표현할 수 있고 한다.
shard = hash(_routung) % 프라이머리 샤드 수
샤드와 노드의 관계
클러스터에서 데이터를 효율적으로 분산하고 처리하기 위해
큰 데이터 인덱스를 여러 샤드로 나눌 수 있다. 가장 작게는 segment 로 만들 수 있다.
노드는 이 샤드를 담는 서버 단위이다. 클러스터 내에거 각 노드는 여러 개의 샤드를 가질 수 있고, PS(primary shard)와 RS(replica shard)를 포함할 수 있다.
인덱스가 다 만들어진 뒤에 Kibana 의 모니터링 기능으로 shard 가 노드에 고르게 분배되었는지 확인한다.bㅋ
번외 정보) 어떻게 정보를 주고받을 수 있을까?
노드들은 클리언트와 통신을 위해 http 포트 (9200~9299) 를 사용
노드끼리는 통신을 위해 tcp 포트 (9300~9399) 를 사용
인덱싱 (Indexing)
데이터를 저장하여 검색할 수 있는 구조로 만들려면 어떻게 해야 할까?
인덱스 생성
인덱스를 먼저 생성하고, 인덱스에 포함될 문서의 필드와 설정을 정의한다.
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" },
"author": { "type": "keyword" },
"date": { "type": "date" }
}
}
}
위에서 봤던 것처럼 샤드의 개수와 필드의 타입을 설정한다.
문서를 인덱스(DB에서는 table)에 추가하기 위해서는 인덱싱해야 한다.
mappings의 형식대로 저장을 한다.
인덱싱된 문서는 역 인덱스러 저장되어 Elasticsearch 가 빠르게 검색할 수 있게 준비된다.
인덱싱 방법
Logstash 를 실행한다.
$ ./bin/logstash -f [config파일명]
Logstash 는 데이터를 다양한 소스에서 받아서 처리하며, 필요한 정보만 남기거나 변환한 후, ES 와 같은 분석 플랫폼으로 전달하여 쉽게 분석할 수 있게 해준다.
플러그인 기반의 파이프라인을 사용한다.
Input : 데이터 소스에서 데이터를 가져온다
Filter : 데이터의 변환 및 정제 작업을 수행한다
Output : 최종 데이터를 ES 나 다른 저장소에 보낸다.
검색 방법
검색에 필요한 쿼리 내용을 JSON 파일로 정의하여 사용합니다.
JSON 파일 내에서 sort와 range 쿼리를 사용하여 특정 필드 기준으로 정렬하고 범위를 지정해 문서를 조회합니다. 예를 들어, rdate1과 rdate2 필드를 기준으로 내림차순 정렬하고, 지정된 범위의 데이터만 조회할 수 있습니다.
검색 결과는 took(검색에 걸린 시간), timed_out(시간 초과 여부), _shards(성공, 실패한 샤드 수), hits(조회된 문서 수 및 배열) 등의 정보를 포함하며 출력됩니다
참고문헌1 ( 샤드 )
https://goodbyeanma.tistory.com/145?category=1002623
참고문헌2 ( 노드와 샤드)
'Data Enginnering > Elastic' 카테고리의 다른 글
[ElasticSearch] Logstash 와 Elasticsearch / 디스크 I/O 병목 (0) | 2024.11.24 |
---|---|
[ElasticSearch] 성능 최적화의 해석 (0) | 2024.11.24 |
[Elasticsearch] 샤딩(Sharding), kBwrtn/s vs kBread/s 비교 (0) | 2024.11.05 |
[ElasticSearch] 검색 성능 최적화 (1) | 2024.11.04 |
[ElasticSearch] 데이터 처리, 검색 성능 최적화 (5) | 2024.11.02 |