일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 그리디
- 기술면접
- 주간회고
- 부스트캠프_AITech_3기
- 다시보기
- Level1
- 구현
- Level2_PStage
- ODQA
- 단계별문제풀이
- dfs
- Level2
- 정렬
- U_stage
- 백준
- 백트랙킹
- 이진탐색
- 파이썬 3
- 부스트캠프_AITech3기
- 알고리즘_스터디
- 글또
- 그래프이론
- dp
- 알고리즘스터디
- 프로그래머스
- mrc
- python3
- 개인회고
- 이코테
- 최단경로
- Today
- Total
국문과 유목민
[OpenSearch] OpenSearch를 알아보자 본문
OpenSearch가 뭔가요?
Opensearch는 검색 솔루션이다
OpenSearch를 Docs를 보면, 'Apache Lucene 검색 라이브러리로 구동되는 검색 및 분석 제품군으로, 실시간 애플리케이션 모니터링, 로그 분석 및 웹 사이트 검색과 같이 다양한 사용 사례에 사용'된다고 말한다. 쉽게 얘기하면 데이터베이스처럼 데이터를 저장하고, 쉽고 빠륵게 검색과 분석을 할 수 있게 도와주는 솔루션이라는 것이다.
Opensearch는 데이터 탐색 도구인 OpenSearch 대시보드와 함께 대량 데이터 볼륨에 빠르게 액세스하고 응답할 수 있으며, 뛰어난 확장성을 지닌 시스템을 제공한다. k-nearest neighbors(KNN)검색, SQL, Anomaly Detection, Machine Learning Commons, Trace Analytics, 전체 텍스트 검색 등 다수의 검색 및 분석 기능을 지원한다.
OpenSearch는 ElasticSearch와 연관이 깊다
OpenSearch는 ElasticSearch라는 검색 솔루션에서 파생되어 나온 서비스이다. ElasticSearch가 2021년부터 1월부터 Apach License Verson 2.0(이하 ALv2)으로 새로운 버전을 릴리스 하지 않는다고 발표함으로써 소프트웨어를 오픈 소스로 유지하고자 AWS가 지난 ALv2 버전의 Elasticsearch 및 Kibana에서 포크를 통해 새로운 프로젝트를 만들어 유지하기로 결정했고, 이 포크가 OpenSearch이다.
서로 갈래가 분리되기는 했지만, 기본적인 기능이나 동작 원리는 유사한 점이 많아 기초 동작 원리에 대한 이해나, 이슈 해결 시 관련 ES 문서를 참고하게 된다. (원칙적으로는 7.10이후의 새 ES버전과 관련된 호환성을 고려하지는 않는다고 얘기)
(사실 아직도 감정의 골이 깊어보이기는 한다... https://www.elastic.co/kr/elasticsearch/opensearch)
Amazon Opensearch Service를 쓰면 편하게 쓸 수 있다
OpenSearch는 오픈소스이기는 하지만, 초기 환경을 구성하거나 모니터링과 유지보수 등에 어려움이 있다. 그래서 AWS에서 이러한 것들을 다 관리해주고, 사용자는 사용만 하면 되는 AWS 관리형 서비스인 Amazon Opensearch Service가 있다. 기업들의 경우 해당 서비스를 사용해서 편하게 Opensearch를 사용해볼 수 있다. (물론 돈이 있다면...)
참고로 이전에는 Amazon ElasticSearch Service라는 이름으로 존재했던 서비스였기 때문에, 예전 자료들을 보거나 이미지 검색이 안 된다면 용어가 다를 수 있기 때문에 알아만 두자.
최근에는 Opensearch Serverless도 나와서 OpenSearch가 가지는 로드밸런싱과 같은 문제를 해결할 수 있다고도 하며, 이를 활용해서 서비스를 만들 수도 있다. (물론 돈이 있다면...)
OpenSearch의 구성요소
OpenSearch에 대해 알기 전에 우선, 구성요소를 알아둘 필요가 있다.
- 문서(Document): 정보(텍스트 또는 구조화된 데이터)를 저장하는 단위로 JSON 형식으로 저장됩니다.
- 인덱스(Index): 인덱스는 문서의 모음입니다.
- 노드(Node): 데이터를 저장하고 검색 요청을 처리하는 서버입니다.
- 클러스터(Cluster): 클러스터는 노드의 모음입니다.
- Opensearch는 분산 검색 엔진으로 하나 이상의 노드에서 실행됩니다. 클러스터는 master(cluster manager)노드와 data노드 등의 노드로 구분이 될 수 있습니다.
- 샤드(Shards): OpenSearch는 인덱스를 샤드로 분할해서 저장하며, 각 샤드는 인덱스에 있는 모든 문서들을 일부씩 나눠서 저장합니다.
- 샤드로 나눴을 때의 장점은 인덱스의 문서들이 클러스터의 노드들에 even하게 분산될 수 있다는 것이다. 예를 들어 400GB의 용량을 갖는 인덱스는 클러스터의 단일 노드가 처리하기에 너무 클 수 있다. 하지만 각각 40GB씩 10개의 샤드로 분할된 경우 샤드를 10개의 노드에 분리함으로써 효율적으로 관리할 수 있다. 이렇게 함으로써 하나의 노드가 받는 분산을 줄일 수 있으며, 병렬 처리를 통해 검색 성능 또한 향상시킬 수 있다.
- 그렇다고 샤드가 많다고 좋은 것은 아니다. 샤드는 인덱스의 분리된 부분이지만, 하나의 샤드는 개별 Lucene 인덱스이기 때문에 CPU와 메모리를 사용한다. 따라서 샤드가 단순히 많다고 좋은 것은 아니며 일반적으로 노드 1개 당 최대 1000개의 샤드, 샤드 1개당 10~50GB의 크기가 권장된다.
- 프라이머리 샤드와 레플리카 샤드 (Primaray Shards & Replica Shards):
- 프라이머리 샤드: 데이터 원본을 저장하는 샤드이다
- 레플리카 샤드: 프라이머리 샤드를 1대1로 복제해서 생성되는 샤드이다. 만약 4개의 프라이머리 샤드가 있는 상태에서 레플리카 샤드를 1로 준다면 총 4개의 복제본 샤드가 추가된다.
- 레플리카 샤드는 노드에 오류가 발생하는 경우 백업의 역할을 하거나, 검색 속도 향상에 사용된다. 검색량이 많을 겨우 하나의 인덱스에 두 개 이상 레플리카 샤드를 설정할 수 있다.
- 역인덱스(Inverted Indx): 문서에 나오는 단어를 key로 하고, 이에 해당하는 문서를 Value로 매핑함으로써 빠르게 검색을 할 수 있게 도와주는 구조이다.
- 이때, 문서 ID이외에 구문 쿼리를 위해 문서 내의 단어 위치도 같이 저장합니다.
(예를 들어, '머신 러닝'과 같은 구문 쿼리의 경우 '머신'과 '러닝'이 따로 색인되어 있으면 검색이 어려움)
- 이때, 문서 ID이외에 구문 쿼리를 위해 문서 내의 단어 위치도 같이 저장합니다.
- 관련성(Relevance): 문서 검색 시 쿼리의 단어를 문서의 단어와 일치하는 지 확인하는데, 이때 해당 문서가 쿼리와 얼머나 일치하는지 관련성 점수가 할당된다.
- Opensearch는 BM25 알고리즘을 사용해 문서 관련성 점수를 계산한다.
참고자료
'기술 견문록 > MLOps' 카테고리의 다른 글
[RunPod] RunPod (비용 및 Pycharm SSH 연결 방법) (0) | 2024.11.24 |
---|---|
[FastAPI] FastAPI를 쉽게 알아보자 (FastAPI 시식 코너) (4) | 2024.11.08 |
[Docker] Docker를 쉽게 알아보자 (Docker 에피타이저) (1) | 2024.10.25 |