스플릿 브레인(Split Brain)이란?
스플릿 브레인은 분산 시스템에서 네트워크 분할이나 노드 장애로 인해 두 개 이상의 노드가 각각 자신이 리더라고 인식하는 상황을 말합니다.
발생 시나리오
1. 네트워크 분할(Network Partition) 시나리오
[데이터센터 A] ←→ [데이터센터 B]
↑ ↑
리더 A 팔로워 B
시나리오 1: 네트워크 연결 끊김
[데이터센터 A] X [데이터센터 B]
↑ ↑
리더 A 팔로워 B
발생 과정:
- 초기 상태: A가 리더, B가 팔로워
- 네트워크 분할: A와 B 간 통신 불가
- 타임아웃 발생:
- A는 B의 응답을 받지 못해 B가 죽었다고 판단
- B는 A의 하트비트를 받지 못해 A가 죽었다고 판단
- 리더 선출:
- A는 자신이 여전히 리더라고 생각
- B는 A가 죽었다고 판단하고 자신을 새로운 리더로 승격
- 결과: 두 노드 모두 리더로 동작
2. 노드 장애 감지 실패 시나리오
시나리오 2: 일시적 네트워크 지연
시간 T1: [A] ←→ [B] (정상)
시간 T2: [A] ←→ [B] (네트워크 지연)
시간 T3: [A] ←→ [B] (복구)
발생 과정:
- 일시적 네트워크 지연: A와 B 간 통신이 느려짐
- 타임아웃 설정 문제:
- 타임아웃이 너무 짧게 설정됨
- 지연 시간이 타임아웃을 초과
- 잘못된 장애 판단:
- A는 B가 죽었다고 판단
- B는 A가 죽었다고 판단
- 리더 선출: 각각 자신을 리더로 승격
3. 복잡한 토폴로지에서의 시나리오
시나리오 3: 3개 노드 시스템
[A] ←→ [B] ←→ [C]
↑ ↑
리더 팔로워
네트워크 분할 발생:
[A] X [B] X [C]
↑ ↑
리더 팔로워
발생 과정:
- A-C 연결만 유지: A와 C는 통신 가능, B는 격리
- B의 판단: A와 C가 모두 죽었다고 판단 → B가 리더 승격
- A의 판단: B가 죽었지만 C는 살아있음 → A가 리더 유지
- C의 판단: B가 죽었지만 A는 살아있음 → C가 A를 팔로우
- 결과: A(리더)와 B(리더)가 동시에 존재
스플릿 브레인의 위험성
1. 데이터 불일치
리더 A: 사용자 ID 1001에 "Alice" 저장
리더 B: 사용자 ID 1001에 "Bob" 저장
→ 동일한 키에 서로 다른 값 저장
2. 데이터 손실
리더 A: 레코드 삭제
리더 B: 레코드 수정
→ 네트워크 복구 후 충돌 해결 과정에서 데이터 손실 가능
3. 시스템 혼란
- 클라이언트가 어떤 리더에 요청해야 할지 불분명
- 일관성 없는 응답으로 인한 애플리케이션 오류
방지 및 해결 방법
1. 타임아웃 설정 최적화
- 너무 짧지도, 너무 길지도 않은 적절한 타임아웃 설정
- 네트워크 상황을 고려한 동적 타임아웃 조정
2. 쿼럼(Quorum) 기반 의사결정
- 과반수 이상의 노드 동의가 필요
- 홀수 개 노드로 구성하여 투표 시 항상 승자 결정
3. 펜싱(Fencing) 메커니즘
- 이전 리더를 강제로 종료하는 메커니즘
- 공유 리소스에 대한 접근 제어
4. 네트워크 모니터링
- 지속적인 네트워크 상태 모니터링
- 사전 경고 시스템 구축
스플릿 브레인은 분산 시스템에서 가장 위험한 상황 중 하나로, 철저한 설계와 모니터링이 필요합니다.
반응형
'DB' 카테고리의 다른 글
파티셔닝의 정의와 예시, 고려해야 하는 시점 (2) | 2025.08.02 |
---|---|
[데이터 중심 어플리케이션 설계하기] 2과. 데이터 모델과 질의 언어 (0) | 2025.07.13 |
[데이터 중심 어플리케이션 설계하기] 1과. 신뢰 할 수 있고 확장 가능 하며 유지 보수 하기 쉬운 애플리케이션 (1) | 2025.07.13 |
6/26 DB Connection Pool 고갈 장애 분석 및 해결 방안 리포트 (0) | 2025.06.27 |
[Tool] pgAdmin4 자주 사용하는 키보드 단축키 모음 (0) | 2025.05.21 |
댓글