← 기술 지식

기술 지식 / 데이터 시스템 / 분산 시스템 / 합의

합의 구성 변경의 공동 쿼럼과 노드 재가입

old·new 과반의 비중첩 반례와 joint 조건을 계산하고 learner catch-up·구성 로그·제거 노드·cluster 세대·정상 복구의 경계를 설명합니다.

분산 시스템 · 원리·구현·운영
기술 지식 트리

합의 구성 변경의 기본 모델은 서버 주소 목록을 바꾸는 것이 아니라, 로그에 연결된 투표 권한 집합을 안전하게 바꾸는 것입니다. 안전성은 두 구성의 확정 조건이 겹치는지에 달리고, 가용성은 새 투표자가 실제 로그를 따라잡았는지와 장애 영역이 남아 있는지에 달리므로 두 축을 분리해 판단합니다.

서버 목록 배포와 실제 적용 시점

old={A,B,C}, new={C,D,E}로 바꾸려 합니다. A·B는 old의 과반이고 D·E는 new의 과반인데 서로 공유 노드가 없습니다. 각자가 다른 목록으로 결정을 확정하면 같은 위치에 충돌한 값을 만들 수 있습니다. 합의 구성은 단순 주소 설정이 아니라 누가 결정 권한을 갖는지 나타내는 프로토콜 상태입니다.

따라서 먼저 safety와 liveness를 구분합니다. 잘못된 파일 배포는 서로 다른 결정을 허용해 safety를 깨뜨릴 수 있고, learner가 뒤처진 상태에서 승격하면 필요한 응답을 모으지 못해 liveness가 떨어질 수 있습니다. 이 구분은 “노드가 살아 있다”는 관찰만으로 투표자 승격을 정당화하지 않게 합니다.

구성 변경은 현재 이력에 연결되어야 합니다. 각 서버의 파일을 새 목록으로 덮는 것이 그 이력을 만들지는 않습니다.

공동 구성의 old·new 과반 조건

joint consensus를 지원하는 모형은 전환 중 old 과반과 new 과반을 모두 요구합니다. old 2개, new 2개의 조건을 동시에 만족해야 합니다.

응답 집합 old 안 수 new 안 수 공동 조건
A,B,D 2 1 불충족
A,C,D 2 2 충족
C,D,E 1 3 불충족
A,B,D,E 2 2 충족

C가 old와 new에 모두 들어가더라도 모든 성공 응답에 C가 포함되어야 하는 것은 아닙니다. 응답 집합을 두 번 세어 old 구성원 수가 2 이상이고 new 구성원 수가 2 이상인지 각각 계산하면 공동 조건을 판정할 수 있습니다. 구현이 joint가 아니라 단일 멤버 변경 절차라면 그 절차의 단계와 쿼럼 규칙을 그대로 적용하고, 두 모델의 조건을 임의로 섞지 않습니다.

참여 집합 변경을 합의 이력으로 연결합니다old 구성으로 운영. 새 learner가 snapshot·log 따라잡기. old + new 공동 조건. new 단독 구성 확정새 노드 준비승격·구성 항목전환 프로토콜old 구성으로 운영새 learner가 snapshot·log 따라잡기old + new 공동 조건new 단독 구성 확정
참여 집합 변경을 합의 이력으로 연결합니다 화살표는 joint 방식의 개념적 단계입니다. 구성 항목을 언제 적용하고 어떤 쿼럼으로 확정하는지는 사용 구현의 정확한 절차를 따릅니다.
그림을 글로 읽기
  • old 구성으로 운영
  • 새 learner가 snapshot·log 따라잡기
  • old + new 공동 조건
  • new 단독 구성 확정
  1. old 구성으로 운영 → 새 learner가 snapshot·log 따라잡기: 새 노드 준비
  2. 새 learner가 snapshot·log 따라잡기 → old + new 공동 조건: 승격·구성 항목
  3. old + new 공동 조건 → new 단독 구성 확정: 전환 프로토콜

Learner 데이터 준비와 투표 권한 분리

뒤처진 새 노드를 바로 투표자로 넣으면 quorum의 필요한 응답 수는 늘지만 그 노드가 로그를 처리하지 못해 가용성이 떨어질 수 있습니다. 비투표 learner로 snapshot·log를 따라잡게 하고 저장 안정성·replication lag·apply·실제 성능을 확인한 뒤 승격합니다.

네트워크 연결·프로세스 Ready·로그 끝 숫자 하나만으로 모든 준비를 판단하지 않습니다. 구성 변경 중 leader가 죽으면 joint·최종 구성 항목의 저장·commit·적용 상태를 프로토콜대로 복구해야 합니다. 미커밋 구성 처리를 임의 파일 상태로 대체하지 않습니다.

제거 노드 주소와 재가입 투표 권한

오래된 노드가 예전 로그와 높은 term을 가지고 재등장할 수 있습니다. 현재 구성·cluster ID·노드 자격·term·로그를 검증하고 지원되는 재등록·learner·승격 경로로만 참여시킵니다. 제거 노드의 메시지와 term 영향을 제한하는 규칙·pre-vote 지원은 구현별로 확인합니다.

삭제한 node ID를 다른 새 프로세스에 재사용하면서 옛 디스크·메시지를 섞으면 정체성이 모호해질 수 있습니다. identity·generation·자격 폐기·저장소 fencing을 관리합니다. 서비스 발견 목록에 주소가 있다는 것과 합의 투표자로 등록되었다는 것은 별개입니다.

구성 변경 중 과반 상실과 정상 전환 중단

old 또는 new 조건을 만족하지 못하면 안전한 공동 단계 확정을 할 수 없습니다. 구성 숫자를 강제로 줄이는 것은 장애에서 벗어난 것처럼 보여도 과거 확정 기록을 버릴 수 있는 재해 복구입니다. 정상 변경과 별도 승인·손실 범위·옛 클러스터 차단·원장 대사가 필요합니다.

한 번에 여러 장애 영역의 투표자를 바꾸지 말고 현재 quorum 여유와 대체 node 준비를 확인합니다. node 수뿐 아니라 같은 rack·zone 손실 후 어떤 집합이 통신 가능한지 계산합니다.

전환 단계별 리더 손실 시험

learner 전송 중, 공동 구성 저장·commit 전후, new 확정 전후에 중단을 넣고 같은 로그 위치의 단일 결정과 구성 회복을 확인합니다. 제거 node 복귀·늦은 메시지·자격 오류도 포함합니다. 현재 작업에서는 합의 구성 변경을 실행하지 않았습니다. 본문은 전환 규칙과 검증 설계입니다.

재현 연습은 learner catch-up 중 leader 손실, joint 구성 commit 직후 손실, 최종 new 구성 commit 직후 손실을 각각 멈추는 것입니다. 예상 결과는 복구 뒤 구성 로그의 마지막 확정 위치가 단일하게 선택되고, 미커밋 구성은 파일을 덮어써서 확정한 것으로 취급되지 않으며, 제거된 node ID가 자동으로 투표권을 되찾지 않는 것입니다. 실제 결과는 사용하는 합의 구현의 로그와 복구 규칙으로 확인해야 합니다.

후속·관련 개념

함께 읽을 문서

전체 기술 지식
선택 연습 · 관련 질문 3개

질문은 이해를 확인하는 보조 자료입니다. 학습 경로와 문서의 범위는 질문 수와 독립적입니다.