[입 개발] Redis의 Replication은 Async 이다. Mysql의 Replication과 유사하다.

해당 블로그는 KT UCloud의 지원을 받고 있습니다.

Redis는 최근에 가장 이슈가 되는 NoSQL Cache 솔루션입니다 많은 사람들이 memcache와도 비교를 하는데, Redis의 경우에는 몇가지 이점이 더 있습니다. 그 중에 하나가 Replication 입니다. 그러나 실제로 이 Replication을 쓴다고 할 때도 그 내부 메커니즘이 어떻게 되는지 정확하게 이해해야만, 더 정확하게 사용할 수 있습니다

먼저, Redis 에서 Replication을 사용하는 방법은 아주 간단합니다. 슬레이브에서 conf에 마스터의 주소와 포트만 추가하면 됩니다.

slaveof <masterip> <masterport>

Redis는 마스터/슬레이브 리플레케이션만 지원하고, 마스터/마스터 리플리케이션은 지원하지 않습니다. 다만 계층형 리플리케이션은 지원합니다.

Redis는 성능을 위해서 Async 방식의 리플리케이션을 사용합니다. 만약에 Sync 방식을 이용한다면, 엄청나게 속도가 줄어들 것입니다.  그러나 그것 때문에 Redis를 사용할 때 Failover등을 걱정한다면, 좀 더 자세히 알아야 할 필요가 있습니다.

Redis에서 리플리케이션을 담당하는 부분의 소스 코드는 다음과 같습니다. 기본적으로 processCommand 라는 함수에서 처리가 되고 이것은 네트웍 이벤트 처리하는 부분에서 패킷이 완성되면 호출되게 됩니다. Redis는 text 프로토콜을 이용합니다. ae.c 파일의 284 라인의 aeProcessEvents에서 시작합니다. 실제 흐름은 다음과 같습니다.

그리고, Redis의 리플리케이션은 mysql과 유사합니다. mysql에서는 Async, Semi-Sync 라는 두 가지 방식의 리플리케이션을 제공합니다.

  • Async: 클라이언트에 성공을 리턴할 때, 리플리케이션에 대한 어떠한 동작도 보장해주지 않습니다.
  • Sync: 하나의 트랜잭션은 슬레이브 노드에도 모두 데이터가 제대로 적용이 되었을 때, 리턴하게 됩니다. 성능은 가장 떨어집니다.
  • Semi-Sync: 슬레이브 노드에 로그가 복사만 되면, 클라이언트에 리턴을 하는 방식입니다. 안전성은 Async 보다 높고, 속도는 Sync 보다 빠릅니다.

Async 와 Semi-Sync 방식을 비교해보면, Semi-Sync는 좀 더 데이터의 안전서을 제공합니다. 다만 Async 보다 느립니다.

다음은 Async 방식의 리플리케이션 흐름입니다.

다음은 Sync 방식의 리플리케이션 흐름입니다.

다음은 Semi-Sync 방식의 리플리케이션 흐름입니다.

Reference: