일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 정보처리기사실기 기출문제
- AWS EKS
- CKA
- 티스토리챌린지
- kotlin querydsl
- AI
- PETERICA
- kotlin spring
- minikube
- APM
- 오블완
- IntelliJ
- kotlin coroutine
- aws
- Java
- kotlin
- Kubernetes
- 정보처리기사 실기 기출문제
- Elasticsearch
- Pinpoint
- CKA 기출문제
- CloudWatch
- MySQL
- 공부
- 기록으로 실력을 쌓자
- Spring
- mysql 튜닝
- 정보처리기사 실기
- 코틀린 코루틴의 정석
- Linux
- Today
- Total
피터의 개발이야기
[Elasticsearch] ElasticSearch 기본 정리 본문
ㅁ 들어가며
ㅇ 회사 팀 회의에서 ElasticSearch의 실시간 조회에 대한 이야기를 나누었다.
ㅇ 기존에 경험했던 내용을 설명하는 단계에서 기본 개념과 용어가 잘 생각이 나지 않아 다시 종합적으로 공부가 필요했다.
ㅇ 이번 글은 ElasticSearch 기본 개념 정리에 대해서 정리하였다.
ㅁ ElasticSearch 소개
ElasticSearch는 분산형 검색 및 분석 엔진으로, REST API를 통해 모든 기능을 제공한다. 대량의 데이터를 빠르게 저장, 검색, 분석할 수 있는 강력한 도구이다. 쿠버네티스 환경에서 분산된 로그를 수집하여 통합적인 로그 점검을 위해 사용한 적이 있다.
관련글:
[Elasticsearch] EFK(Elasticsearch, Fluentd, kibana)란
[Elasticsearch] EFK 설치(minikube)-1
[Elasticsearch] EFK 설치(minikube)-2
ㅁ 주요 개념
인덱스와 도큐먼트
ㅇ ElasticSearch에서 가장 중요한 개념은 인덱스와 도큐먼트다.
- 인덱스: 도큐먼트를 저장하는 논리적 단위. 관계형 DB의 테이블과 유사하다.
- 도큐먼트: 실제 데이터를 저장하는 기본 단위. JSON 형태로 저장된다.
인덱스 내에는 여러 도큐먼트가 포함되며, 같은 인덱스의 도큐먼트들은 동일한 스키마를 갖는다. 모든 도큐먼트는 반드시 하나의 인덱스에 속해야 한다.
ㅇ index와 indices의 차이
indices는 언어적으로는 index의 복수형을 뜻하고, index의 물리적인 의미로 저장소 단위 개념이다.
관련글: [Elasticsearch] index vs indices
샤드와 레플리카
ElasticSearch는 분산 시스템으로 설계되어 있어, 데이터를 여러 노드에 분산 저장한다.
- 샤드: 인덱스를 여러 조각으로 나눈 것. 데이터를 분산 저장하고 병렬 처리를 가능하게 한다.
- 레플리카: 샤드의 복제본. 데이터 안정성과 검색 성능을 높이고 가용성을 가능하게 한다.
ㅁ ElasticSearch 사용하기
REST API
ㅇ ElasticSearch의 모든 기능은 REST API를 통해 사용할 수 있다. 주로 HTTP 메소드(GET, POST, PUT, DELETE)를 사용해 데이터를 조작한다.
키바나 Dev Tools
ㅇ 키바나의 Dev Tools 콘솔을 통해 ElasticSearch API를 쉽게 사용할 수 있다. 자동 완성 기능을 제공해 API 사용법을 쉽게 익힐 수 있다.
ㅇ cat API
cat API
는 ElasticSearch의 현재 상태를 빠르게 확인할 수 있는 도구다. 예를 들어, GET _cat/indices?v
를 통해 현재 인덱스 목록을 확인할 수 있다.
ㅁ 인덱스 관리
PUT test-index
ㅇ 인덱스 생성
GET test-index
ㅇ 인덱스 확인
DELETE test-index
ㅇ 인덱스 삭제
ㅁ 도큐먼트 CRUD
도큐먼트 생성 (Create)
PUT test-index/_doc/1
{
"name": "Hong",
"age": 27,
"gender": "male"
}
도큐먼트 읽기 (Read)
GET test-index/_doc/1
ㅇ ID로 조회
GET test-index/_search
ㅇ 검색
도큐먼트 수정 (Update)
PUT test-index/_doc/1
{
"name": "Change",
"age": 34,
"gender": "male"
}
ㅇ 전체 수정
PUT test-index/_update/1
{
"doc": {
"name": "Hong"
}
}
ㅇ 부분 수정
도큐먼트 삭제 (Delete)
DELETE test-index/_doc/2
ㅁ 다이내믹 매핑
ElasticSearch는 도큐먼트의 필드와 값을 보고 자동으로 데이터 타입을 지정하는 다이내믹 매핑 기능을 제공한다. 예를 들어, 숫자는 long 타입으로, 문자열은 text 타입으로 자동 지정된다.
ㅁ 벌크 연산
여러 작업을 한 번에 처리하는 벌크 연산을 통해 효율적으로 데이터를 처리할 수 있다.
POST _bulk
{"index":{"_index":"test","_id":"1"}}
{"field1":"value1"}
{"create":{"_index":"test","_id":"2"}}
{"field1":"value2"}
{"update":{"_index":"test","_id":"1"}}
{"doc":{"field2":"value2"}}
{"delete":{"_index":"test","_id":"2"}}
ㅁ 검색과 쿼리
ElasticSearch는 강력한 검색 기능을 제공한다. Query DSL을 사용해 복잡한 검색 쿼리를 작성할 수 있다.
기본 검색
GET test-index/_search
{
"query": {
"match": {
"name": "Hong"
}
}
}
복합 쿼리
GET test-index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "Hong" } },
{ "range": { "age": { "gte": 20 } } }
]
}
}
}
애그리게이션
ElasticSearch는 데이터 집계와 분석을 위한 강력한 애그리게이션 기능을 제공한다.
GET test-index/_search
{
"aggs": {
"average_age": {
"avg": {
"field": "age"
}
}
}
}
매핑
인덱스의 필드와 데이터 타입을 정의하는 매핑은 데이터의 구조를 명확히 하고 검색 성능을 최적화하는 데 중요하다.
PUT test-index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"email": { "type": "keyword" }
}
}
}
ㅁ 분석기
ㅇ ElasticSearch는 텍스트를 토큰으로 분리하고 처리하는 분석기를 제공한다.
ㅇ ElasticSearch는 장문의 문자열을 역인데싱하여 양질의 결과를 얻을 수 있다.
역인데싱
장문의 문자열을 분석해 작은 단위로 쪼개어 인덱싱하는 기술
ㅇ 기본 분석기 외에도 사용자 정의 분석기를 만들 수 있다.
PUT test-index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "asciifolding"]
}
}
}
}
}
ㅁ 클러스터와 노드
ElasticSearch는 여러 노드로 구성된 클러스터 형태로 운영된다. 각 노드는 데이터를 저장하고 검색 요청을 처리한다.
- 마스터 노드: 클러스터 전체를 관리
- 데이터 노드: 실제 데이터를 저장하고 검색/색인 작업 수행
- 클라이언트 노드: 사용자의 요청을 받아 적절한 데이터 노드로 전달
ㅁ 성능 최적화
ElasticSearch의 성능을 최적화하기 위해 다음과 같은 방법을 사용할 수 있다:
- 적절한 샤드 수 설정
- 캐시 활용
- 필드 데이터 타입 최적화
- 벌크 연산 사용
- 인덱스 새로고침 주기 조정
ㅁ 모니터링과 관리
ElasticSearch 클러스터의 건강 상태와 성능을 모니터링하고 관리하는 것이 중요하다. 키바나의 모니터링 도구를 활용하거나 ElasticSearch의 API를 직접 사용해 클러스터 상태를 확인할 수 있다.
GET _cluster/health
GET _nodes/stats
관련글: [Elasticsearch] Elasticsearch DISK IO 병목현상 및 재기동
ㄴ Elasticsearch data의 모니터링 이유 설명
- elasticsearch data의 CPU와 메모리 사용량이 제일 높았다.
- 모든 컨테이너들의 로그를 처리하고 있어서 트래픽이 높아지면 elasticsearch의 부하도 함께 증가하기 때문에 모니터링이 필요했다.
- 특히 data의 데이터 저장을 위해 disk IO가 많이 상승할 때가 있어서 평상 시에 중점적으로 모니터링을 하고 있었다.
ㅁ 마무리
ElasticSearch는 강력하고 유연한 검색 및 분석 엔진이다. 기본 개념을 이해하고 적절히 활용하면 대규모 데이터를 효율적으로 처리하고 분석할 수 있다. REST API를 통한 간편한 사용법, 분산 아키텍처를 통한 확장성, 실시간 검색과 분석 기능은 ElasticSearch의 큰 장점이다. 다만, 데이터의 일관성이나 트랜잭션 처리가 중요한 경우에는 관계형 데이터베이스와 함께 사용하는 것이 좋다.
ㅁ 함께 보면 좋은 사이트
'DevOps > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Kibana Query Language 사용법 정리 (0) | 2024.08.06 |
---|---|
[Elasticsearch] Elasticsearch + Kibana 설치하기 with Docker (0) | 2024.08.05 |
[Elasticsearch] received plaintext http traffic on an https channel, closing connection Netty4HttpChannel 해결 방법 (0) | 2024.08.04 |
[Elasticsearch] Docker로 Elasticsearch 설치 및 테스트하기 (0) | 2024.08.03 |
[Elasticsearch] 클러스터의 높은 메모리 사용률에 대한 원인 분석 방법 정리 (1) | 2024.07.01 |