위 내용은 오픈 서치 사이트를 ChatGPT한테 번역 시킨 내용입니다.
OpenSearch 소개
OpenSearch는 분산 검색 및 분석 엔진으로, 웹사이트에 검색창을 구현하는 것부터 보안 데이터를 분석해 위협을 탐지하는 것까지 다양한 용도로 활용할 수 있습니다.
여기서 **분산(distributed)**이라는 말은 OpenSearch를 여러 대의 컴퓨터에 걸쳐 실행할 수 있다는 의미입니다.
**검색 및 분석(search and analytics)**이란, 데이터를 OpenSearch에 저장한 후 이를 검색하고 분석할 수 있다는 뜻입니다.
데이터의 종류와 상관없이, OpenSearch를 통해 저장하고 분석할 수 있습니다.
문서(Document)
문서는 정보(텍스트 또는 구조화된 데이터)를 저장하는 단위입니다.
OpenSearch에서는 문서가 JSON 형식으로 저장됩니다.
문서를 여러 방식으로 이해할 수 있습니다:
- 학생 데이터베이스에서는 하나의 문서가 한 명의 학생을 나타냅니다.
- 정보를 검색할 때, OpenSearch는 검색어와 관련된 문서를 반환합니다.
- 문서는 전통적인 데이터베이스의 **하나의 행(row)**과 같습니다.
예를 들어, 학교 데이터베이스에서 한 명의 학생을 나타내는 문서는 다음과 같은 데이터를 포함할 수 있습니다.
{
"name": "John Doe",
"gpa": 3.89,
"grad_year": 2022
}
인덱스(Index)
인덱스는 문서들의 집합입니다.
인덱스를 다음과 같이 이해할 수 있습니다:
- 학생 데이터베이스에서는, 인덱스가 데이터베이스에 있는 모든 학생을 나타냅니다.
- 정보를 검색할 때, 인덱스에 저장된 데이터를 기준으로 검색이 이루어집니다.
- 인덱스는 전통적인 데이터베이스의 **테이블(table)**에 해당합니다.
예를 들어, 학교 데이터베이스에서는 하나의 인덱스가 학교에 있는 모든 학생 정보를 포함할 수 있습니다.
클러스터와 노드 (Clusters and Nodes)
OpenSearch는 분산 검색 엔진으로 설계되어 있어, 하나 이상의 **노드(node)**에서 실행될 수 있습니다.
노드는 데이터를 저장하고 검색 요청을 처리하는 서버를 의미하며, 여러 노드가 모이면 **클러스터(cluster)**를 구성합니다.
OpenSearch는 시스템 요구사항이 낮기 때문에 노트북에서도 로컬로 실행할 수 있지만,
데이터 센터의 수백 대의 고성능 머신에 클러스터를 확장하는 것도 가능합니다.
✅ 단일 노드 클러스터의 경우:
예를 들어 노트북에 배포된 OpenSearch는 한 대의 머신이 모든 역할을 수행해야 합니다.
- 클러스터 상태 관리
- 데이터 색인 및 검색
- 색인 전 데이터 전처리
✅ 클러스터가 커지면:
노드마다 역할을 분산할 수 있습니다. 예를 들어:
- 빠른 디스크와 충분한 RAM을 가진 노드는 색인 및 검색에 최적
- CPU 성능이 뛰어난 노드는 디스크는 작더라도 클러스터 상태 관리 역할에 적합
✅ 클러스터 매니저 노드:
각 클러스터에는 **선출된 클러스터 관리자 노드(cluster manager node)**가 있으며,
인덱스 생성 같은 클러스터 레벨 작업을 총괄합니다.
Shards (샤드)
OpenSearch는 인덱스를 **샤드(shard)**로 나눕니다.
각 샤드는 해당 인덱스 전체 문서 중 일부를 저장하는 부분 단위입니다.
즉, 인덱스를 나누는 물리적 단위라고 생각하면 됩니다.
✅ 샤드를 나누는 이유
샤드는 클러스터 내 노드에 균등하게 분산하기 위해 사용됩니다.
예를 들어:
- 하나의 인덱스가 400GB라면, 이를 한 노드가 모두 감당하기 어려울 수 있음
- 400GB를 40GB짜리 10개 샤드로 나누면, OpenSearch는 이를 10개 노드에 분산 저장 가능
- 이로써 부하 분산 + 확장성 확보
⚠️ 주의: 샤드가 많다고 좋은 건 아님
- 각 샤드는 Lucene 인스턴스이므로, 내부적으로는 하나의 독립적인 검색엔진 프로세스입니다.
- 샤드가 많아질수록 CPU, 메모리, 파일 디스크 등 리소스 사용이 증가합니다.
예:
- 400GB 인덱스를 1,000개 샤드로 나누면 → 과도한 부하 발생
✅ Lucene이 뭐야?
- Lucene은 Apache에서 만든 텍스트 검색 엔진 라이브러리예요.
- OpenSearch와 Elasticsearch는 Lucene을 내부적으로 사용해서 데이터를 검색하고 색인합니다.
- 쉽게 말해, OpenSearch는 **Lucene을 감싸는 껍데기(엔진)**이고, 실제 검색은 Lucene이 수행합니다.
✅ “샤드 = Lucene 인스턴스”라는 뜻은?
OpenSearch에서 인덱스를 샤드로 나누면, 각 샤드 내부에는 Lucene이 하나씩 독립적으로 동작하게 됩니다.
OpenSearch | 샤드내부 구성 |
shard-0 | Lucene 인스턴스 A (index writer + reader) |
shard-1 | Lucene 인스턴스 B |
shard-2 | Lucene 인스턴스 C |
✅ "독립적인 검색엔진 프로세스"라는 의미는?
- 각 Lucene 인스턴스는 스스로 색인/검색/정렬/토큰화 등의 작업을 처리합니다.
- 그래서 샤드 하나하나는 작은 검색엔진 하나처럼 동작해요.
- 독립적이기 때문에:
- 샤드 간에는 리소스를 공유하지 않음
- 각 샤드는 별도 CPU, 메모리, 캐시 사용