요약

  • RFC 3384는 멀티마스터 레플리카가 수렴하도록 요구했지만, 충돌 해결 과정에서 디렉터리 정보가 손실될 경우 그 패한 정보 역시 저장되고 관리자에게 공개되어 필요 시 재정의할 수 있어야 했다.
  • 도착 순서가 최종 수렴을 결정할 수 없었다. 안정적인 라이브 승자와 불일치에 대한 보존된 기록은 별개의 시스템 의무였다.

두 디렉터리 서버가 연결이 끊긴 상태에서 같은 애트리뷰트에 대해 서로 다른 갱신을 받아들였다고 하자. 모든 레플리카가 수렴해야 한다면 다시 만났을 때 두 값이 모두 라이브 정답으로 남을 수는 없다. 하나의 값이 이기게 된다. 어려운 질문은 나머지 값의 운명이다.

단순한 구현은 그 값을 덮어써 수렴을 축하하고, 정당한 변경이 한번 존재했었다는 유일한 증거까지 지워버릴 수 있다. RFC 3384는 요구사항 수준에서 이 지름길을 거부했다. 멀티마스터 충돌 해결 과정에서 디렉터리 정보가 손실될 경우, 복제 프로세스는 그 정보를 저장하고, 충돌과 손실에 대해 관리자에게 통지하며, 필요 시 관리자가 재정의할 수 있는 메커니즘을 제공해야 했다.

2002년 10월 Informational RFC로 발행된 이 문서는 완전한 LDAP 복제 프로토콜을 정의하지 않았다. 상호운용 가능한 프로토콜이 충족해야 할 요구사항을 모은 문서였다. 이 구분은 중요하다. 문서는 수용 가능한 설계의 경계를 서술했을 뿐, 특정 제품이 그 경계를 구현했다는 증명도, 하나의 보편적 충돌 알고리즘을 규정한 것도 아니었다.

LDAP은 이미 클라이언트와 서버 간 통신을 표준화했다. 서버 간 복제는 별개의 문제로 남아 있었다. 분산은 내결함성을 높이고 디렉터리 콘텐츠를 클라이언트에 가까이 가져올 수 있었지만, 토폴로지, 부분 레플리카, 스키마, 접근 제어, 세션 보안, 재전송, 상충하는 쓰기라는 질문들을 함께 가져왔다.

RFC 3384는 복제 영역을 디렉터리 정보 트리(DIT)의 구성 가능한 부분으로 정의했다. 영역은 겹치거나 중첩될 수 있었다. 레플리카는 영역의 한 인스턴스이며, 레플리카 그룹은 해당 영역을 보유한 서버들을 담았다. 복제 계약은 교환을 규율하는 매개변수, 즉 영역, 접근, 자격 증명, 기밀성, 전파 동작을 기술했다.

문서는 다섯 가지 일관성 모델을 검토했다. 트랜잭션 일관성은 익숙한 ACID 성질을 제공했지만, 분산 2단계 커밋은 상당한 복잡성을 수반했기 때문에 당시에는 추구되지 않았다. 요구사항의 초점은 최종 일관성과 제한적 노력 최종 일관성이었다. 두 모델 모두에서 일시적 불일치는 프로토콜이 이미 실패했다는 증거가 아니라 운영 모델의 일부였다.

‘최종’이 임의를 뜻하지는 않았다. 요구사항 M3는 해당 엔트리를 보유한 모든 레플리카에서 애트리뷰트가 동일한 값 집합으로 수렴해야 한다고 했다. 멀티마스터 요구사항 MM6는 애트리뷰트와 엔트리에 대해 같은 의무를 반복했다. 레플리카들은 전파 중에는 불일치할 수 있지만, 프로토콜은 공통 상태로 가는 경로를 제공해야 했다.

멀티마스터 복제는 설계상 충돌을 가능하게 했다. 여러 마스터 레플리카가 다른 서버에 먼저 연락하지 않고 쓰기를 받아들일 수 있었다. 이는 가용성과 로컬 운영을 보존했지만, 두 쓰기가 어느 쪽도 상대 서버에 도달하기 전에 같은 디렉터리 데이터에 닿을 수 있었다. 수렴은 이제 결정론적 판단을 요구했다.

