Active-Active 데이터베이스의 집합
Active-Active 데이터베이스의 집합 (Sets in Active-Active databases) (sets-3)
Active-Active 데이터베이스에서 집합(Set)이 어떻게 동작하는지 알아볼게요. Redis 집합은 순서가 없는 문자열 모음이에요. Redis 명령으로 멤버를 추가하고, 제거하고, 존재 여부를 테스트할 수 있죠. 집합은 고유한 요소 모음을 유지해서, 이벤트 목록(클릭 스트림), 사용자(그룹 대화), 제품(추천 목록), 참여(좋아요, 공유) 등을 관리하는 데 아주 좋아요. 이 페이지에서는 집합이 CRDT에서 어떻게 동작하는지 옆에서 설명드릴게요.
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 시간 라벨이 반복되는 부분은 원문의 표기 그대로입니다.