Active-Active 데이터베이스의 해시
Active-Active 데이터베이스의 해시 (Hashes in Active-Active databases) (hashes-5)
Redis 공식 문서의 hashes-5 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요.
Active-Active 데이터베이스에서 해시(Hash)를 어떻게 쓰는지 알려드릴게요. 해시는 필드와 값의 맵(map)으로 이뤄진 구조화된 데이터를 다루기에 아주 좋아요. 분산된 사용자/앱 세션 상태나 사용자 환경설정, 폼 데이터 같은 걸 관리할 때 많이 쓰죠.
기본 동작
해시 필드는 string 타입이에요. 그리고 CRDT 관점에서 보면 string 타입은 표준 Redis string 타입과 똑같이 동작해요. 필드를 초기화할 때는 쓰는 명령에 따라 성격이 달라져요.
HSET이나HMSET으로 string 타입으로 초기화HINCRBY로 정수 카운터 초기화HINCRBYFLOAT으로 부동소수점(floating point) 카운터 초기화
OR-Set 동작과 충돌 해결
Active-Active 데이터베이스의 해시는 일반 해시와 같게 동작하면서도, 동시에 발생하는 충돌 쓰기를 처리하기 위해 "OR-Set" 동작을 구현하는 추가 메타데이터를 유지해요. OR-Set 동작 덕분에 여러 Active-Active 인스턴스가 새 필드를 추가하는 쓰기는 보통 union(합집합) 되는 식으로 합쳐져요. 다만 충돌이 있을 때는 예외가 있죠.
충돌은 한 인스턴스가 필드를 삭제하는 동안 다른 인스턴스가 같은 필드를 추가할 때 발생할 수 있어요. 이때는 observed remove 규칙을 따라요. 쉽게 말하면, 삭제(remove)는 자기가 이미 본 필드에 대해서만 삭제할 수 있고, 그 외의 경우에는 요소 추가/업데이트(add/update)가 이겨요.
"add wins"(추가가 이기는) 예시
| 시간 | CRDB Instance 1 | CRDB Instance 2 |
|---|---|---|
| t1 | HSET key1 field1 "a" |
|
| t2 | HSET key1 field2 "b" |
|
| t4 | - Sync - | - Sync - |
| t5 | HGETALL key1 → 1) "field2" 2) "b" 3) "field1" 4) "a" |
HGETALL key1 → 1) "field2" 2) "b" 3) "field1" 4) "a" |
두 인스턴스가 서로 다른 필드를 추가했으니, 동기화 후에는 두 필드가 모두 남는 걸 볼 수 있어요.
참고로 필드 값은 CRDT string과 똑같이 동작해요. string 값은 필드를 초기화할 때 쓴 명령에 따라 string 타입이 될 수도, 정수 기반 카운터가 될 수도 있죠. 자세한 내용은 "Active-Active 데이터베이스의 String 데이터 타입"과 "Counter 값을 가진 String 데이터 타입" 문서를 확인해 보시면 도움이 돼요.
더 알아보기 (Learn more)
Active-Active 데이터베이스의 해시에 대해 더 배우고 싶다면 아래 문서를 확인해 보세요.