Elasitcsearch의 내부구조
MYSQL | Elasticsearch |
테이블 | 인덱스 |
레코드(행) | 도큐먼트 |
컬럼 | 필드 |
스키마 | 매핑 |
*mysql과 비교했을때 elasticsearch의 구조는 다음과 같다
-엘라스틱서치의 인덱스는 mysql에서의 테이블과 같다고 볼 수 있다
-데이터(도큐먼트)의 저장은 인덱스에 이루어진다
- 레코드 = 행 = 도큐먼트
- 컬럼 = 열 = 필드
-인덱스는 여러 개의 primary샤드로 구성이 되고 고가용성을 위해 레플리카 샤드로도 복제된다
-프라이머리와 레플리카 샤드는 항상 서로 다른 노드에 할당되어 다중성과 확장성을 제공한다
Elasticsearch 관련 용어
- node
-elasticsearch가 실행중인 하나의 프로세스 혹은 인스턴스를 말한다
-node는 데이터를 저장하고 cluster 내에서 역할에 따라 데이터의 색인화, 검색, 마스터 역할 등을 수행한다
-각 노드는 고유한 이름을 가지고 있는다
- cluster
-하나 이상의 node로 구성된 elasticsearch 시스템 전체를 나타낸다
-cluster는 데이터의 분산, 고가용성 및 확장성을 지원하며 모든 node가 동일한 클러스터명을 가지고 있어야 한다
- shard
-데이터를 담기위한 논리적인 그룹이다
-데이터를 분산하여 저장하기 위해 index의 범위를 나눈것이라고 볼 수 있다
-실제 데이터가 담기는 곳은 index이고, 클러스터 상에서 이러한 index가 모여 하나의 shard를 이룬다
- replica
-분산 환경에서 데이터의 신뢰성을 높이기 위해 여러 node에 데이터를 복제하여 저장하는것을 의미한다
-shard의 복제본을 의미하며 고가용성을 제공하고 성능을 향상시키기 위해 사용된다
- index
-도큐먼트를 담을 수 있는 일종의 테이블이라고 볼 수 있다
* index template: 여러개의 인덱스를 만들기 위한 기본 템플릿이며, 인덱스 템플릿에 정의된 데이터 타입 등이 인덱스에 적용된다
--> 다수의 인덱스가 동일한 인덱스 형태를 취한다면 모든 인덱스는 동일한 데이터 타입으로 저장되어야 하므로 실수를 없애기 위해 미리 인덱스 템플릿을 만들어 두는것이 좋다
* index pattern : 하나의 인덱스만으로는 시각화가 불가능하다. 다수의 동일한 패턴을 묶고 이를 인덱스 패턴으로 만든 뒤 이를 kibana와 연결하여 시각화 할 수 있다
Mapping
- mapping이란 인덱스에 도큐먼트를 입력 받을 때 필드에 대해 어떠한 형태의 데이터를 받을 것인가를 지정하는 것이다
--> 즉, " 각 데이터의 데이터 타입을 지정하는 것 " 이라고 할 수 있다
-동적인 mapping: 자동으로 특정 타입으로 매핑된다. 편리하지만 불필요하게 큰 메모리를 사용할 수도 있다
ex) "age"에 대하여 동적매핑을 할 경우 long 타입이 매핑된다. 이럴 경우 사용되는 값에 비해 너무 큰 메모리를 차지한다!
-정적인 mapping: 관리자가 직접 사전에 특정 타입을 미리 지정해두는 방법이다
PUT index1
{
"mappings": {
"properties": {
"name": {"type":"text"},
"age":{"type": "short"},
"gender":{"type": "keyword"}
}
}
}
--> 다음과 같은 방법으로 정적인 mapping을 수행할 수 있다
- 인덱스 매핑이 정해지면 새로운 필드를 추가할 수는 있지만, 이미 정의된 필드를 수정하거나 삭제할 수 는 없다. 필드이름을 변경하거나 데이터 타입을 변경하기 위해서는 새로운 인덱스를 만들어 사용해야하므로 매핑 작업은 신중해야 한다!
mapping 타입
데이터 형태 | 데이터 타입 | 설명 |
텍스트 | text | 전문 검색이 필요한 데이터로 텍스트 분석기가 텍슽트를 작은 단위로 분리한다 |
keyword | 정렬이나 집계에 사용되는 텍스트 데이터로 분석을 하지 않고 원문을 통째로 인덱싱한다 | |
날짜 | date | 날짜/시간 데이터 |
정수 | byte | 부호 있는 8비트 데이터 |
short | 부호 있는 16비트 데이터 | |
integer | 부호 있는 32비트 데이터 | |
long | 부호 있는 64비트 데이터 | |
실수 | float | 32비트 부동소수점 실수 데이터 |
double | 64비트 부동소수점 실수 데이터 |
*자주 쓰이는 mapping 타입들이다
text 타입 vs keyword 타입
-text 와 keyword 둘 다 문자열을 보관하기 위한 데이터 타입이지만 보관방식이 다르다
- text타입
-elasticsearch에서 텍스트 타입은 일반적으로 문장을 저장하는 매핑 타입으로 사용된다
-일반적으로 문장이나 여러 단어가 나열된 문자열을 텍스트 타입으로 지정한다
-텍스트 타입으로 지정된 문자열은 분석기에 의해 토큰으로 분리되고, 분리된 토큰들은 인덱싱 되는데 이를 역인덱싱 이라고한다
-역인덱스에 저장된 토큰들을 용어라고 한다
' Hello everyone, my name is heewon '
다음과 같은 내용을 text로 저장했다고 해보자
텍스트가 "hello", "everyone" .. 과 같이 분리되고, 불필요한 토큰은 걸러지며 대소문자를 통일하는 등의 과정들을 거쳐 용어가 된다 .
이러한 용어들은 역인덱싱에 저장되어 전문 검색을 할 수 있게 된다
즉, "everyone" 이라는 단어를 통해 문장 전체를 검색할 수 있게 된다는 것이다
- keyword 타입
-키워드 타입은 카테고리나 브랜드 등 규칙성이 있거나 유의미한 값들의 집합, 즉 범주형 데이터에 주로 사용된다
앞선 예시가 keyword 타입인 경우 전체문장을 하나의 용어로 만든다.
따라서 키워드 타입으로 매핑된 데이터는 부분 검색은 어렵지만 완전 일치 검색을 위해 사용될 수 있고, 집계나 정렬에 사용할 수 있다
'클라우드' 카테고리의 다른 글
Auto Scaling 및 모니터링을 통한 Docker 컨테이너 관리 시스템 구축하기 (1) | 2024.02.13 |
---|---|
Elasticsearch 집계, Query DSL (0) | 2024.01.31 |
ELK stack - elasticksearch, kibana, logstash 등 알아보기 (1) | 2024.01.21 |
AWS (0) | 2023.09.26 |
클라우드 컴퓨팅의 종류 (0) | 2023.09.20 |