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:0001current 생성
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 상태)