[입 개발] Redis의 Master/Slave 의 replication의 최초 Sync는 어떻게 이루어질까?

최근에 Redis 관련 버그를 하나 보다가, 그냥 Redis 코드에서 전에 모르고 있던 것이 보여서 간단하게 정리합니다.
Redis의 최초 Master/Slave SYnc는 간단하게 다음과 같은 흐름으로 이루어집니다.

1] Master 에 Slave 가 연결
2] Slave 가 Master로 부터 Sync 정보를 temp-%d.%ld.rdb 형태로 저장
3] 모든 정보를 저장하면 현재 DB를 EmptyDb()를 통해서 모두 지우고
4] rdbLoad 를 통해서 RDB 로드

간단하게 소스 흐름을 따라가면 다음과 같습니다.

m_s_sync

그 뒤로는 이제 Master에 명령이오면 이를 일반 클라이언트의 명령처럼 전달받아서 처리하게 됩니다.

 

그런데 왜 이런 형태로 진행이 될까요? 그 이유는 Redis 현재까지의 진행사항에 대한 로그가 없기 때문에 기존에 이미 실행된 명령에 대해서는 Replay 할 수 없기 때문입니다. 그러므로, RDB를 저장하듯이 데이터를 전달하고, 그 다음에는 커맨드가 실행될 때마다 해당 패킷을 Replay 하듯이 슬레이브로 전달하게 되는 것입니다. 그래서 이런 형태로 구성이 된다고 생각하시면 될 것 같습니다. 어떻게 잘 수정하면 디스크에 쓰기 없이 Replication Sync 를 해서 성능 향상을 이룰 수도 있을것 같기도 합니다.