coredot.today
OpenSearch 완전 정복: 오픈소스 전쟁에서 태어난 검색·분석 엔진의 모든 것
블로그로 돌아가기
OpenSearchElasticsearch검색분석로그AWS오픈소스

OpenSearch 완전 정복: 오픈소스 전쟁에서 태어난 검색·분석 엔진의 모든 것

Elasticsearch의 라이선스 전쟁에서 AWS가 포크하여 탄생한 OpenSearch. 검색 엔진의 기원부터 Lucene, Elasticsearch의 부상, 라이선스 분쟁, 그리고 OpenSearch가 로그 분석·벡터 검색·AI까지 확장하는 현재를 풀어본다.

코어닷투데이2026-01-2732

들어가며: "검색"이 왜 데이터베이스와 다른가

이전 글들에서 RDS(관계형 DB)와 DynamoDB(키-값 DB)를 다뤘다. 그런데 이런 상황을 상상해 보자:

쇼핑몰에서 사용자가 검색창에 **"갤럭시 s25 케이스 투명"**이라고 입력한다. 이 검색을 RDS의 SQL로 처리하면:

hljs language-sql
SELECT * FROM products
WHERE name LIKE '%갤럭시%'
  AND name LIKE '%s25%'
  AND name LIKE '%케이스%'
  AND name LIKE '%투명%';

이 쿼리의 문제:

  • LIKE '%..%'인덱스를 사용할 수 없다 → 전체 테이블 스캔 → 느리다
  • **"갤럭시"와 "Galaxy"**를 동일하게 처리하지 못한다
  • **오타 "갤록시"**를 검색하면 결과가 0건
  • **"투명한 케이스"**와 **"투명 케이스"**를 다르게 취급한다
  • 상품이 100만 건이 넘으면 수 초 이상 걸린다

관계형 DB는 정확한 값 매칭에 최적화되어 있다. WHERE id = 123은 밀리초에 끝나지만, 자연어 텍스트 검색은 구조적으로 맞지 않는다.

이 문제를 해결하는 것이 검색 엔진이다. 그리고 오늘날 가장 널리 쓰이는 검색 엔진이 Elasticsearch — 그리고 그 오픈소스 포크인 OpenSearch다.


1. 검색 엔진의 기원: 역색인이라는 아이디어

역색인 (Inverted Index)

검색 엔진의 핵심 자료구조는 역색인(Inverted Index) 이다. 이 아이디어는 놀랍게도 도서관의 색인 카드에서 왔다.

일반적인 인덱스(정방향): "문서 1번에는 어떤 단어들이 있는가?"

문서1 → [갤럭시, s25, 케이스, 투명]
문서2 → [아이폰, 16, 케이스, 검정]

역색인: "이 단어가 어떤 문서에 있는가?"

갤럭시  → [문서1, 문서5, 문서12]
케이스  → [문서1, 문서2, 문서7, 문서15]
투명    → [문서1, 문서9]
s25     → [문서1, 문서3]

"갤럭시 s25 케이스 투명"을 검색하면? 각 단어의 문서 목록을 교집합하면 된다. {1,5,12} ∩ {1,3} ∩ {1,2,7,15} ∩ {1,9} = {1}. 100만 건의 문서에서도 밀리초 단위로 결과를 찾는다. 전체 테이블을 스캔하는 SQL LIKE와는 차원이 다르다.

💡
핵심 차이: RDBMS는 "이 행의 값이 무엇인가?"를 빠르게 찾는 데 최적화되어 있고 (B-tree 인덱스), 검색 엔진은 "이 단어가 어디에 있는가?"를 빠르게 찾는 데 최적화되어 있다 (역색인). 목적이 다르므로 자료구조가 다르다.

Apache Lucene: 모든 것의 기반 (1999)

1999년, Doug Cutting이 Java로 작성한 오픈소스 검색 라이브러리 Apache Lucene을 공개했다. Lucene은 역색인 구현, 텍스트 분석(토크나이징, 스테밍, 형태소 분석), 점수 매기기(TF-IDF, BM25) 등 검색의 핵심 기능을 제공했다.

Lucene 자체는 라이브러리다. 검색 기능을 제공하지만, 분산 처리, REST API, 클러스터링 같은 기능은 없다. Lucene 위에 이런 기능을 올려 서비스로 만든 것이 Elasticsearch(2010)이고, 그 이전에는 Apache Solr(2006)가 있었다.


