Elasticsearch의 주요 기능

📌  Elasticsearch의 핵심 기능은 대용량 데이터에 대한 빠른 검색과 실시간 데이터 분석입니다.

 

  1. 🔍 전문 검색(Full-Text Search)
    • 형태소 분석(Tokenizer, Analyzer) 지원
    • 유사 검색, 오타 교정(Fuzzy Search), 자동 완성 기능 제공
    • match, term, bool 쿼리를 활용한 다양한 검색 조건 지원
      더보기
      더보기
      더보기
      더보기

      🔍 Elasticsearch의 Full-Text Search(전문 검색) 수행 방식

      Elasticsearch의 **Full-Text Search(전문 검색)**은 단순한 문자열 비교가 아니라, 문서를 토큰화(tokenization)하고, 형태소 분석을 수행한 후, **역색인(Inverted Index)**을 이용하여 빠르게 검색하는 방식입니다.


      1️⃣ 검색이 이루어지는 과정

      Elasticsearch에서 **전문 검색(Full-Text Search)**은 다음과 같은 단계를 거칩니다.

      1️⃣ 문서 저장(Indexing) 과정
      2️⃣ 검색어 분석(Query Parsing & Analysis)
      3️⃣ 역색인(Inverted Index) 조회
      4️⃣ 검색 결과 정렬(Scoring & Ranking)
      5️⃣ 결과 반환


      2️⃣ 검색 과정의 세부 구조

       

      🔹 1. 문서 저장(Indexing)

      Elasticsearch에서 데이터를 저장할 때, 단순한 문자열 형태가 아니라 토큰화(Tokenization) 및 형태소 분석(Analysis)을 수행하여 역색인(Inverted Index)을 생성합니다.

      예를 들어, 다음과 같은 문서를 저장한다고 가정하겠습니다.

      PUT my_index/_doc/1
      {
        "content": "엘라스틱서치는 강력한 검색 엔진입니다."
      }
      

      이 문장이 Elasticsearch에 저장될 때, 토큰화(Tokenization) 과정이 수행됩니다.

      📌 형태소 분석(예: standard 분석기 적용)

      [ "엘라스틱서치", "강력한", "검색", "엔진" ]
      
      • 문장이 단어 단위(토큰)로 분리됩니다.
      • 분석기를 설정하면 더 정교한 처리가 가능합니다.

      이렇게 생성된 토큰은 Inverted Index(역색인)에 저장됩니다.
      즉, Elasticsearch는 문장을 통째로 저장하는 것이 아니라, 토큰을 기반으로 색인을 생성하여 검색 성능을 높입니다.

       



      🔹 2. 검색어 분석(Query Parsing & Analysis)

      사용자가 "검색 엔진"을 검색한다고 가정해 보겠습니다.

      GET my_index/_search
      {
        "query": {
          "match": {
            "content": "검색 엔진"
          }
        }
      }
      

      📌 검색어 분석 과정

      1. 검색어를 토큰화 → "검색 엔진" → [ "검색", "엔진" ]
      2. 토큰을 Inverted Index에서 검색
      3. 가장 관련성이 높은 문서를 반환

      즉, 저장된 문서와 사용자의 검색어를 동일한 방식으로 분석하여 비교합니다.

       



      🔹 3. 역색인(Inverted Index) 조회

      Elasticsearch는 **역색인(Inverted Index)**을 사용하여 검색을 최적화합니다.

      📌 역색인이란?
      일반적으로 데이터베이스는 "문서 → 내용" 형태로 저장되지만,
      Elasticsearch는 "단어 → 문서 ID" 형태로 저장합니다.

      예를 들어, 다음과 같은 3개의 문서가 있다고 가정해 보겠습니다.

      문서 ID 내용
      1 "엘라스틱서치는 강력한 검색 엔진입니다."
      2 "검색 엔진을 사용하면 빠르게 검색할 수 있습니다."
      3 "AI 기반 검색 기술이 발전하고 있습니다."

      📌 Elasticsearch의 역색인 구조

      검색    → [1, 2, 3]  (문서 1, 2, 3에 존재)
      엔진    → [1, 2]    (문서 1, 2에 존재)
      강력한  → [1]       (문서 1에만 존재)
      

      검색어에 해당하는 문서 ID를 빠르게 찾을 수 있습니다.
      ➡ SQL 데이터베이스처럼 전체 데이터를 검색할 필요 없이, 색인된 데이터를 바로 조회할 수 있습니다.

       


       

      🔹 4. 검색 결과 정렬(Scoring & Ranking)

      Elasticsearch는 검색된 문서들의 유사도를 계산하여 정렬합니다.
      이를 위해 TF-IDF (Term Frequency - Inverse Document Frequency) 또는 BM25 알고리즘을 사용합니다.

      📌 TF-IDF 방식

      • TF(Term Frequency) → 특정 단어가 문서에서 얼마나 자주 등장하는가?
      • IDF(Inverse Document Frequency) → 해당 단어가 전체 문서에서 얼마나 희귀한가?

      📌 BM25 방식 (기본 알고리즘)

      • TF-IDF보다 더 정교한 방식으로, 검색어의 빈도와 문서 길이를 고려하여 가중치를 계산합니다.
      • Elasticsearch에서는 BM25가 기본 검색 스코어링 알고리즘입니다.

      즉, 가장 연관성이 높은 문서를 최상위에 배치하여 검색 결과를 반환합니다.

       


       

      🔹 5. 검색 결과 반환

      최종적으로 사용자가 검색한 "검색 엔진"에 대해 가장 관련성이 높은 문서부터 정렬하여 반환됩니다.

      📌 예제: 검색 결과

      {
        "hits": {
          "total": 3,
          "hits": [
            {
              "_id": "2",
              "_score": 1.8,
              "_source": { "content": "검색 엔진을 사용하면 빠르게 검색할 수 있습니다." }
            },
            {
              "_id": "1",
              "_score": 1.5,
              "_source": { "content": "엘라스틱서치는 강력한 검색 엔진입니다." }
            }
          ]
        }
      }
      

      문서 2가 문서 1보다 높은 점수를 받아 우선적으로 반환됨
      검색어와 가장 유사한 문서가 상위에 위치


      ✅ Elasticsearch Full-Text Search 요약

      단계 설명
      1. 문서 저장 (Indexing) 문장을 토큰화하여 Inverted Index 생성
      2. 검색어 분석 (Query Parsing) 사용자의 검색어도 동일한 방식으로 토큰화
      3. 역색인(Inverted Index) 조회 토큰을 기반으로 관련 문서를 빠르게 찾음
      4. 검색 결과 정렬 (Scoring & Ranking) BM25 알고리즘으로 관련성이 높은 문서 정렬
      5. 검색 결과 반환 가장 관련성이 높은 문서를 우선 반환

      즉, Elasticsearch는 저장과 검색 과정에서 토큰화 및 분석을 수행하며, 역색인을 통해 빠르고 정확한 검색을 제공합니다. 🚀

  2. ⚡ 빠른 검색 성능
    • Inverted Index 구조를 사용하여 대량의 데이터를 빠르게 검색
    • 검색어 자동 완성(Completion Suggester)과 유사어 검색 기능 제공
    • 수백만 개 이상의 문서도 짧은 시간 내에 검색 가능
      더보기
      더보기
      더보기
      더보기

      🔥 Elasticsearch의 빠른 검색 성능 구조

      Elasticsearch는 일반적인 데이터베이스(SQL)와 달리, Inverted Index(역색인)와 분산 검색을 활용하여 대량의 데이터를 빠르게 검색할 수 있습니다.
      이제, Elasticsearch의 검색 성능을 높이는 핵심 구조에 대해 세부적으로 설명하겠습니다.


      🔹 Elasticsearch가 빠른 이유

      Elasticsearch의 빠른 검색 성능을 가능하게 하는 주요 기술은 다음과 같습니다.

      1️⃣ 역색인(Inverted Index) 사용
      2️⃣ 분산 아키텍처(Shard & Replica) 적용
      3️⃣ 캐싱(Caching) 활용
      4️⃣ 압축된 데이터 저장 방식 활용
      5️⃣ 비동기식 검색(Asynchronous Query Execution)
      6️⃣ 쿼리 최적화(Query Optimization) 기능 제공


      🔍 1️⃣ 역색인(Inverted Index) 구조

      SQL 데이터베이스는 **정방향 색인(Forward Index)**을 사용하여 데이터를 저장하고 검색할 때, 문장을 통째로 비교해야 합니다.
      반면, Elasticsearch는 **역색인(Inverted Index)**을 활용하여 검색 속도를 획기적으로 개선합니다.

      📌 역색인이란?

      • 일반적인 데이터 저장 방식→ SQL에서는 데이터를 그대로 저장하고 검색 시 전체 데이터를 스캔해야 합니다.
      • 문서 1: "검색 엔진은 빠르게 데이터를 처리합니다." 문서 2: "빠른 검색이 필요할 때 엘라스틱서치를 사용합니다."
      • Elasticsearch의 역색인 방식→ Elasticsearch는 토큰 단위로 색인을 생성하여, 검색 시 해당 단어가 포함된 문서 ID를 바로 찾을 수 있도록 저장합니다.
      • "검색" → [문서 1, 문서 2] "엔진" → [문서 1] "빠르게" → [문서 1] "필요할" → [문서 2] "엘라스틱서치" → [문서 2]

      📌 역색인이 검색 속도를 빠르게 만드는 이유

      ✅ 단순 문자열 비교(SQL) 방식보다 훨씬 빠르게 일치하는 문서를 찾을 수 있음
      ✅ 특정 단어가 포함된 문서 목록을 바로 가져올 수 있어 전체 데이터 스캔을 하지 않아도 됨
      대용량 데이터에서도 성능 저하 없이 빠르게 검색 가능

       


       

      🗂 2️⃣ 분산 아키텍처(Sharding & Replication)

      Elasticsearch는 데이터를 여러 개의 노드(서버)로 분산하여 저장하고 검색 속도를 향상시킵니다.

      📌 샤딩(Sharding)

      샤드(Shard)는 하나의 인덱스를 여러 개로 나누어 저장하는 기술입니다.
      Elasticsearch는 각 샤드가 독립적인 검색 엔진 역할을 하도록 설계되어 있어, 검색 요청이 여러 개의 샤드에서 동시에 수행됩니다.

      샤드 개수 설정 (예제):

      PUT my_index
      {
        "settings": {
          "number_of_shards": 3,
          "number_of_replicas": 1
        }
      }
      
      • number_of_shards: 3 → 데이터를 3개 샤드로 나눠 저장
      • number_of_replicas: 1 → 백업을 위해 각 샤드의 복제본 1개 유지

      📌 샤딩이 빠른 검색을 가능하게 하는 이유 ✅ 여러 개의 샤드에서 동시에 검색을 수행하므로 검색 속도가 병렬적으로 증가
      ✅ 특정 샤드에서만 검색이 이루어지므로 불필요한 데이터 조회가 줄어듦

      📌 복제본(Replica)

      샤드의 복제본(Replica Shard)을 생성하면 검색 요청을 여러 개의 노드에서 동시에 처리할 수 있어 속도가 향상됩니다.

      복제본이 빠른 검색을 가능하게 하는 이유 ✅ 여러 개의 서버에서 동시에 검색 요청을 처리하여 부하를 분산
      ✅ 하나의 노드가 장애가 발생해도 검색 속도를 유지

       


       

      💾 3️⃣ 캐싱(Caching) 활용

      Elasticsearch는 자주 검색되는 쿼리를 캐싱하여 검색 속도를 최적화합니다.

      📌 검색 결과 캐싱(Query Cache)

      • terms, match와 같은 특정 쿼리를 실행하면, 동일한 쿼리에 대해 결과를 메모리에 저장합니다.
      • 다음 번 동일한 검색 요청이 들어오면 데이터를 다시 계산하지 않고 바로 결과를 반환합니다.

      캐시 설정 (예제):

      GET my_index/_search
      {
        "query": {
          "match": { "content": "검색 엔진" }
        },
        "request_cache": true
      }
      

      이후 동일한 검색 요청이 들어오면 캐시에서 즉시 결과를 반환하여 속도가 빨라집니다.

       


       

      🗜 4️⃣ 압축된 데이터 저장 방식 활용

      Elasticsearch는 색인을 저장할 때, 압축 알고리즘을 적용하여 데이터를 최적화합니다.

      LZ4 압축 알고리즘 사용

      • 데이터를 압축하여 저장함으로써 검색할 때 불필요한 IO 연산을 줄여 검색 속도를 향상합니다.

      Disk-Based Search 최적화

      • 데이터가 메모리에 적재되지 않아도 디스크에서 빠르게 검색 가능합니다.

       


       

      ⚡ 5️⃣ 비동기식 검색(Asynchronous Query Execution)

      Elasticsearch는 검색 요청을 처리할 때, 비동기적으로 실행하여 빠른 응답을 제공합니다.

      즉시 결과 반환(Async Search)

      • 사용자가 대량의 데이터를 검색하더라도 즉시 부분 결과를 반환하여 사용자 경험을 개선합니다.

      백그라운드 실행

      • 대용량 데이터 분석(Aggregation) 쿼리는 백그라운드에서 실행되어 속도를 최적화합니다.

       


       

      🎯 6️⃣ 쿼리 최적화(Query Optimization)

      Elasticsearch는 다음과 같은 최적화 기법을 사용하여 검색 성능을 높입니다.

      Query Rewriting (쿼리 재작성)

      • 불필요한 조건을 제거하여 쿼리 실행 속도를 최적화합니다.

      Lazy Evaluation (지연 실행)

      • 검색 조건을 분석하여 필요한 조건만 평가하여 실행합니다.

      Parallel Execution (병렬 실행)

      • 여러 개의 CPU 코어를 활용하여 쿼리를 병렬로 실행하여 검색 속도를 향상시킵니다.

       


       

      ✅ Elasticsearch의 빠른 검색 성능 요약

      검색 최적화 기술 설명
      역색인(Inverted Index) 검색어가 포함된 문서 목록을 빠르게 조회
      샤딩(Sharding) 데이터를 여러 개의 샤드로 나누어 저장하여 병렬 검색 수행
      복제본(Replica) 복제 샤드를 활용하여 검색 부하를 분산
      검색 결과 캐싱(Query Cache) 동일한 쿼리에 대해 메모리에 캐시하여 즉시 응답
      압축 저장 방식 데이터 크기를 줄여 디스크 IO 성능 최적화
      비동기식 검색(Async Search) 백그라운드에서 실행하여 즉시 응답 제공
      쿼리 최적화(Query Optimization) 불필요한 조건을 제거하고 병렬로 실행

      📌 결론:
      Elasticsearch는 역색인, 샤딩, 캐싱, 비동기 검색, 데이터 압축 등을 통해 초고속 검색을 지원합니다. 🚀
      이러한 기술 덕분에 Elasticsearch는 수십억 개의 데이터를 검색하더라도 빠른 성능을 유지할 수 있습니다.

  3. 📊 실시간 데이터 분석 (Aggregation Query)
    • 데이터 그룹화 및 통계 분석 가능
    • 인기 검색어 조회, 트렌드 분석, 사용자 행동 분석 등에 활용
    • terms aggregation, date histogram 등을 통해 다양한 데이터 집계 가능
      더보기
      더보기
      더보기
      더보기

      📊 Elasticsearch의 실시간 데이터 분석 수행 방식

      Elasticsearch는 단순한 검색 엔진이 아니라 실시간 데이터 분석을 수행하는 강력한 도구입니다.
      이 기능을 가능하게 하는 핵심 기술은 다음과 같습니다.


      🔹 실시간 데이터 분석을 위한 핵심 기술

      1. 실시간 데이터 수집 (Logstash, Beats, Kafka 연동)
      2. 색인(Indexing) 및 저장 방식 (Near Real-Time Processing)
      3. 집계(Aggregation) 쿼리를 통한 데이터 분석
      4. 시계열 분석(Time-Series Analysis)
      5. Kibana를 활용한 시각화
      6. 대용량 데이터 최적화(Query Optimization & Scaling)

      이제, 각각의 기술을 자세히 설명하겠습니다.

       


       

      1️⃣ 실시간 데이터 수집 (Logstash, Beats, Kafka 연동)

      Elasticsearch는 외부 데이터 소스로부터 데이터를 실시간으로 수집하여 분석할 수 있습니다.

      📌 실시간 데이터 수집 도구

      도구 설명
      Logstash 로그 및 다양한 데이터 소스를 수집하여 Elasticsearch에 전달
      Beats 경량 데이터 수집 에이전트 (파일 로그, 시스템 메트릭, 네트워크 데이터)
      Kafka 실시간 스트리밍 데이터를 Elasticsearch와 연동

      예제: Logstash로 MySQL 데이터를 실시간 전송

      input {
        jdbc {
          jdbc_connection_string => "jdbc:mysql://your-db-host:3306/db_name"
          jdbc_user => "user"
          jdbc_password => "password"
          statement => "SELECT * FROM transactions WHERE updated_at > NOW() - INTERVAL 1 MINUTE"
          schedule => "* * * * *" # 매 분마다 데이터 수집
        }
      }
      output {
        elasticsearch {
          hosts => ["http://localhost:9200"]
          index => "transactions"
        }
      }
      

      ➡ MySQL의 transactions 테이블 데이터를 1분마다 Elasticsearch로 전송하여 실시간 분석 가능

       


       

      2️⃣ 색인(Indexing) 및 저장 방식 (Near Real-Time Processing)

      Elasticsearch는 데이터를 저장할 때, Near Real-Time(NRT, 준실시간) 방식을 사용합니다.

      📌 색인 과정 (Indexing Process)

      1. 데이터 입력 → translog(트랜잭션 로그)에 저장
      2. 메모리에 저장된 후, Background Refresh로 Lucene Segment에 색인
      3. 1초마다 자동으로 Segment를 Refresh하여 검색 가능 상태로 변환

      실시간 분석이 가능한 이유
      ✅ 1초마다 데이터가 갱신되므로 거의 실시간으로 검색 가능
      ✅ 새로운 데이터가 들어와도 시스템 성능에 영향을 주지 않음

      색인 최적화 예제 (자동 Refresh 설정)

      PUT transactions/_settings
      {
        "index": {
          "refresh_interval": "1s"
        }
      }
      

      데이터가 들어오면 1초마다 검색할 수 있도록 반영

       


       

      3️⃣ 집계(Aggregation) 쿼리를 통한 데이터 분석

      Elasticsearch는 Aggregation Query를 사용하여 실시간 데이터 분석을 수행합니다.

      📌 집계(Aggregation)란?

      집계(Aggregation)란 데이터를 그룹화하고 통계를 계산하는 기능입니다.
      이를 활용하면 실시간으로 대량의 데이터를 분석하고 패턴을 찾을 수 있습니다.

      ✔ 예제 1: 실시간 거래 통계 분석 (평균 결제 금액)

      GET transactions/_search
      {
        "size": 0,
        "aggs": {
          "avg_price": {
            "avg": { "field": "price" }
          }
        }
      }
      

      실시간으로 평균 결제 금액을 계산하여 분석

      ✔ 예제 2: 시간별 거래 건수 집계 (1시간 단위)

      GET transactions/_search
      {
        "size": 0,
        "aggs": {
          "transactions_per_hour": {
            "date_histogram": {
              "field": "timestamp",
              "calendar_interval": "1h"
            }
          }
        }
      }
      

      1시간 단위로 거래량 변화를 실시간 분석

       


       

      4️⃣ 시계열 분석(Time-Series Analysis)

      Elasticsearch는 시계열 데이터 분석을 최적화하여 실시간으로 데이터를 분석할 수 있습니다.

      📌 시계열 분석이란?

      • 시간 기반 데이터를 수집하고, 트렌드 변화나 이상 탐지를 수행하는 기법
      • 주로 로그 분석, 네트워크 모니터링, 금융 데이터 분석 등에 활용

      ✔ 예제 1: 최근 1시간 동안의 CPU 사용률 분석

      GET system_metrics/_search
      {
        "size": 0,
        "query": {
          "range": {
            "timestamp": {
              "gte": "now-1h/h",
              "lte": "now/h"
            }
          }
        },
        "aggs": {
          "avg_cpu": {
            "avg": { "field": "cpu_usage" }
          }
        }
      }
      

      최근 1시간 동안의 CPU 평균 사용량을 실시간 분석

      ✔ 예제 2: 이상 감지(Anomaly Detection)

      GET website_traffic/_search
      {
        "size": 0,
        "aggs": {
          "unusual_spikes": {
            "percentiles": {
              "field": "request_count",
              "percents": [95, 99]
            }
          }
        }
      }
      

      트래픽이 급증하는 패턴을 실시간으로 감지하여 알림 설정 가능

       


       

      5️⃣ Kibana를 활용한 데이터 시각화

      Elasticsearch는 Kibana와 연동하여 데이터를 실시간으로 시각화할 수 있습니다.

      📌 Kibana 활용 예시

      ✅ 실시간 대시보드(Dashboard) 생성
      ✅ 시간별, 날짜별 데이터 트렌드 분석
      ✅ 사용자 이벤트 로그, 거래 데이터 등을 그래프 형태로 시각화

      예제: Kibana에서 실시간 검색어 트렌드 대시보드 생성

      1. search_logs 인덱스를 생성하고, keyword 필드를 분석
      2. Kibana의 Date Histogram을 이용하여 실시간 검색 트렌드 그래프 생성
      3.  

       

      6️⃣ 대용량 데이터 최적화(Query Optimization & Scaling)

      대용량 데이터를 실시간으로 분석하려면 성능 최적화가 필요합니다.

      📌 Elasticsearch 실시간 분석 최적화 전략

      최적화 방법 설명
      Shard 크기 조절 데이터를 적절한 크기로 분산 저장하여 검색 성능 향상
      Replica 증가 다중 노드에서 검색을 수행하여 부하 분산
      Query Cache 활용 동일한 분석 요청에 대해 캐싱하여 처리 속도 개선
      Refresh Interval 조정 분석에 따라 데이터 업데이트 속도 조절 (e.g., 1s → 10s)

      예제: 실시간 분석을 위한 인덱스 설정 최적화

      PUT transactions/_settings
      {
        "index": {
          "refresh_interval": "5s",
          "number_of_shards": 3,
          "number_of_replicas": 2
        }
      }
      

      데이터 갱신 주기를 5초로 설정하여 성능 최적화
      샤드와 복제본을 조정하여 대규모 실시간 데이터 분석 지원


      Elasticsearch 실시간 데이터 분석 요약

      기술 설명
      실시간 데이터 수집 Logstash, Beats, Kafka 연동
      Near Real-Time 색인 1초마다 자동 색인 갱신
      Aggregation 쿼리 실시간 데이터 그룹화 및 통계 분석
      시계열 분석 시간 기반 데이터 트렌드 분석
      Kibana 시각화 실시간 데이터 대시보드 생성
      최적화 기법 샤드 조정, 캐싱, Replica 증가

      📌 결론: Elasticsearch는 대량의 데이터를 실시간으로 수집, 색인, 분석하여 빠르고 효율적인 데이터 분석을 지원합니다. 🚀

  4. 💾 확장 가능한 분산 저장 구조
    • 데이터가 증가하면 자동으로 여러 노드에 분산 저장
    • 클러스터링을 통해 서버를 확장하고 부하 분산 가능
      더보기
      더보기
      더보기
      더보기

      Elasticsearch의 확장 가능한 분산 저장 구조 (Scalable Distributed Storage)

      Elasticsearch는 분산(Distributed) 구조를 기반으로 동작하며, 대량의 데이터를 효율적으로 저장하고 빠르게 검색할 수 있도록 확장 가능한 구조를 가지고 있습니다.

       


       

      🔹 Elasticsearch의 분산 저장 핵심 요소

      1. 샤드(Shard) 구조
      2. 복제본(Replica) 관리
      3. 클러스터(Cluster) 및 노드(Node) 구성
      4. 자동 데이터 재분배(Auto Rebalancing)
      5. 수평 확장(Scaling) 방식
      6. 고가용성(High Availability) 보장
      7. 노드 장애 처리(Fault Tolerance)

       


       

      🔹 1. 샤드(Shard) 구조

      Elasticsearch는 데이터를 **샤드(Shard)**라고 하는 작은 단위로 나누어 저장합니다.
      각 샤드는 독립적인 검색 엔진 역할을 수행하며, 여러 개의 노드에 분산될 수 있습니다.

      📌 샤드 개념

      • 샤드는 하나의 인덱스를 여러 개로 나누어 저장하는 데이터 조각입니다.
      • 각 샤드는 독립적인 Lucene 인덱스로 동작하며, 병렬 검색을 수행하여 속도를 높입니다.

      샤드 개수 설정 예제

      PUT my_index
      {
        "settings": {
          "number_of_shards": 3,
          "number_of_replicas": 1
        }
      }
      
      • number_of_shards: 3 → 인덱스를 3개의 샤드로 분할
      • number_of_replicas: 1 → 각 샤드의 복제본을 1개 유지

      샤드가 확장 가능한 이유여러 개의 샤드에서 병렬로 검색을 수행하여 속도를 높임
      샤드를 여러 개의 노드에 분산하여 스케일 아웃(Scale-Out) 가능
      샤드 단위로 확장하여 데이터를 효과적으로 저장

       


       

      🔹 2. 복제본(Replica) 관리

      복제본(Replica)은 샤드의 복사본으로, **고가용성(HA, High Availability) 및 부하 분산(Load Balancing)**을 위한 역할을 합니다.

      복제본의 역할

      • 검색 요청을 여러 노드에서 병렬 처리하여 검색 성능을 향상
      • 노드 장애 시, 복제본을 사용하여 데이터 유실 없이 복구
      • 부하를 분산하여 검색 속도를 높임

      복제본 개수 설정 예제

      PUT my_index/_settings
      {
        "index": {
          "number_of_replicas": 2
        }
      }
      
      • number_of_replicas: 2 → 각 샤드의 복제본을 2개 생성하여 고가용성을 확보

       


       

      🔹 3. 클러스터(Cluster) 및 노드(Node) 구성

      Elasticsearch는 클러스터(Cluster) 단위로 동작하며, 하나의 클러스터는 여러 개의 **노드(Node)**로 구성됩니다.

      클러스터 구조

      [ 클러스터 (Cluster) ]
          ├── 노드 1 (Master + Data Node) → 샤드 1, 샤드 2
          ├── 노드 2 (Data Node) → 샤드 3, 샤드 4
          ├── 노드 3 (Data Node) → 샤드 5, 샤드 6
          ├── 노드 4 (Coordinating Node)
      

      노드(Node) 역할

      노드 종류 역할
      Master Node 클러스터 관리, 샤드 배치 및 상태 모니터링
      Data Node 데이터를 저장하고 검색 쿼리 수행
      Coordinating Node 검색 요청을 분산하여 처리 속도 향상
      Ingest Node 데이터 변환 및 사전 처리 수행

      클러스터 확장 방식새로운 노드를 추가하면 자동으로 데이터가 분산
      노드 장애가 발생해도 복제본이 있기 때문에 데이터 유실 방지

       


       

      🔹 4. 자동 데이터 재분배(Auto Rebalancing)

      Elasticsearch는 클러스터 내에서 노드 추가/삭제 시 자동으로 데이터를 재분배합니다.

      노드 추가 시 데이터 자동 재분배

      • 새로운 노드가 추가되면, Elasticsearch는 자동으로 샤드를 분배하여 부하를 균등하게 조정합니다.
      • 예제: 노드 2개 → 3개로 확장하면, 기존 샤드가 새로운 노드로 자동 이동합니다.

      노드 장애 발생 시 데이터 자동 복구

      • 특정 노드가 다운되면, 복제본을 활성화하여 즉시 복구됩니다.

       


       

      🔹 5. 수평 확장(Scaling) 방식

      Elasticsearch는 **Scale-Out 방식(수평 확장)**을 지원하여, 데이터가 증가하더라도 노드를 추가하여 확장할 수 있습니다.

      Scale-Out vs Scale-Up

      확장 방식 설명
      Scale-Out 노드를 추가하여 클러스터를 확장 (Elasticsearch 방식)
      Scale-Up 기존 노드의 성능을 향상 (CPU, RAM 증가)

      Scale-Out 방식의 장점노드 추가만으로 무제한 확장 가능
      데이터 증가에도 성능 저하 없이 확장 가능
      클러스터가 자동으로 샤드를 분산하여 관리 부담 최소화

       


       

      🔹 6. 고가용성(High Availability) 보장

      Elasticsearch는 노드 장애가 발생해도 데이터가 손실되지 않도록 복제본을 관리하여 항상 가용성을 유지합니다.

      장애 발생 시 동작 방식

      1. 기본 데이터 샤드가 있는 노드가 장애 발생
      2. 복제본이 자동으로 새로운 기본 데이터 샤드로 승격 (Failover 발생)
      3. 새로운 복제본이 자동 생성되어 클러스터 안정성 유지

       


       

      🔹 7. 노드 장애 처리(Fault Tolerance)

      Elasticsearch는 노드 장애를 자동 감지하고 데이터 복구를 수행합니다.

      노드 장애 감지 & 복구 예제

      GET _cluster/health
      

      📌 출력 예제

      {
        "status": "yellow",   // 일부 샤드가 복제되지 않은 상태 (일부 장애)
        "unassigned_shards": 2
      }
      
      • status: green → 정상
      • status: yellow → 일부 샤드가 복제되지 않음
      • status: red → 일부 데이터가 손실됨 (긴급 조치 필요)

      장애 처리 방식

      • 장애 발생 시, 복제본을 새로운 데이터 샤드로 전환하여 Failover 처리
      • 새로운 노드가 추가되면, 샤드가 자동으로 이동하여 복구

       


       

      ✅ Elasticsearch 분산 저장 구조 요약

      기능 설명
      샤드(Shard) 구조 데이터를 여러 개로 분할하여 저장
      복제본(Replica) 관리 데이터 유실 방지 및 검색 부하 분산
      클러스터(Cluster) 및 노드(Node) 구성 여러 개의 노드로 데이터 분산
      자동 데이터 재분배(Auto Rebalancing) 노드 추가/삭제 시 자동으로 데이터 재분배
      수평 확장(Scaling) 노드 추가만으로 데이터 무제한 확장 가능
      고가용성(High Availability) 장애 발생 시 복제본을 사용하여 데이터 복구
      노드 장애 처리(Fault Tolerance) 노드 장애 감지 및 자동 복구

      📌 결론:
      Elasticsearch는 샤드, 복제본, 자동 분산, 클러스터 확장을 통해 데이터 증가에도 무제한 확장이 가능합니다.
      노드 장애 발생 시 자동 복구 및 Failover 기능을 제공하여 데이터 손실 없이 안정적으로 운영할 수 있습니다. 🚀

  5. 🔗 다양한 시스템과 연동 가능
    • MySQL, PostgreSQL, Kafka, Redis 등과 쉽게 연동
    • Kibana를 이용한 데이터 시각화 가능
    • Logstash, Beats 등의 데이터 수집 도구와 함께 사용 가능
      더보기
      더보기
      더보기
      더보기

      🔗 Elasticsearch의 다양한 시스템 연동 방식

      Elasticsearch는 강력한 RESTful API 기반의 설계 덕분에 다양한 시스템과 쉽게 연동할 수 있습니다.
      데이터 수집, 변환, 저장, 분석, 시각화를 위해 여러 도구와 통합할 수 있습니다.


      🔹 다양한 시스템과 연동을 위한 핵심 기술

      1. RESTful API 기반의 연동
      2. 데이터 수집 도구(Logstash, Beats, Kafka)
      3. 데이터베이스(MySQL, PostgreSQL) 연동
      4. 애플리케이션(Spring Boot, Python) 연동
      5. 대시보드 및 시각화(Kibana, Grafana)
      6. 메시징 시스템(Kafka, RabbitMQ) 연동
      7. 클라우드 서비스(AWS, GCP, Azure) 연동
      8. 보안 및 인증(OAuth, API Key, X-Pack)



      1️⃣ RESTful API 기반의 연동

      Elasticsearch는 RESTful API를 제공하며, 다양한 프로그래밍 언어와 쉽게 통합할 수 있습니다.

      데이터 저장 API (Indexing)

      POST http://localhost:9200/my_index/_doc/1
      Content-Type: application/json
      
      {
        "name": "Elasticsearch 연동 예제",
        "type": "데이터 저장"
      }
      

      데이터 검색 API (Query)

      GET http://localhost:9200/my_index/_search
      Content-Type: application/json
      
      {
        "query": {
          "match": { "name": "Elasticsearch" }
        }
      }
      

      Elasticsearch는 REST API를 통해 데이터를 저장, 검색, 삭제, 업데이트할 수 있으며, 다양한 시스템과 연동이 가능합니다.



      2️⃣ 데이터 수집 도구 연동 (Logstash, Beats, Kafka)

      Elasticsearch는 로그 데이터, 이벤트 스트리밍, 시스템 메트릭 등을 수집하는 여러 도구와 연동할 수 있습니다.

      📌 Logstash 연동

      Logstash는 다양한 데이터 소스(MySQL, 파일, Kafka 등)에서 데이터를 수집하여 변환 후 Elasticsearch로 저장할 수 있습니다.

      Logstash 설정 예제 (MySQL → Elasticsearch)

      input {
        jdbc {
          jdbc_connection_string => "jdbc:mysql://db_host:3306/mydb"
          jdbc_user => "user"
          jdbc_password => "password"
          statement => "SELECT * FROM users"
          schedule => "* * * * *" # 매 분마다 실행
        }
      }
      output {
        elasticsearch {
          hosts => ["http://localhost:9200"]
          index => "users_index"
        }
      }
      

      MySQL 데이터를 실시간으로 Elasticsearch에 저장 가능

      📌 Beats 연동

      Beats는 경량 데이터 수집 에이전트로, 시스템 로그, 네트워크 트래픽 등을 수집하여 Elasticsearch로 전송할 수 있습니다.

      Filebeat 설정 예제 (로그 파일 → Elasticsearch)

      filebeat.inputs:
        - type: log
          paths:
            - /var/log/*.log
      output.elasticsearch:
        hosts: ["http://localhost:9200"]
      

      Filebeat를 사용하면 서버 로그 파일을 실시간으로 Elasticsearch로 전송 가능



      3️⃣ 데이터베이스(MySQL, PostgreSQL) 연동

      Elasticsearch는 관계형 데이터베이스(RDBMS)와 연동하여 데이터를 실시간으로 검색 및 분석할 수 있습니다.

      MySQL → Elasticsearch 데이터 동기화

      • Logstash + JDBC 플러그인을 사용하여 MySQL 데이터를 주기적으로 Elasticsearch에 저장
      • Debezium을 사용하여 MySQL의 변경 사항을 Elasticsearch에 실시간 반영

      PostgreSQL → Elasticsearch 데이터 동기화

      • elasticsearch-jdbc 플러그인을 사용하여 PostgreSQL 데이터를 동기화
      • Kafka Connect를 활용하여 PostgreSQL 데이터를 스트리밍 방식으로 전송



      4️⃣ 애플리케이션(Spring Boot, Python) 연동

      Elasticsearch는 Java, Python, Node.js 등 다양한 프로그래밍 언어와 연동할 수 있습니다.

      📌 Spring Boot 연동

      Spring Data Elasticsearch를 사용하여 Elasticsearch와 연동할 수 있습니다.

      Spring Boot 설정 (application.yml)

      spring.elasticsearch.uris: http://localhost:9200
      

      Elasticsearch Repository 생성

      import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
      
      public interface UserRepository extends ElasticsearchRepository<UserDocument, String> {
          List<UserDocument> findByUsername(String username);
      }
      

      검색 API

      @GetMapping("/search")
      public List<UserDocument> search(@RequestParam String username) {
          return userRepository.findByUsername(username);
      }
      

      Spring Boot 애플리케이션에서 Elasticsearch를 직접 검색할 수 있음



      5️⃣ 대시보드 및 시각화(Kibana, Grafana)

      Elasticsearch 데이터를 실시간으로 시각화하려면 Kibana 또는 Grafana를 사용합니다.

      📌 Kibana 연동

      kibana.yml 설정:
      server.port: 5601
      elasticsearch.hosts: ["http://localhost:9200"]
      

      Kibana를 사용하면 실시간 대시보드를 구성하여 데이터를 시각적으로 분석 가능



      6️⃣ 메시징 시스템(Kafka, RabbitMQ) 연동

      Elasticsearch는 Kafka 또는 RabbitMQ와 연동하여 실시간 데이터 스트리밍을 처리할 수 있습니다.

      📌 Kafka → Elasticsearch 데이터 연동

      Kafka Connect를 사용하여 Kafka의 메시지를 실시간으로 Elasticsearch에 저장할 수 있습니다.

      Kafka Connect 설정 (sink-connector.json)

      {
        "name": "elasticsearch-sink",
        "config": {
          "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
          "topics": "user-logs",
          "connection.url": "http://localhost:9200",
          "type.name": "user_logs"
        }
      }
      

      Kafka 메시지를 Elasticsearch에 자동 저장하여 실시간 검색 가능



      7️⃣ 클라우드 서비스(AWS, GCP, Azure) 연동

      Elasticsearch는 클라우드 환경에서도 쉽게 배포 및 운영할 수 있습니다.

      📌 AWS OpenSearch Service 연동

      AWS OpenSearch Service는 Elasticsearch의 관리형 서비스입니다.

      AWS OpenSearch에 데이터 저장

      curl -X POST "https://search-my-domain.region.es.amazonaws.com/my_index/_doc" -H "Content-Type: application/json" -d'
      {
        "name": "AWS OpenSearch 연동 예제",
        "type": "클라우드"
      }'
      

      AWS, GCP, Azure에서도 Elasticsearch를 확장 가능



      8️⃣ 보안 및 인증(OAuth, API Key, X-Pack)

      Elasticsearch는 X-Pack, API Key, OAuth 인증을 지원하여 안전한 데이터 연동을 보장합니다.

      API Key 인증

      curl -X GET "http://localhost:9200/_cluster/health" -H "Authorization: ApiKey YOUR_API_KEY"
      

      X-Pack을 통한 Role-Based Access Control (RBAC)

      PUT _security/role/logs_reader
      {
        "indices": [
          { "names": ["logs-*"], "privileges": ["read"] }
        ]
      }
      

      보안을 강화하여 안전한 Elasticsearch 연동 가능



      Elasticsearch 연동 구조 요약

      연동 시스템 설명
      RESTful API Elasticsearch의 기본 인터페이스
      Logstash / Beats 실시간 로그 및 데이터 수집
      MySQL, PostgreSQL RDBMS 데이터 연동
      Spring Boot, Python 애플리케이션과 직접 연결
      Kibana, Grafana 데이터 시각화 및 분석
      Kafka, RabbitMQ 실시간 스트리밍 데이터 처리
      AWS, GCP, Azure 클라우드 환경 연동
      OAuth, API Key 보안 인증 및 접근 제어

      📌 결론:
      Elasticsearch는 RESTful API와 다양한 데이터 수집/처리 도구를 활용하여 다른 시스템과 쉽게 연동할 수 있습니다.
      실시간 로그 수집, 데이터베이스 동기화, 애플리케이션 연동, 메시징 시스템 연결까지 가능하여 확장성이 뛰어납니다. 🚀

결론

Elasticsearch의 핵심 기능은 대용량 데이터에 대한 빠른 검색과 실시간 데이터 분석입니다.

'Elastic Search > Elastic Stack' 카테고리의 다른 글

[Elasticsearch] Beats  (1) 2025.02.01
[Elasticsearch] Kibana  (0) 2025.02.01
[Elasticsearch] Logstash  (0) 2025.02.01
[Elasticsearch] Elasticsearch  (0) 2025.02.01
[Elasticsearch] 엘라스틱 서치란?  (0) 2025.02.01

+ Recent posts