Redis) 이것이 레디스다 11 - 복제 기법

레디스는 단일 스레드로 동작하기 때문에 하나의 레디스 인스턴스가 사용할 수 있는 최대 CPU의 갯수는 하나이다.
따라서 성능을 높이기 위해 CPU를 추가하는 것은 성능 향상에 큰 도움은 되지 않는다.

※ 4.0 버전 부터는 AOF 작업 등을 위해 4개의 쓰레드로 동작한다.
(참고: http://redisgate.kr/redis/configuration/redis_thread.php)
하지만 명령을 처리하는 메인 쓰레드가 하나 뿐이기 때문에 위 내용은 현재도 적용 가능한 내용이라고 생각된다.

스케일 아웃 용어

  • 복제: 어느 노드에 접근하더라도 동일한 데이터를 읽을 수 있도록 데이터를 각 노드에 복제하여 저장하는 것
  • 샤딩: 데이터를 특정 조건에 따라 나누어 저장하는 것
  • 샤드(Shard): 두개의 노드를 사용하여 데이터를 분할 저장하였을 때 각 노드를 샤드라고 한다.

레디스 복제

레디스의 복제는 기본적으로 마스터 노드에서 쓰기 연산을 수행하고 슬레이브 노드에서 읽기 연산을 수행하도록 하여 읽기와 쓰기를 완전히 분리한다.

복제는 슬레이브 노드가 마스터 노드의 데이터를 실시간으로 복제하여 데이터의 동기화를 유지한다.
하지만 데이터 동기화의 시간차로 인해 데이터가 불일치 되는 시점이 있다. (weak consistancy)

레디스는 마스터 노드가 슬레이브 노드의 정보를 갖지 않기 때문에 다양한 구조의 복제 구성이 가능하다.

  • 단일 복제

마스터와 슬레이브 노드에 각각 쓰기 연산과 읽기 연산을 분할하여 호출해야 하는데 그러기 위해서는 애플리케이션이 어떤 노드가 마스터인지 슬레이브인지 알아야하기 때문에 애플리케이션 복잡도가 증가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Slave 인스턴스를 실행하기 전 Master의 정보

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:16f386b8be7cf2b0eb7979aa3d591fd717d8440a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Master의 정보

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=1
master_replid:cb1c21ad53fa989165e83341e33662e83351bed2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Slave의 정보

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up # Master와의 연결 상태
master_last_io_seconds_ago:10 # 마지막으로 명령을 수신한 시간
master_sync_in_progress:0 # Master와 현재 동기화 중인지 여부
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:cb1c21ad53fa989165e83341e33662e83351bed2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42

(기존 redis.conf에서 slave.conf로 복사하여 slaveof 127.0.0.1 6379 설정 추가하고 port만 바꿔주었다.)

  • 다중 복제

단일 복제만으로 읽기 성능을 만족하지 못할 때 다중 복제를 고려할 수 있다.

하지만 너무 많은 슬레이브가 마스터에 붙게되면 마스터의 리소스가 복제를 위한 데이터 동기화에 사용되어 전체적인 성능이 저하될 수 있다.

  • 계층형 복제

마스터 노드에 너무 많은 슬레이브가 접속되어 쓰기 성능이 저하되는 문제점을 해결하기 위한 복제 방법이다.


2대 이상이 마스터 노드 역할을 하는 듀얼 마스터 구조는 정상적으로 동작하지 않는다.

Share