2. Elasticsearch의 부상: 검색을 넘어 관측성의 표준으로

Shay Banon의 요리 레시피 검색 (2010)

Elasticsearch의 탄생 스토리는 개인 프로젝트에서 시작한다. 이스라엘 개발자 Shay Banon은 아내가 요리 수업을 다니면서 모은 레시피를 검색할 수 있는 앱을 만들고 싶었다. Lucene을 기반으로 작업하다가, 더 범용적인 분산 검색 시스템을 만들기로 했다.

2010년 2월, Elasticsearch 첫 버전을 공개했다. 핵심 설계 원칙:

  • 분산 우선(Distributed by Design): 처음부터 여러 노드에 걸쳐 작동하도록 설계
  • RESTful API: HTTP + JSON으로 모든 것을 할 수 있음. 별도 클라이언트 불필요
  • 스키마 프리: 문서를 넣으면 자동으로 필드 타입 추론
  • 실시간에 가까운 검색: 문서 색인 후 1초 이내에 검색 가능

ELK 스택: 로그 분석의 사실상 표준

Elasticsearch가 폭발적으로 성장한 진짜 이유는 로그 분석이었다. 2012~2013년, ELK 스택이라는 조합이 등장했다:

  • Elasticsearch — 로그 저장 + 검색
  • Logstash — 로그 수집 + 가공
  • Kibana — 로그 시각화 + 대시보드
ELK 스택 아키텍처
서버 로그
앱 로그
보안 로그
Logstash / Beats 수집 → 파싱 → 변환 → 전송
Elasticsearch 저장 + 검색 + 분석
Kibana / OpenSearch Dashboards 시각화 + 대시보드 + 알림

이 스택이 DevOps 팀의 표준이 됐다. "서비스에 에러가 났다? Kibana에서 로그를 검색하자" — 이것이 수백만 개발자의 일상이 됐다.


3. 오픈소스 전쟁: Elastic vs AWS

갈등의 시작

Elasticsearch를 만든 회사 Elastic NV는 2018년 뉴욕 증시에 상장했다. 하지만 AWS와의 갈등이 수면 위로 올라왔다.

문제의 핵심: AWS는 2015년부터 Amazon Elasticsearch Service를 출시하여, Elasticsearch를 관리형 서비스로 제공했다. Elastic의 오픈소스 코드를 가져다가 AWS 인프라에서 운영하고, 수익을 올렸다. Elastic 입장에서는 자신들이 개발한 소프트웨어로 AWS가 돈을 벌고 있었다.

Elastic CEO Shay Banon은 2019년 블로그에서 AWS를 공개적으로 비판했다:

"AWS가 우리의 소프트웨어를 가져다가 이름만 바꿔 판매하는 것은 오픈소스 커뮤니티에 해롭다."

라이선스 전환: 핵폭탄

2021년 1월, Elastic은 핵폭탄을 투하했다. Elasticsearch와 Kibana의 라이선스를 Apache 2.0에서 SSPL(Server Side Public License)과 Elastic License로 변경한 것이다.

SSPL의 핵심: 소프트웨어를 서비스로 제공하려면 전체 서비스의 소스코드를 공개해야 한다. 사실상 AWS 같은 클라우드 사업자가 Elasticsearch를 관리형 서비스로 판매하는 것을 막으려는 조치였다.

2010
Elasticsearch 오픈소스 공개
Apache 2.0 라이선스. 누구나 자유롭게 사용·수정·배포 가능
2015
AWS, Amazon Elasticsearch Service 출시
Elasticsearch를 관리형 서비스로 제공. Elastic과의 갈등 시작
2019
Elastic, AWS를 공개 비판
"우리 소프트웨어를 가져다 이름만 바꿔 판매한다"
2021.1
Elastic, 라이선스를 SSPL로 변경
Apache 2.0 → SSPL/Elastic License. 클라우드 사업자의 관리형 서비스 제공 사실상 차단
2021.4
AWS, OpenSearch 1.0 공개
Elasticsearch 7.10.2를 포크. Apache 2.0 라이선스. 커뮤니티 주도 개발 선언
2021.9
OpenSearch가 Linux Foundation에 합류
AWS만의 프로젝트가 아닌 산업 표준 지향
2024.8
Elastic, 다시 AGPL로 전환
SSPL을 포기하고 AGPL(OSI 인증 오픈소스)로 복귀. OpenSearch와의 경쟁 구도 변화

