RID


개요

RID는 복제 네트워크에 속한 각 노드가 자신의 데이터 버전을 관리하기 위해 사용하는 식별자입니다. 각 노드는 리소스 당 1 set의 RID를 관리합니다.

RID의 예:

00000000000000000000000000:01DT3V6WF6K5K12JBV8B563TXP:01DT3TREEM05JE0G8NFRACKJ3Y:01DT3TPFFQV48H3D51300DH53S:01DT3P4BTHN2T3QZTR9V78CPV5:1:0:0:0:3

간소화 출력(타임 스탬프만 출력)의 예:

0000000000:01DT3V6WF6:01DT3TREEM:01DT3TPFFQ:01DT3P4BTH:1:0:0:0:3

구조

[ data id list ]:[flags]
[incoming]:[head]:[old1]:[old2]:[base]:[flags]

  • incoming

    • 동기화가 진행 중일 때 타겟에 지정되는 ULID.

    • 동기화 소스의 current와 같은 값.

  • head

    • 현재 데이터의 ULID.

  • old1, old2

    • 과거 데이터 ULID. current → old1 → old2의 순서로 순환됩니다.

    • 노드 간 동기화 방향을 결정하는데 사용됩니다.

  • base

    • 복제 네트워크의 고유 ULID. 순환되지 않습니다.

    • 노드가 연결되지 않은 동안 RID가 3번 이상 순환되어 SB로 판단되는 경우, 같은 복제 네트워크의 노드가 맞다는 것을 증명하기 위해 추가되었습니다.

  • flags

    • ULID 이외의 추가 정보를 담기 위한 영역. file_lock이외의 플래그는 0 또는 1의 두 가지 값만 사용 할 수 있습니다.

      • consistency

        • 데이터의 일관성을 나타내는 플래그.

      • outdated

        • Primary와의 복제가 중단되면 Secondary에 설정되는 플래그.

      • primary

        • 노드가 승격 될 때 설정되며, 강등시에만 해제됩니다.

      • crashed_primary

        • primary 상태에서 정사적으로 종료되지 않은 경우 설정되며 동기화에 의해 해제됩니다.

      • file_lock

        • 파일 잠금 상태

        • 0: 알 수 없음, 1: 잠금 해제, 2: 잠금


동작

RID의 기본 값은 다음과 같습니다.

00000000000000000000000000:00000000000000000000000000:00000000000000000000000000:00000000000000000000000000:00000000000000000000000000:0:0:0:0:0

길이가 너무 길어 가독성이 떨어지므로 이 문서에서는 간략하게 표현합니다.

초기상태

복제 네트워크가 연결되어 모든 노드가 secondary로 평형 상태인 경우 각 노드의 ULID는 다음과 같이 기본값으로 유지됩니다.

  • inco:head:old1:old2:base
    0000:0000:0000:0000:0000

승격

노드 승격 시 current 값이 설정되어 있지 않으면 초기화 과정이 먼저 수행됩니다.

  • 승격에 의한 초기화 과정

    • base 생성
      inco:curr:old1:old2:base
      0000:0000:0000:0000:0001

    • current 생성
      inco:curr:old1:old2:base
      0000:0001:0000:0000:0001

  • primary 플래그 지정

    inco:curr:old1:old2:base
    0000:0001:0000:0000:0001

강등

Primary 플래그를 해제합니다.

동기화

동기화를 진행하는 과정에서의 RID 는 다음과 같이 운용됩니다.

  • A → B 동기화

    • 동기화 전

      • A

        • inco:head:old1:old2:base
          0000:0001:0000:0000:0001

      • B

        • inco:head:old1:old2:base
          0000:0000:0000:0000:0001

    • 동기화 시작

      • A는 유지

      • B의 incoming에 A의 current가 설정 됩니다.

        • inco:head:old1:old2:base
          0001:0000:0000:0000:0001

    • 동기화 완료

      • B의 RID 순환

        • inco:head:old1:old2:base
          0000:0001:0000:0000:0001

  • current가 같은 노드 간 동기화

    • 위와 같이 동작하나 중복 순환되지 않습니다.

    • 동기화 전

      • A & B

        • inco:head:old1:old2:base
          0000:0003:0002:0001:0001

    • 동기화 시작

      • B

        • inco:head:old1:old2:base
          0003:0003:0002:0001:0001

    • 동기화 완료

      • B

        • inco:head:old1:old2:base
          0000:0003:0002:0001:0001

RID Compare

복제 네트워크가 연결되어 connected 상태가 되면 각 노드는 서로의 RID를 전달하여 다음의 순서로 비교합니다.

  • 두 노드의 base가 모두 존재하고 서로 다르면 관계 없는 노드로 판단합니다.

  • head, old1, old2를 비교하여 같은 ULID를 찾아 인덱스 번호를 도출합니다. (각각 0, 1, 2)

    • 서로의 인덱스를 비교한다.

      • 양 노드 모두 인덱스 0이면 같은 데이터이므로 동기화가 필요하지 않습니다. (head가 같음)

      • 한 노드(A)의 인덱스는 0이고 다른 노드(B)는 1 이상이라면 B → A로 동기화 합니다.

      • 양 노드 모두 1 이상인 경우, 공통 분모가 존재하는 SB로 판단합니다.

        • head의 타임스탬프 비교를 통해 younger primary 판단

        • 같은 인덱스의 ULID를 통해 SB 발생 전의 데이터 시점 판단

  • 같은 ULID가 존재하지 않는 경우

    • 한 노드의 head가 비어있는 경우 해당 노드를 향해 동기화 합니다.

    • 두 노드의 head가 모두 존재하는 경우 공통 분모를 찾을 수 없는 SB로 판단합니다.

      • younger primary의 판단 의미가 없음

      • SB 발생 전의 데이터 시점을 알 수 없음

RID 플래그

복제 데이터가 생성되지 않으면 데이터의 세대가 구분될 필요가 없으므로, 복제가 발생 했는지 여부를 플래그로 두어 운용합니다.

플래그 갱신 시점:

  • 자신이 승격 될 때

    • 연결되지 않은 노드가 존재하는 경우 플래그 설정

  • 자신이 Primary일 때

    • 상대 노드와의 연결이 종료되는 경우 플래그 설정 (disconnecting 상태)

    • 상대 노드와 연결되었을 때 모든 노드가 연결된 것으로 판단되면 플래그 해제 (established 상태)