Active-Active 데이터베이스의 해시

Active-Active 데이터베이스의 해시 (Hashes in Active-Active databases) (hashes-5)

Redis 공식 문서의 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 데이터베이스의 해시에 대해 더 배우고 싶다면 아래 문서를 확인해 보세요.