결정론만으로는 부족했다. “마지막 도착이 이긴다” 같은 규칙은 모든 레플리카가 우연히 같은 순서를 관찰할 때만 반복 가능한 로컬 답을 줄 수 있다. 네트워크는 그것을 보장하지 않는다. 그래서 MM7는 충돌 해결이 변경 사항의 순서대로 도착함에 의존해서 최종 수렴을 보장할 수 없다고 요구했다. 권위는 패킷 타이밍에 외주화될 수 없었다.

문서는 하나의 대체 규칙, 타임스탬프 체계, 논리 시계를 선택하지 않았다. 요구사항은 더 근본적이었다. 독립적인 레플리카들이 지원되는 모델 하에서 같은 결과에 도달해야 한다는 것. 이는 이후 프로토콜 작업의 여지를 남기면서, 자신이 통제할 수 없는 도착 순서에 정확성이 의존하는 설계를 막았다.

생존한 라이브 값과 패한 정보는 서로 다른 현실 계층에 속했다. MM5는 멀티마스터 복제가 정보를 잃지 않도록 요구했다. 해결 과정이 그럼에도 수렴된 상태에서 디렉터리 정보를 제거하게 된다면, 프로세스는 그 정보를 다른 곳에 보존하고, 충돌과 손실을 관리자에게 설명하며, 되돌림을 가능하게 해야 했다.

이 요구사항은 두 값이 모두 라이브 엔트리에 남는다고 말하지 않았다. 그렇게 하면 충돌을 해결하는 것이 아니라 판단 자체를 회피하게 된다. 요구된 것은 수렴된 디렉터리 뷰에 증거 채널을 더한 것이었다. 관리자는 자동 규칙이 밀어낸 내용을 검토하고 라이브 선택을 재정의할지 판단할 수 있었다.

이것은 시각적 동일성보다 더 엄격한 일관성 개념이다. 다섯 개의 레플리카가 같은 값을 표시하더라도, 그 값이 권위를 갖게 된 경로를 파괴했다면 여전히 운영적으로 결핍된 상태다. 동일성은 독자가 지금 보는 것에 답한다. 보존된 충돌 증거는 그 상태가 감사 가능하고 책임 있게 재검토될 수 있는지에 답한다.

재전송은 또 하나의 경계였다. 요구사항 M12는 여러 번 수신된 갱신이 한 번 수신된 것과 다른 결과를 만들 수 없다고 했다. 연결은 끊기고, 확인 응답은 사라지고, 공급자는 재시도한다. 재전송을 두 번째 독립 변경으로 세는 복제 프로토콜은 복구를 손상으로 바꾼다.

원자성도 전송을 넘어 살아남아야 했다. P6는 LDAP 연산이 약속한 원자성의 보존을 요구했다. 여러 변경이 하나의 연산에 속한다면, 복제는 그 변경들이 서버 사이를 이동한다는 이유만으로 부분 적용을 노출할 수 없었다. 멀티마스터 시스템에서 각 원자 연산을 보존하는 일은 여전히 두 개의 완전한 연산 사이의 해결 불가능한 충돌을 만들 수 있었다. 원자성은 찢어진 갱신을 막았을 뿐, 경쟁하는 유효한 이력을 제거하지 않았다.

복제 개시 충돌에는 별개의 결정론적 요구가 있었다. 여러 마스터가 같은 레플리카와 동시에 주기를 시작하려 할 때, 시스템은 그 경합을 자동으로 해결하거나 회피할 방법이 필요했다. 복구와 재조율 역시 바쁜 소비자나 끊긴 연결을 다룰 수 있어야 했다. 세션 조율과 데이터 충돌은 관련되어 있지만 동일한 문제는 아니었다.

관리는 상호운용성의 일부였다. 모든 레플리카는 어떤 서버와 데이터를 교환했는지에 대한 감사 이력을 유지해야 했다. 구현은 두 레플리카를 비교하고 새 복제 주기를 촉발하지 않고 차이를 복구할 수 있어야 했다. 빈 레플리카는 전체 갱신으로부터 초기화 가능해야 했다. 이 요구사항들은 조정을 관찰 가능하게 만들어, 보이지 않는 배경 약속으로 남겨두지 않았다.

갱신 순서는 정책이 데이터를 지배하는 곳에서 중요했다. AM6는 복제가 접근 제어 정보와 그것이 지배하는 데이터 사이의 순서를 보존하도록 요구했다. 데이터 변경이 그것을 승인하거나 보호하는 규칙보다 먼저 도착하면 보안 의미가 다른 일시적 상태가 만들어질 수 있었다. 일반적인 도착 순서가 충돌 승자를 고를 수는 없었지만, 일부 인과 관계는 여전히 명시적으로 운반되어야 했다.

스키마 불일치도 처리되고 보고되어야 했다. 복제에는 스키마 정의, 애트리뷰트 이름과 값, 접근 제어 정보, 지식 정보, 네임스페이스 정보가 포함되었다. DSA 고유의 운영 애트리뷰트는 그 자체로는 제외되었다. 레플리카는 부분적일 수 있지만, 부분적이라는 것이 정의되지 않았다는 뜻은 아니었다. 계약은 어떤 영역, 엔트리, 애트리뷰트가 복사본에 속하는지 명시해야 했다.

보안 요구사항은 인증, 승인, 무결성, 기밀성을 서로 구분된 상태로 유지했다. 복제 세션은 상호 인증과 상호 승인 검사, 보호된 전송을 지원해야 했다. 문서는 익명 복제 세션 지원도 요구했다. 이는 익명 교환을 인증된 교환과 동등하게 만든 것이 아니라, 프로토콜이 두 경우와 그 정책적 결과를 모두 표현해야 한다는 뜻이었다.

이후의 LDAP 기술 사양인 RFC 4510, RFC 4511, RFC 4512는 시간적 순서를 제공한다. RFC 4533은 LDAP 콘텐츠 동기화 연산을 정의했고, RFC 5805는 이후 트랜잭션을 정의했다. 이들 중 어느 것도 RFC 3384의 멀티마스터 요구사항 전체가 그대로 구현되었다는 증거로 다루어질 수 없다. 인접성은 동일성이 아니다.

RFC 3384 바로 앞에 발행된 RFC 3383은 LDAP 확장 식별자의 등록을 조직했다. 두 문서는 서로 다른 표면을 다루었다. 하나는 새 이름이 공유 프로토콜 공간에서 충돌하지 않도록 했다. 다른 하나는 정당한 변경이 시간적으로 충돌할 때 디렉터리 상태의 복사본들이 어떻게 조정되어야 하는지 물었다.

Lu Heng의 최소 초기 사양 관점은 왜 요구사항 문서가 모든 알고리즘을 선택하지 않고도 가치를 가질 수 있는지 설명하는 데 도움이 된다. 문서는 양보할 수 없는 경계—수렴, 보존된 손실 증거, 통지, 재정의—를 고정하면서 구현 선택은 이후 작업에 남겼다. 미래의 결정은 여전히 국소적이었지만, 그 결정이 일으킬 수 없는 피해는 이미 이름 붙어 있었다.

그의 현실 계층 관점은 핵심 구분을 드러낸다. 수락된 쓰기, 전파된 갱신, 충돌 판단, 수렴된 라이브 엔트리, 저장된 패한 정보, 관리자의 인지, 최종적 인간 재정의는 별개의 사실이다. 모든 레플리카가 초록으로 표시되는 대시보드는 단 하나의 계층만 증명한다. 불일치가 보존되고 검토되었는지까지는 증명하지 않는다.

RFC 3384의 지속되는 교훈은 수렴이 너무 깨끗할 수 있다는 것이다. 분산 시스템은 답을 경합 가능하게 만든 역사를 삭제함으로써 하나의 답에 도달할 수 있다. 패한 값을 보존하라는 요구는 침묵한 덮어쓰기를 감사 가능한 결정으로 바꾸었다. 레플리카들은 결코 불일치한 적이 없었다고 가장하지 않은 채 합의할 수 있었다.

출처