AWS의 대응: OpenSearch의 탄생

2021년 4월, AWS는 Elasticsearch 7.10.2 (라이선스 변경 직전의 마지막 Apache 2.0 버전)를 포크하여 OpenSearch를 발표했다.

AWS의 입장:

"오픈소스의 핵심은 누구나 자유롭게 사용할 수 있다는 것이다. 라이선스 변경은 이 원칙에 반한다. OpenSearch는 진정한 오픈소스로 남을 것이다."

Elastic의 입장:

"AWS가 우리의 투자에 무임승차하면서 오픈소스를 방패로 삼고 있다."

💡
오픈소스의 딜레마: 이 사건은 오픈소스 비즈니스의 근본적 긴장을 드러냈다. 오픈소스로 커뮤니티를 키우고 → 클라우드 사업자가 관리형 서비스로 수익화 → 원작자가 수익을 잃음. MongoDB(SSPL), Redis(RSAL), HashiCorp(BSL) 등도 비슷한 이유로 라이선스를 변경했다. "오픈소스는 비즈니스 모델인가 개발 방법론인가"라는 논쟁은 여전히 진행 중이다.

4. OpenSearch의 핵심 개념

기본 구조: 인덱스, 문서, 샤드

hljs language-json
PUT /products/_doc/1
{
  "name": "갤럭시 S25 투명 케이스",
  "category": "액세서리",
  "price": 15000,
  "description": "갤럭시 S25용 투명 실리콘 케이스. 충격 방지.",
  "tags": ["갤럭시", "케이스", "투명"],
  "created_at": "2026-03-15"
}
  • 인덱스(Index): 문서의 컬렉션. RDBMS의 테이블에 해당
  • 문서(Document): JSON 형태의 하나의 레코드. RDBMS의 행에 해당
  • 샤드(Shard): 인덱스를 물리적으로 나눈 조각. 분산 저장의 핵심 단위

검색의 작동 원리

문서를 인덱싱할 때 일어나는 일:

JSON 문서 입력
텍스트 분석: 토크나이징, 소문자 변환, 형태소 분석
"갤럭시 S25 투명 케이스" → [갤럭시, s25, 투명, 케이스]
역색인에 각 토큰과 문서 ID 매핑 저장
검색 시: 쿼리 토큰 → 역색인 조회 → 문서 ID 반환 (~ms)

클러스터 아키텍처

OpenSearch 클러스터는 여러 노드(Node) 로 구성된다:

OpenSearch 클러스터 구조
클러스터 매니저 인덱스 생성, 샤드 배치 결정
데이터 노드 1 Shard P0, R1
데이터 노드 2 Shard P1, R0
데이터 노드 3 Shard P2, R2
  • 클러스터 매니저 노드: 클러스터 상태 관리, 샤드 배치 결정
  • 데이터 노드: 실제 데이터 저장 + 검색/색인 수행
  • 프라이머리 샤드(P): 원본 데이터
  • 레플리카 샤드(R): 프라이머리의 복사본 (장애 대비 + 읽기 분산)

5. OpenSearch 보안: 노출된 클러스터들의 교훈

Elasticsearch/OpenSearch는 보안 사고의 단골 주인공이다

검색 엔진 클러스터는 역사적으로 가장 많이 노출되는 데이터 저장소 중 하나다. 이유: 초기 Elasticsearch는 기본 설정에 보안이 없었다. 인증 없이 누구나 접근 가능했다.

