회사 프로젝트에서 장비의 실시간 통계 정보를 저장하기 위해 Elasticsearch 검색엔진을 활용합니다.
단일 node를 가지는 standalone 구조에서는 primary, replica shard가 각각 1, 0으로 세팅되어 있으며, 클러스터 구조(2 node 이상) 에서는 5, 1로 세팅되어 있습니다. (ES 1.7.x 기준이며 템플릿 설정에 따라 다를 수 있습니다.)
Failover를 위한 HA 구조 (ES 1(master), ES 2(backup) 에서 데이터의 정합성 이슈가 발생하였습니다. 해당 이슈에 대해 대략적인 내용을 설명드리겠습니다.
이슈 발생 상황
- 장비의 CPU, Memory, Port Usage, Connectivity 정보와 같은 통계 정보를 일정 주기에 맞춰서 ES에 저장합니다. (40 ~ 60s 주기)
- 해당 정보가 제대로 저장이 되지 않으며, cpu, memory, connectivity 등의 그래프가 간헐적으로 0을 찍는 톱니바퀴 모양으로 생성됩니다. (원래 정상 동작이라면, -자를 표시해야 합니다)
- 사내 시스템에서의 Aggregation 주기는 1m이기에 1m 주기로 데이터의 집계를 내린다면, 0을 표시하는 지점이 없어야 합니다. (데이터 저장 주기가 40s ~ 60s 이기 때문)
- standalone에서는 문제가 발현되지 않으며, cluster 구조에서만 발생하였습니다.
이제 해당 문제에 대해 어떤 식으로 접근했는지 상세히 설명드리겠습니다.
문제 분석 과정
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
'Database > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Data Indexing, Searching By Query (0) | 2023.11.15 |
---|---|
[Elasticsearch] Elasticsearch란 무엇이고 왜 사용하는가 (0) | 2023.11.10 |