클러스터와 노드
여러개의 ES 프로세스들을 논리적으로 결합하여 하나의 ES 프로세스 처럼 사용할수 있게 해준다. 이때 클러스터를 구성하는 하나하나의 ES프로세스를 노드라고 부른다.
노드역할
노드역할 | 설명 |
마스터(Master Eligible) | 클러스터 구성에서 중심이 되는 노드. 클러스터의 상태등 메타데이터를 관리한다. |
데이터(Data) | 사용자의 문서를 실제로 저장하는 노드 |
인제스트(Ingest) | 사용자의 문서가 저장되기 전 문서의 변환이 필요한 내용을 사전 처리하는 노드 |
코디네이트(Coordinate) | 사용자의 요청을 데이터 노드로 전달하고, 다시 데이터 노드로부터 결과를 취합하는 노드 |
위 표와 같이 노드가 할 수 있는 역할은 총 4가지 이며, 각각 하나의 역할만 할 수 있는게 아니라 한번에 여러개의 역할을 할 수 있다.
클러스터 내에서 메타데이타를 관리하는 마스터 노드는 한대이다. 물론 마스터노드 역할에 대해 Standby를 둘 수 있으니 참고
인덱스와 타입
인덱스는 사용자의 데이터가 저장되는 논리적인 공간을 의미하며, 타입은 인덱스 안의 데이터를 유형별로 논리적으로 나눠 놓은 공간을 의미한다. 보통 RDBMS와 비교하기도 하는데
ElasticSearch | RDBMS |
인덱스 | 데이터베이스(테이블) |
타입 | 테이블 |
ES6버전이상부터는 하나의 인덱스에 하나의 타입만을 가질 수 있다. ES6버전 이후 부터는 단일 타입만을 허용하기 때문에 큰 이슈가 없다면 _doc을 타입명으로 사용하게 된다.
인덱스의 이름은 클러스터 내에서 유일해야 하며, 동일한 이름의 다른 인덱스를 만들수는 없다. 인덱스에 저장된 문서들은 앞절에서 배운 데이터 노드들에 분산 저장된다.
샤드와 세그먼트
다음으로 살펴볼 개념은 샤드와 세그먼트이다. 샤드는 인덱스에 색인되는 문서들이 저장되는 논리적인 공간을 의미하며 세그먼트는 샤드의 데이터들을 가지고 있는 물리적인 파일을 의미한다. 인덱스와 샤드, 세그먼트의 관계를 그림으로 그려
보면
하나의 ES인덱스는 다수의 샤드로 구성되고 하나의 샤드는 다수의 세그먼트로 구성된다. 샤드는 1개이상의 세그먼트로 구성되는데 샤드마다 세그먼트의 개수는 서로 다를 수 있다.
샤드는 원본인 프라이머리 샤드와 복제본인 레플리카 샤드로 구성된다. 만약 샤드 0이 있는 노드(Node-3)에 장애가 발생하게 되면 샤드0에 저장되어야 하는 문서들이 저장되지 않을수도 있다. 이러한 최악의 상황을 방지하기위해 데이터를 한벌 더 복제해서 레플리카 샤드를 만들어 데이터의 안정성을 보장한다. 프라이머리 샤드는 최초 인덱스를 생성할 때 개수를 결정하는데 이 때 결정한 프라이머리 샤드의 개수는 이후에 변경할 수 없다. 따라서 인덱스를 생성할때 몇개의 프라이머리 샤드를 만들것인지 신중하게 결정해야 한다.
인덱스에 저장되는 문서는 해시 알고리즘에 의해서 샤드들에 분산 저장되고 이 문서들은 실제로는 세그먼트라는 물리적 파일에 저장된다. 하지만 문서가 처음부터 세그먼트에 저장되는 것은 아니다. 색인된 문서는 먼저 시스템의 메모리 버퍼 캐시에 저장되는데 이 단계에서는 해당 문서가 검색되지 않는다. 이후 ES의 refresh라는 과정을 거쳐야 디스크에 세그먼트 단위로 저장이된다.
세그먼트는 불변의 속성을 갖는다 즉 기존에 기록한 데이터를 업데이트 하지 않는 다는 뜻이다.
데이터를 업데이트하려고 시도하면 ES는 새로운 세그먼트에 업데이트할 문서의 내용을 새롭게 쓰고, 기존의 데이터는 더이상 쓰지 못하게 불용 처리한다. 이러한 동작은 Update뿐아니라 Delete도 마찬가지이다. 다만 불용처리한 데이터들로 세그먼트가 계속커짐에 따라 백그라운드에서는 병합작업이 일어난다.
프라이머리 샤드와 레플리카 샤드
리플리카 샤드를 통해 장애상황에서도 유실되지 않도록 관리하는 것은 꼭필요한 작업이다. 만약 데이터 노드가 5개가 있고 프라이머리 샤드가 5개가 생성된다면 이 경우에는 각각의 데이터 노드에 샤드가 균등하게 분배된다. 그리고 사용자가 문서 5개를 색인하면 균등하게 저장된다. 이때 아래의 알고리즘을 통해 저장될 샤드의 위치가 정해진다.
- 프라이머리 샤드 번호 = Hash(문서의 id) % 프라이머리 샤드 개수
레플리카 샤드는 갯수 변경이 가능한데 0개로 설정하면 각 노드에 분배되어 있던 레플리카 샤드가 삭제된다. 반면, 레플리카 샤드를 2개로 설정하면 그 즉시 프라이머리 샤드를 복제해서 2개의 레플리캬 샤드를 생성한다.
매핑
ES에서 저장될 JSON문서들이 어떤 키와 어떤 형태의 값을 가지고있는지 정의한 것이다. 매핑정보는 미리 정의해도 되고 정의하지 않아도 된다. 미리정의해놓고 사용하는 것을 정적 매핑이라고 부르고, 정의하지 않고 사용하는 것을 동적매핑이라고 부른다. 동적 매핑은 미리 정의하지 않은 상태에서 최초에 색인된 문서를 바탕으로 ES가 자동으로 매핑을 생성해 주는 방식으로 높은 편의성을 제공한다.
ElasticSearch API 구조
curl -X PUT "localhost:9200/user/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"username": "alden.kang"
}
PUT : RestAPI의 메서드이다. 새로운문소를 입력할 때는 PUT, 기존 문서를 수정할 때는 POST, 삭제할때는 DELETE, 조회시에는 GET을 사용한다.
/user/ : 문서를 색인할 인덱스 이름이다. 인덱스는 문서를 저장하는 가장 큰 논리적인 단위를 의미하며, 같은 성격의 인덱스를 하나의 인덱스에 저장하게 된다.
/_doc/ : 문서의 타입 이름이다. ElasticSearch 5버전이하에서는 멀티타입을 지원해서 하나의 인덱스안에 다양한 타입의 데이터를 저장할 수 있었지만 6버전 이상에서는 하나의 인덱스에 하나의 타입만 저장할 수 있게 설계가 변경되었다.
/1 : 문서의 ID이다. ID는 인덱스 내에서 유일해야 하며, 같은 ID가 입력되면 해당 문서를 수정한다고 인식한다.
{ ... } : 색인할 문서
색인요청시 수행하는 내부적인 작업들
위 색인 요청을 받은 후에 ES에는다음과 같은 과정이 발생한다. 단순히 색인만하는게 아니라 관련된 스키마를 만드는등 많은 작업을 내부적으로 하는 것이다.
클러스터 모니터링
HEAD를 통한 모니터링 : Chrome 브라우저의 Extenstion Plugin으로도 제공하며, 독립형 웹어플리케이션으로 실행가능
'PaaS > Data' 카테고리의 다른 글
ElasticSearch 운영하기 (0) | 2022.07.24 |
---|---|
ElasticSearch 클러스터 튜닝 가이드 (0) | 2022.07.22 |
Filebeat와 Elastic Search 연동 (0) | 2022.07.15 |
Kibana 7.10 올리기 및 Elastic Search 연동 (0) | 2022.07.15 |
ElasticSearch 7.10 Cluster 올리기 (0) | 2022.07.15 |