2019.12
12억 명 개인정보 노출
보안 연구원이 인증 없이 접근 가능한 Elasticsearch 클러스터에서 12억 명의 소셜 미디어 프로필, 이메일, 전화번호 발견
2020.1
마이크로소프트 고객지원 DB 노출
2억 5,000만 건의 고객 지원 기록이 인증 없는 Elasticsearch에서 발견. 이메일, IP 주소, 지원 내역 포함
2020~2022
"Meow" 공격: 무차별 ES 클러스터 파괴
공개 인터넷에 노출된 Elasticsearch/MongoDB를 찾아 데이터를 삭제하고 "meow"라는 문자열만 남기는 자동화 공격. 수천 개 클러스터 피해
2023
중국 감시 DB 노출
수억 건의 안면인식·위치 추적 데이터가 공개 Elasticsearch에서 발견
🔒
"Meow" 공격의 교훈: 공격자는 Shodan 같은 검색 엔진으로 공개 인터넷에 노출된 Elasticsearch 포트(9200)를 스캔한다. 인증 없이 접근 가능하면 데이터를 삭제하고 "meow"만 남긴다. OpenSearch를 절대 공개 인터넷에 노출하지 마라. VPC 내부에 배치하고, 보안 그룹으로 접근을 제한하라.

AWS OpenSearch Service의 보안

AWS의 관리형 OpenSearch Service는 이 교훈을 반영하여 보안을 강화했다:

  • VPC 내부 배포: 기본적으로 인터넷에 노출되지 않음
  • Fine-Grained Access Control: 인덱스, 문서, 필드 수준의 접근 제어
  • 저장/전송 암호화: 기본 활성화
  • SAML/OIDC 인증: 기업 SSO와 연동
  • 감사 로그: 모든 접근을 로깅

6. OpenSearch의 실전 활용

활용 1: 풀텍스트 검색

가장 기본적이면서 핵심적인 용도.

hljs language-json
GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "갤럭시 s25 투명 케이스",
      "fields": ["name^3", "description", "tags^2"],
      "fuzziness": "AUTO"
    }
  }
}
  • multi_match: 여러 필드에서 동시에 검색
  • name^3: 이름 필드의 가중치를 3배로
  • fuzziness: AUTO: 오타 자동 교정 ("갤록시" → "갤럭시")

활용 2: 로그 분석과 관측성

가장 대규모로 사용되는 용도. 마이크로서비스 아키텍처에서 수십~수백 개의 서비스가 각각 로그를 생성한다. 이 로그를 중앙에서 검색·분석하는 것이 OpenSearch의 핵심 역할이다.

실전 패턴:

각 서비스 → Fluent Bit(수집) → OpenSearch(저장+검색) → Dashboards(시각화)

일반적인 로그 분석 쿼리:

  • "지난 1시간 동안 500 에러가 가장 많이 발생한 서비스는?"
  • "이 사용자의 요청이 어떤 서비스를 거쳐갔는가?"
  • "응답 시간이 2초를 넘는 요청의 비율 추이는?"

활용 3: 보안 분석 (SIEM)

OpenSearch Security Analytics는 보안 로그를 수집·분석하여 위협을 탐지한다. 방화벽 로그, VPN 로그, 인증 로그를 실시간으로 분석하여 이상 패턴을 감지한다.

활용 4: 벡터 검색 — AI 시대의 새로운 역할

2023년부터 OpenSearch에 추가된 벡터 검색(k-NN) 기능은 AI 시대에 핵심적인 역할을 한다.

전통적 검색: 키워드 매칭 (사용자가 입력한 단어와 문서의 단어를 비교) 벡터 검색: 의미 매칭 (텍스트를 벡터로 변환하여 의미적 유사도를 비교)

hljs language-json
GET /products/_search
{
  "query": {
    "knn": {
      "embedding_vector": {
        "vector": [0.12, -0.34, 0.56, ...],
        "k": 10
      }
    }
  }
}

"따뜻한 색감의 핸드폰 케이스"라고 검색하면, 키워드 "따뜻한"이 상품명에 없어도 의미적으로 유사한 상품(파스텔, 베이지, 코랄 등)을 찾아준다.

이것이 RAG(Retrieval-Augmented Generation) 파이프라인의 핵심 구성 요소이기도 하다. LLM이 답변을 생성할 때, OpenSearch에서 관련 문서를 벡터 검색으로 찾아 컨텍스트로 제공한다.


7. AWS OpenSearch Service: 관리형 서비스

직접 운영 vs 관리형

EC2에 직접 설치
클러스터 구성, 노드 관리 직접
OS 패치, 보안 업데이트 직접
백업, 스냅샷 직접 설정
스케일링 수동
완전한 커스터마이징 가능
최신 버전 즉시 사용 가능
AWS OpenSearch Service
클러스터 생성 수 분, 노드 자동 관리
패치, 보안 업데이트 자동
자동 스냅샷 (S3 저장)
인스턴스 추가로 스케일 아웃
일부 설정 제한
버전 지원에 약간의 지연

