Elasticsearch?
대량의 데이터를 NRT ( Near Real Time )으로 저장, 검색, 분석 할 수 있는 루씬 기반 Java 오픈소스 분산 검색 엔진
특징
Scale Out
Shard를 이용하여 수평적으로 늘어날 수 있다.
HA
Replica를 통해 데이터 안전성 보장
Schema Free
Json을 통해 데이터 검색
Restful
CRUD 작업을 HTTP Restful API를 통해 수행
Inverted Index
텍스트를 파싱하여 검색어 사전 생성
- 속도가 빠르다.
요소별 역할
Node
Master
- ES의 Instance 단위
- Instance는 각자의 역할 존재
- Node.roles를 이용하여 적절한 역할을 사용하는 것이 좋다.
- Tribe Node
- Cluster간 연결을 해주는 역할
- 요청에 따라 서로 다른 Cluster에 데이터를 분리해서 보냄
- Cluster간 연결을 해주는 역할
- Remote-eligible Node
- remote cluster clinet 역할
- 원격 cluster과 연결시켜주는 역할
- cross cluster를 remote client로 사용 가능한 노드
- croess cluster : 원격 cluster간 백업/검색 등을 하는 작업
- remote cluster clinet 역할
- Machine Learning Node
- ML역할
- ES로 ML작업 시 필요
- ML역할
- Tribe Node
Data
- Data를 적재/연산하는 Node
node.data=true
를 설정에 삽입해주면 된다.- 부하 분배를 위해 Master과 분리하는 것을 권장
- Content Datan Node
- CRUD, 집계 등의 기능을 가짐
- 기본적인 Data
- CRUD, 집계 등의 기능을 가짐
이름 | 압축 | 성능 | 비고 |
---|---|---|---|
Hot Data Node | 4 | 1 | 사용 빈도가 많고 및 성능이 우선이기 때문에 SSD 권장 |
Warm Data Node | 3 | 2 | Hot보다 적은 빈도로 조회하는 노드, HDD권장 |
Cold Data Node | 2 | 3 | 읽기 빈도가 적은 인덱스, 읽기 전용 |
Frozen Data Node | 1 | 4 | Shared_cache 옵션만으로 마운트 된 검색 가능한 Snapshot 을 저장 |
Ingest
- Text 변환 및 전처리 담당.
- Ingest pipeline을 Text에 적용하여 인덱싱 하기 전에 사용
- indexing 이전에 Document를 변환하는 작업
- Master Node에서 수행하는 Ingest를 대신 수행
- Master Node의 부하 분산
- 색인 작업이 많을경우 사용
Coordinating Only
- Client와 통신만 하는 역할
- Load Balancing 수행
- 만약 Coordinate Node가 없으면 Datanode가 해당 역할 수행
- 너무 많으면 서버에 부하
- 발생
- Coordinating Only 또한 Master Node가 알림을 기다리기 때문
- client의 cluster관련 요청을 Master Node에 전달
- client의 Data관련 요청을 data Node에 전달
Server
물리적 서버에는 N개이 Node를 사용할 수 있다.
- Server 기준 Port
- Node - Client
- Port범위 : 9200 ~9299
- 순차적으로 부여
- Node - Node
- Port 범위 : 9300 ~ 9399
- 순차적으로 부여
- Cluster 묶기
- cluster.name을 동일한 이름으로 묶어준다
- 이름이 다르면 같은 Network여도 논리적으로 분리됨
- Cluster : 1개의 시스템이라고 보면됨.
- 데이터가 공유되는 서버의 묶음
- cluster.name을 동일한 이름으로 묶어준다
Index
- Document의 집단
- Index는 색인과 명칭과 혼동될 수 있어 Indices라고도 부른다.
- 주로 REST API를 통해 CRUD 작업 수행
- 실질적으로 Index는 Shard를 가리키는 논리적 Namespace
- index는 1+N개의 Shard로 구성
- Mapping 및 State 정보를 Cluster State에 저장
- Mapping : Index 내부의 Document가 어떻게 저장될지 정의하는 것
- Index별 설정 가능
- cluster State : 정보를 추적하는 내부 데이터 구조
- 분산된 Node간 데이터 일관성을 위해 Single-Thread로 업데이트
- Single-Thread이기 때문에 규모가 커지면 성능 저하
- Mapping : Index 내부의 Document가 어떻게 저장될지 정의하는 것
Shard
- Cluster 내의 데이터를 분산 저장하기 위한 단위
- Lucine Index( Inverted Index / 역색인 )이다.
- Inverted Index : Key : value 가 아닌 value : key
- 속도 / 메모리 측면에서 좋다
- Update 시 reindex을 해야해서 Cost가 증가한다.
- Index는 N개의 Primary/Replica Shard로 구성된다.
- Replica : Failover을 위해 사용하는 것이 좋다
- 너무 많아지면 성능 저하됨
- replica 또한 write를 하기 때문
- Replica : Failover을 위해 사용하는 것이 좋다
- Shard 추가 시 Reindex를 해줘야한다.
- segment가 정렬되어 있기 때문
- 설정
- Failover을 위해 50GB 이상의 Shard는 권장하지 않는다.
- Heap은 최대 32GB를 권장
System Memory / 2
를 권장한다.- 32GB를 넘기면 32bit -> 64bit으로 변경되기 때문
- Heap 1GB당 최대 20개의 Shard를 넘기지 않는 것이 좋다.
- Shard가 작으면 작은 Segment가 생성된다.
- 용양 및 설정 출처
Segment
- 문서의 빠른 검색을 위해 설계된 자료구조
- N개의 Segment로 Shard를 구성한다.
- 데이터 색인 시 메모리상에 존재하다, Segment에 기록하여 검색 가능한 Segment 생성
- Shard에서 검색 시 Segment를 순차 검색 후 결과를 Shard에 전달
- segment가 많아지면 검색 속도 저하
- 순차 검색 및 오버헤드 발생
- update/delete 시 삭제 표기 후 다른 포인터 지칭
- 데이터는 지연 삭제
- 특정 주기/ 용양 임계치에 다다르면 데이터 정리 및 병합
- 이 과정에 실질적 데이터 삭제
- Merge은 새로운 Segment를 생성하는 것
- 많은 Resource 소요
- 부하가 적을 때 수행하는 것을 권장
- Optimize API를 사용하여 수행
개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!