Database/Elasticsearch

[Elasticsearch] ES cluster(2 node) 구조에서의 데이터 정합성 이슈

SeungbeomKim 2025. 6. 6. 19:02

회사 프로젝트에서 장비의 실시간 통계 정보를 저장하기 위해 Elasticsearch 검색엔진을 활용합니다.

 

단일 node를 가지는 standalone 구조에서는 primary, replica shard가 각각 1, 0으로 세팅되어 있으며, 클러스터 구조(2 node 이상) 에서는 5, 1로 세팅되어 있습니다. (ES 1.7.x 기준이며 템플릿 설정에 따라 다를 수 있습니다.)

 

Failover를 위한 HA 구조 (ES 1(master), ES 2(backup) 에서 데이터의 정합성 이슈가 발생하였습니다. 해당 이슈에 대해 대략적인 내용을 설명드리겠습니다.

 

이슈 발생 상황

  1. 장비의 CPU, Memory, Port Usage, Connectivity 정보와 같은 통계 정보를 일정 주기에 맞춰서 ES에 저장합니다. (40 ~ 60s 주기)
  2. 해당 정보가 제대로 저장이 되지 않으며, cpu, memory, connectivity 등의 그래프가 간헐적으로 0을 찍는 톱니바퀴 모양으로 생성됩니다. (원래 정상 동작이라면, -자를 표시해야 합니다) 
    • 사내 시스템에서의 Aggregation 주기는 1m이기에 1m 주기로 데이터의 집계를 내린다면, 0을 표시하는 지점이 없어야 합니다. (데이터 저장 주기가 40s ~ 60s 이기 때문)
  3. standalone에서는 문제가 발현되지 않으며, cluster 구조에서만 발생하였습니다. 

master node, backup node, vip 구조

 

이제 해당 문제에 대해 어떤 식으로 접근했는지 상세히 설명드리겠습니다. 

 

문제 분석 과정 

 

1. cluster의 각 node 상태 확인 (master node만 on이고, backup node는 off인 상태)

curl -s http://192.168.0.1:9200/_cat/health?v
epoch      timestamp cluster      status node.total node.data shards pri relo init unassign pending_tasks 
1742977690 17:28:10  cluster-1    yellow          1         1     45  45    0    0       45             0
  • 해당 정보를 확인한 후, 특징 인덱스의 shards를 확인하니 당연히 Replica shards가 할당되지 않았습니다. (backup node가 off이므로)
$ curl -XGET http://192.168.0.1:9200/_cat/shards/{index-name}?v
index  shard prirep state        docs   store ip          node                   
       4     p      STARTED    524256 201.9mb 172.16.0.65 {node-name}
       4     r      UNASSIGNED
       0     p      STARTED    524045   198mb 172.16.0.65 {node-name}
       0     r      UNASSIGNED
       3     p      STARTED    523872 209.8mb 172.16.0.65 {node-name}
       3     r      UNASSIGNED
       1     p      STARTED    523931 210.1mb 172.16.0.65 {node-name}
       1     r      UNASSIGNED
       2     p      STARTED    523949 199.1mb 172.16.0.65 {node-name}
       2     r      UNASSIGNED

 

 

2. Master Node의 인덱스 상태 확인 (yellow)

$ curl -s http://192.168.0.1:9200/_cat/indices?v
health status index             pri rep docs.count docs.deleted store.size pri.store.size 
yellow open   index-1            5   1     118019            0     31.4mb         31.4mb 
yellow open   index-2            5   1          0            0       720b           720b 
yellow open   index-3            5   1    2310298            0      854mb          854mb 
yellow open   index-4            5   1          0            0       720b           720b 
yellow open   index-5            5   1     233948            0     15.7mb         15.7mb 
yellow open   index-6            5   1      64575            0       16mb           16mb 
yellow open   index-7            5   1     137727            0     32.9mb         32.9mb 
yellow open   index-8            5   1      24885            0      3.9mb          3.9mb 
yellow open   index-9            5   1         10            0     54.4kb         54.4kb

 

  • master node의 상태가 yellow라는 점에서 의심스러운 부분이 많았지만, yellow 상태는 인덱스의 쓰기/읽기에는 문제가 없는 상태입니다. 
  • ES Node Status
    • green: 모든 shards가 정상적으로 동작하고 있는 상태
    • yellow: 일부 혹은 모든 replica shards가 정상적으로 동작하고 있는 상태, primary shards에 문제가 생기면 데이터 유실 발생 위험이 존재합니다. 
    • red: 일부 혹은 모든 인덱스의 primary와 replica shards가 정상적으로 동작하고 있지 않은 상태

 

3. Split Brain 의심

 

ES cluster 구조에서 split brain이라는 개념을 이해하기 위해선 master, data node에 대해 숙지하고 있어야 합니다.

 

master node는 인덱스의 메타 데이터, 샤드의 위치와 같은 클러스터의 상태를 관리하는 노드이고, data node는 실제로 데이터를 저장하고 있는 노드입니다. 

 

elasticsearch.yml 파일의 node.master, node.data 설정을 통해 이를 구분하여 각자의 노드에 맞게 역할 설정을 할 수 있습니다.

(물론, 하나의 노드가 master node, data node의 두 가지 역할을 모두 담당할 수 있습니다.)

node.master의 설정의 기본 값은 true인데, 일반적으로 모든 node는 master node로 선출될 수 있는 마스터 후보 노드입니다. 즉, 하나의 master node가 문제가 생기면, 이를 대체하기 위해 마스터 후보 노드가 master node로 대체됩니다.

 

저는 2개의 node로 구성된 cluster 구조라서, split brain 현상을 의심하였습니다. 

 

Split Brain 

  • 네트워크 단절로 마스터 후보 노드 (node-1, node-2)가 분리되면서 서로 다른 클러스터로 동작할 경우에 발생하는 문제
    • 각자의 클러스터에 데이터가 추가되고 변경된 후, 나중에 복구하여 하나의 클러스터 합쳐졌을 때 데이터 정합성의 문제가 생기고 데이터 무결성이 유지될 수 없게 되는 문제
  • 최소한의 백업용 마스터 후보 노드를 3개 이상의 홀수개를 놓는 것을 권장합니다.
  • 2개 or 짝수로 운영하는 경우 네트워크 유실로 인한 split brain 문제가 발생할 수 있습니다.

 

Elasticsearch 6.x 이전 버전에서의 마스터 후보 노드 설정 방법

  • discovery.zen.minimum_master_nodes
  • (전체 마스터 후보 노드 / 2) + 1개로 설정하는 것을 권장
  • 7.0 부터는 node.master: ture인 노드가 추가되면, 스스로 minimum_master_nodes 값을 변경하도록 설정됩니다.
    • 단, 최초 마스터 후보로 선출할 cluster.initial_master_nodes: [] 설정이 필요

 

근본적인 문제 해결 방법을 찾고 싶었지만, backup node의 Elasticsearch를 재구동하여 일시적으로 문제를 해결한 상태입니다. 의심스러운 문제나 좋은 해결 방안이 있으면 댓글 부탁드립니다. 

 

 

<참고 자료>

https://brunch.co.kr/@alden/43

 

ElasticSearch status 바로 알기

ElasticSearch | 오늘은 ElasticSearch (이하 ES)의 status 에 대한 이야기를 해볼까 합니다. ES의 status는 무엇을 의미하는지, 그리고 어떤 값들이 있으며 어떻게 확인할 수 있는지 살펴보겠습니다. ES status

brunch.co.kr