Active-Active 데이터베이스의 집합

Active-Active 데이터베이스의 집합 (Sets in Active-Active databases) (sets-3)

Active-Active 데이터베이스에서 집합(Set)이 어떻게 동작하는지 알아볼게요. Redis 집합은 순서가 없는 문자열 모음이에요. Redis 명령으로 멤버를 추가하고, 제거하고, 존재 여부를 테스트할 수 있죠. 집합은 고유한 요소 모음을 유지해서, 이벤트 목록(클릭 스트림), 사용자(그룹 대화), 제품(추천 목록), 참여(좋아요, 공유) 등을 관리하는 데 아주 좋아요. 이 페이지에서는 집합이 CRDT에서 어떻게 동작하는지 옆에서 설명드릴게요.

출처: Redis 공식 문서 — Sets in Active-Active databases

Active-Active에서의 동작 (How sets behave)

Active-Active 데이터베이스의 집합은 표준과 동일하게 동작하면서, 동시에 발생하는 충돌 쓰기를 처리하기 위한 "OR-Set" 동작을 달성하기 위해 추가 메타데이터를 유지해요. OR-Set 동작에서는 여러 Active-Active 데이터베이스 인스턴스에 걸친 쓰기가 충돌 상황을 제외하면 보통 합집합(union)처럼 처리돼요.

인스턴스 간 충돌 쓰기는 한 Active-Active 인스턴스가 요소를 삭제하는 동안 다른 인스턴스가 같은 요소를 추가할 때 발생할 수 있어요. 이 경우 observed remove(관찰된 제거) 규칙이 따라집니다. 즉, 삭제는 이미 본(seen) 인스턴스만 제거할 수 있고, 그 외의 모든 경우에는 요소 추가(add)가 이겨요.

"add wins" 예제

다음은 "추가가 이기는(add wins)" 케이스의 예시예요.

시간 (Time) CRDB Instance1 CRDB Instance2
t1 SADD key1 "a"
t2 SADD key1 "b"
t3 SMEMBERS key1 "a" SMEMBERS key1 "b"
t4 — Sync — — Sync —
t3 SMEMBERS key1 "a" "b" SMEMBERS key1 "a" "b"

두 인스턴스가 서로 다른 요소를 추가하고 동기화한 뒤에는 두 요소가 모두 유지돼요. 서로 다른 요소에 대한 추가는 충돌하지 않으니 합집합처럼 합쳐지는 거죠.

"observed remove" 예제

다음은 "관찰된 제거(observed remove)" 케이스의 예시예요.

시간 (Time) CRDB Instance1 CRDB Instance2
t1 SMEMBERS key1 "a" "b" SMEMBERS key1 "a" "b"
t2 SREM key1 "a" SADD key1 "c"
t3 SREM key1 "c"
t4 — Sync — — Sync —
t3 SMEMBERS key1 "c" "b" SMEMBERS key1 "c" "b"

인스턴스1이 동기화 이전에 이미 본 "a"는 제거할 수 있었지만, 동기화 전에 보지 못했던 "c"는 인스턴스2가 추가한 요소라서 제거하지 못했어요. observed remove 규칙 덕분에 "본 적 없는 요소 삭제"라는 충돌이 방지되는 거죠.

참고: 표의 t3/t4 시간 라벨이 반복되는 부분은 원문의 표기 그대로입니다.

더 알아보기 (Learn more)