인덱스(Index)란?
인덱스는 oracle이나 mysql 같이 관계형 데이터베이스의 테이블과 비슷한 개념이다. 인덱스를 설계하는 것이 Elasticsearch를 사용하기 위한 첫 단계이다.
정의
인덱스는 유사한 구조를 가진 문서들의 모음이며,
Elasticsearch에서 데이터를 저장하고 검색하는 논리적인 단위이다.
예를 들어
•
user_index → 사용자 정보 문서들의 모음
•
blog_index → 블로그 글 문서들의 집합
•
log_index → 시스템 로그 데이터 문서들의 집합
특징
하나의 인덱스는 수 많은 문서를 가질 수 있으며, 인덱스는 내부적으로 샤드(shard)라는 단위로 나뉘어져 저장된다.
샤드(Shard)란?
샤드(shard)는 인덱스를 구성하는 물리적인 저장 단위이다. 즉 하나의 인덱스가 작은 샤드 조각들도 나뉘어져 있는 것이다. 실제 문서는 샤드에 색인되고 검색된다.
•
하나의 인덱스는 한 개 이상의 샤드로 구성된다.
•
각 샤드는 독립적인 인스턴스이며, 자체적으로 색인과 검색 기능을 수행한다.
•
Elasticsearch는 이러한 샤드들을 여러 노드에 분산시켜 성능을 향상시킨다.
종류
•
•
인덱스에 샤드는 아래와 같이 나뉘어진다.
[index]
├── Primary Shard 0
├── Replica Shard 0
├── Primary Shard 1
├── Replica Shard 1
├── Primary Shard 2
└── Replica Shard 2
Plain Text
복사
문서를 색인하게 되면, Elasticsearch는 적절한 Primary Shard를 자동으로 선택하여 저장하게 된다. 이후 검색 요청은 모든 샤드에서 병렬로 실행되어 빠른 응답을 제공한다.
하지만 샤드는 많으면 많을수록 좋은 것은 아니다. 인덱스 하나에 너무 많은 샤드를 쓰게 되면 리소스가 낭비될 수 있기도 하지만 인덱스를 만든 뒤에는 Primary shard 수는 변경이 불가능하다는 특징이 있다.
따라서 처음 인덱스를 만들 때 적절한 샤드 수를 정하는 것이 좋다.
정리
1.
샤드는 인덱스를 구성하는 물리적인 단위
2.
Primary는 실제 데이터 저장, Replica는 복제본
3.
샤드는 분산 저장 + 병렬 검색 처리를 통한 빠른 응답
4.
효율적인 샤드 설계는 성능과 안정성의 핵심
실습
로컬에 Elasticsearch와 Kibana를 설치 한 뒤 학습한 내용을 실습해 보도록 하겠다.
일단 로컬에 설치한 Kibana를 접속 한 뒤 Dev Tools에 들어오면 아래와 같이 테스트를 진행해 볼 수 있다.
1단계: 새로운 인덱스 생성해보기
/*
my_index라는 이름의 인덱스를 생성한다.
Primary Shard 3개
Replica Shard 각각 1개
총 6개의 샤드 생성
*/
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
JSON
복사
2단계: 인덱스 정보 확인하기
// 현재 클러스터에 있는 인덱스 목록과 상태를 보여준다.
GET /_cat/indices?v
JSON
복사
// 샤드 상태 확인
GET /_cat/shards/my_index?v
JSON
복사
3단계: 문서 색인
POST /my_index/_doc
{
"name": "Alice",
"age": 30
}
JSON
복사
이렇게 문서를 색인하게 되면, Elasticsearch가 자동으로 하나의 샤드에 문서를 저장하게 된다. (어떤 샤드에 저장될 지는 내부 알고리즘으로 결정)
여기서 다시 샤드 상태를 확인해보면
하나의 문서가 첫 번째 샤드에 저장된 것을 확인할 수 있다.
4단계: 검색
// 전체 검색
GET /my_index/_search
JSON
복사
검색에 성공했을 경우 아래와 같은 반환 값을 응답 받는다.
•
“took” : 26 → 검색 요청 처리에 걸린 시간 (26ms 걸림)
•
“timed_out” : false → 타임아웃 여부 (false니까 정상 처리)
•
“total” : 3 → 검색에 참여한 전체 샤드 수
•
“successful” : 3 → 검색에 성공한 샤드 수
•
“skipped” : 0 → 검색을 건너 뛴 샤드 수
•
“failed” : 0 → 검색을 실패한 샤드 수
•
“value” : 1 → 검색된 문서 수
•
“relation” : “eq” → 정확한 수치라는 의미(gte면 최소 그만큼 이라는 뜻)
•
“_index” → 문서가 저장된 인덱스 이름
•
“_id” → 문서의 고유 ID (랜덤)
•
“_score” → 문서의 검색 점수 (기본 match쿼리면 대부분 1.0)
•
“_source” → 문서의 실제 데이터