Valkey/Redis, 제로 카피(Zero-Copy) 복제로 데이터 복제 효율 극대화!
Valkey/Redis는 제로 카피(Zero-Copy) 기술을 활용하여 마스터 노드에서 레플리카 노드로의 데이터 복제를 최적화함
Hash Field Expiration(HFE)과 같은 기능 구현 과정에서 발생할 수 있는 데이터 불일치 문제와 해결 방안 제시
RESP(Redis Serialization Protocol)를 사용하여 통신하며, AOF(Append-only File)를 통해 데이터 지속성 확보
replBufBlock 구조체를 활용한 효율적인 복제 버퍼 관리 및 async replication 방식의 데이터 동기화
Hash Field Expiration(HFE)과 데이터 불일치 문제
Valkey/Redis는 Hash Field Expiration(HFE) 기능을 통해 해시 필드(Hash Field)별 TTL(Time-To-Live) 설정을 지원한다. 하지만, 마스터 노드에서 `KEEPTTL` 옵션과 함께 명령을 실행하는 경우, 네트워크 지연이나 파티션으로 인해 레플리카 노드에서 데이터 불일치(Data Inconsistency)가 발생할 수 있다. 이러한 문제를 해결하기 위해 Valkey는 명령 재작성(Command Rewriting) 및 `HSETEX` 명령을 활용하여 데이터 일관성을 유지한다.
RESP(Redis Serialization Protocol) 기반의 통신
Valkey/Redis는 RESP(Redis Serialization Protocol)를 사용하여 클라이언트와 서버 간의 통신을 수행한다. RESP는 구현, 파싱, 가독성이 용이하며, `GET` 및 `SET`과 같은 명령을 처리하는 데 사용된다. `processInputBuffer` 함수를 통해 입력 버퍼를 파싱하고, `processCommand`를 통해 적절한 함수를 호출하여 명령을 실행한다. 이러한 구조는 Valkey/Redis의 유연성과 확장성을 보장한다.
제로 카피(Zero-Copy)를 위한 replBufBlock 구조
Valkey/Redis의 효율적인 복제(Replication)는 replBufBlock 구조체를 기반으로 한다. 이 구조체는 참조 카운트(refcount)를 사용하여 공유 메모리 버퍼의 사용을 관리하고, `buf` 필드를 통해 복제 명령을 저장한다. 마스터 노드는 복제 버퍼를 생성하고, 레플리카 노드는 이 버퍼에서 데이터를 요청한다. 이러한 제로 카피(Zero-Copy) 방식은 데이터 복제 과정에서 불필요한 메모리 복사를 줄여 성능을 향상시킨다.
비동기 복제(Async Replication) 및 Repl Backlog
Valkey는 비동기 복제(Async Replication) 방식을 사용하여 마스터 노드에서 레플리카 노드로 데이터를 전송한다. 각 클라이언트는 복제된 명령을 추적하며, 마스터 노드는 `Repl Backlog`를 유지하여 실행된 RESP 명령을 버퍼에 저장한다. 레플리카 노드가 백로그보다 오래된 명령을 요청하는 경우, 전체 데이터의 복사본을 요청하는 Full Resync를 수행한다. 이러한 구조는 데이터 손실을 방지하고, 시스템의 안정성을 높인다.
명령 재작성(Command Rewriting)을 통한 데이터 일관성 유지
Valkey/Redis는 데이터 일관성을 위해 명령 재작성(Command Rewriting) 기법을 사용한다. 예를 들어, 만료된 필드를 삭제하기 위해 `HDEL` 명령으로 재작성하거나, `NX/XX`와 같은 플래그가 설정된 경우 전체 명령을 다시 작성한다. 또한, 시간 관련 명령의 경우, 시스템 간의 부동 소수점 정밀도 차이를 고려하여 `SET` 명령으로 변환한다. 이러한 과정을 통해 레플리카 노드는 마스터 노드와 동일한 결과를 얻을 수 있다.