OpenSearch Serverless

2022년 출시된 OpenSearch Serverless는 DynamoDB처럼 용량 계획 없이 OpenSearch를 사용할 수 있게 한다:

  • 인스턴스 타입 선택 불필요
  • 자동 스케일링
  • OCU(OpenSearch Compute Unit) 단위 과금

벡터 검색 워크로드나 간헐적 로그 분석에 적합하다.


8. 실제 사례

Netflix: 수 PB의 로그 분석

Netflix는 OpenSearch(이전 Elasticsearch)로 하루에 수 PB의 로그 데이터를 색인하고 분석한다. 수천 개의 마이크로서비스에서 생성되는 로그, 메트릭, 트레이스를 중앙에서 검색하여 장애를 진단한다.

Uber: 실시간 모니터링

Uber는 수백만 건의 승차 요청, 드라이버 위치, 결제 이벤트를 Elasticsearch/OpenSearch로 실시간 분석한다. 이상 거래 탐지, 서비스 상태 모니터링, 비즈니스 인텔리전스에 활용.

Wikipedia: 전문 검색

Wikipedia의 검색 기능은 Elasticsearch 기반이다. 수천만 개의 문서를 다국어로 검색하며, 자동 완성, 오타 교정, 관련 문서 추천을 제공한다.

한국 기업 사례

  • 쿠팡: 상품 검색, 로그 분석에 OpenSearch 활용. 수억 개 상품에서 밀리초 단위 검색
  • 카카오: 카카오톡 검색, 내부 로그 분석 시스템에 Elasticsearch/OpenSearch 사용
  • 당근마켓: 중고 거래 상품 검색, 지역 기반 검색에 Elasticsearch 활용

9. OpenSearch를 쓰지 말아야 할 때

상황이유대안
단순한 키-값 조회오버스펙DynamoDB
트랜잭션이 필요한 데이터ACID 미지원RDS/Aurora
작은 규모의 검색운영 부담 대비 효과 적음PostgreSQL FTS
장기 아카이브비용 높음S3 + Athena
순수 벡터 검색만더 특화된 도구pgvector, Pinecone
선택 기준: OpenSearch가 빛나는 세 가지 시나리오: (1) 대규모 풀텍스트 검색 — 수백만~수십억 건 문서에서 밀리초 응답, (2) 로그/관측성 — 마이크로서비스 로그 중앙 집중 분석, (3) 실시간 분석 — 대시보드, 알림, 이상 감지. 이 세 가지가 아니면 더 간단한 도구를 먼저 고려하라.

마치며: 검색은 "데이터에 질문하는 방법"이다

이 시리즈에서 다룬 데이터 저장소들을 정리하면:

저장소"이런 질문"에 최적
RDS/Aurora"이 주문의 상세 정보는? 이번 달 매출 합계는?" (정확한 관계형 쿼리)
DynamoDB"이 사용자의 장바구니는? 이 세션의 상태는?" (키 기반 초고속 조회)
S3"이 파일을 저장/가져와라" (오브젝트 저장)
OpenSearch"이 키워드가 포함된 문서는? 이 패턴의 로그는?" (텍스트 검색 + 분석)

각 저장소는 다른 유형의 질문에 최적화되어 있다. DynamoDB 글에서 다룬 Polyglot Persistence(다중 모델 아키텍처) 의 또 하나의 구성 요소가 OpenSearch다.

OpenSearch의 탄생 배경 — Elastic과 AWS의 라이선스 전쟁 — 은 기술 이야기인 동시에 오픈소스 비즈니스의 철학적 논쟁이기도 하다. 이 논쟁은 아직 끝나지 않았고, 2024년 Elastic의 AGPL 복귀로 새로운 국면에 접어들었다.

코어닷투데이의 AI 서비스에서도 OpenSearch는 핵심 역할을 한다. AI 추론 결과의 풀텍스트 검색, 서비스 로그 분석, RAG 파이프라인의 벡터 검색 — 이 모든 것이 OpenSearch의 역색인과 벡터 인덱스 위에서 동작한다.