1. redis 설정파일 위치
# yum으로 설치한 경우
vi /etc/redis.conf
# 직접 설치 한 경우
vi /etc/redis/6379.conf
2. Replication
-
Replication은 레디스의 데이터를 거의 실시간으로 다른 레디스 노드에 복사하는 작업입니다.
따라서 서비스를 제공 중이던 레디스 노드(마스터)가 다운되더라도 데이터를 받은 레디스 노드(슬레이브)가 서비스를 계속 할 수 있습니다.
실제 운영환경이라면 마스터-슬레이브로 구성하는 것이 권장되며, 마스터와 슬레이브는 물리적으로 다른 머신에 두어야 합니다.
레디스는 비동기(asynchronous) 복제를 하며, 마스터는 슬레이브를 여러 개 둘 수 있고 슬레이브는 또 여러 슬레이브를 둘 수 있습니다.
또한 마스터에 있는 대량의 슬레이브에 보내는 작업은 자식 프로세스가 처리하기 때문에 복제 중에도 마스터는 멈추지 않고 정상적으로 요청을 할 수 있습니다.
-
마스터의 부하를 줄이기 위해서, persistence(AOF, RDB)기능을 슬레이브에서 수행하는 것도 좋은 방법입니다.
하지만 서버가 리부트할 때마다 마스터를 자동 재시작하도록 설정했다면 데이터를 잃지 않기 위해서는 마스터에 persistence(AOF, RDB)기능을 사용해야 하는데, 그 이유는 아무리 슬레이브에 persistence(AOF, RDB) 기능을 사용한다고 해도 마스터가 자동 시작되면 마스터의 빈 데이터들이 슬레이브로 복제되므로 데이터가 모두 사라지기 때문입니다.
3. Replication 방식
전체 동기화(full synchronization)
- 마스터는 자식 프로세스를 시작해 백그라운드로 RDB 파일에 데이터를 저장합니다.
- 데이터를 저장하는 동안 마스터에 새로 들어온 명령들은 처리 후 복제버퍼에 저장됩니다.
- RDB 파일 저장이 완료되면, 마스터는 파일을 슬레이브에게 전송합니다.
- 슬레이브는 파일을 받아 디스크에 저장하고, 메모리에 로드합니다.
- 마스터는 복제버퍼에 저장된 명령을 슬레이브에게 전송합니다.
부분 동기화(partial resynchronization)
- 마스터와 슬레이브는 각 서버의 run id와 replication offset을 가지고 있는데, 마스터와 슬레이브 간 네트워크가 끊어지게 되면, 마스터는 슬레이브에 전달할 데이터를 backlog-buffer에 저장했다가 다시 연결 되었을 때, run id와 offset을 비교해서 그 이후부터 동기화합니다.
이를 부분 동기화(partial resynchronization) 이라고 합니다.
만약, 네트워크가 끊어진 시간이 길어져서 마스터의 backlog-buffer가 넘치게 되면 다시 연결 때 전체 동기화하며 마스터나 슬레이브 중 한 쪽이 재시작 한 경우에도 전체 동기화를 합니다.
4. Redis.conf
1) replicaof
4. Redis.conf
1. replicaof
replicaof <masterip> <masterport>
- 마스터-슬레이브 복제에서 마스터의 IP와 Port를 설정합니다.
- 마스터 서버의 데이터를 실시간으로 슬레이브 서버로 복사합니다.
- redis 4.x 이전버전은 slaveof 입니다.
2. replica-serve-stale-data
replica-serve-stale-data yes
- 마스터 노드와의 연결이 끊겼을 경우 슬레이브 노드로 들어오는 명령에 어떻게 대처할지 설정합니다.
- yes: 슬레이브 노드에서 읽거나 쓰기 명령을 모두 받고 처리해줍니다.
- no: 슬레이브 노드로 들어오는 모든 명령에 에러상태로 되돌려줍니다.
- redis 4.x 이전버전은 slave-serve-stale-data 입니다.
3. replica-read-only
replica-read-only yes
- 슬레이브 서버에 클라이언트가 접속해서 데이터 write 명령을 수행하게 할지를 설정합니다.
- default는 yes로 읽기(조회)만 가능합니다.
- redis 4.x 이전버전은 slave-read-only 입니다.
4. repl-diskless-sync
repl-diskless-sync no
- RDB 파일을 디스크에 쓰지 않고 직접 소켓으로 전송하는 여부를 설정합니다.
- 네트워크 성능은 좋고 디스크 성능이 좋지 않을 경우 사용하도록 고안되었습니다.
- 마스터에서 슬레이브로 데이터가 복제될 때 서버가 RDB 파일을 디스크에 생성해서 슬레이브 서버로 전송하지만 repl-diskless-sync를 yes로 하면 RDB 파일을 디스크에 쓰지 않고 직접 소켓으로 전송합니다.
5. repl-diskless-sync-delay
repl-diskless-sync-delay 5
- 슬레이브 서버에서 동기화 요청 후 동기화를 진행하기 전의 지연 시간을 설정합니다.
- default는 5초이며 슬레이브 서버가 동기화 요청 후 5초 후에 마스터 서버는 동기화를 시작합니다.
6. repl-ping-replica-period
repl-ping-replica-period 10
- 슬레이브 노드에서는 주기적으로 마스터 노드에 ping 명령을 날려 마스터 노드와의 접속상태를 확인하는데, 그 주기(초)를 설정합니다.
- redis 4.x 이전버전은 repl-ping-slave-period 입니다.
7. repl-timeout
repl-timeout 60
- 마스터 서버와 슬레이브 서버간에 연결이 끊겼다고 인식하는 시간이며, 이는 repl-ping-replica-period로 설정된 값보다 커야합니다.
8. repl-disable-tcp-nodelay
repl-disable-tcp-nodelay no
- 마스터와 슬레이브 간 전체 동기화가 수행될 경우 적용되는 설정입니다.
- yes면 nodelay false를 적용하는 것으로 데이터를 모아서 큰 패킷으로 전송합니다.(여러 네트워크 장비가 있고 대역폭이 작고 원거리인 경우 유리합니다.)
- no면 대역폭을 좀 더 사용하여 데이터를 작은 패킷으로 나누어서 전송합니다.
![업로드중..]()
9. repl-backlog-size / repl-backlog-ttl
# backlog-buffer size
repl-backlog-size 1mb
# backlog-buffer free time
repl-backlog-ttl 3600
-
repl-backlog-size: 부분 동기화에 사용되는 backlog-buffer의 사이즈를 설정합니다.
-
repl-backlog-ttl: 마스터는 슬레이브와 연결 해제된 후 repll-backlog-ttl로 설정한 일정 시간이 지나면 백로그 메모리를 해제(free) 합니다.
-
슬레이브는 백로그를 해제하지 않는데 이유는 나중에 마스터로 승격했을 때 다른 슬레이브와 부분 동기화를 하기 위해서입니다. 따라서 슬레이브는 항상 데이터를 백로그에 쌓아놓습니다.
10. replica-priority
replica-priority 100
- 마스터 노드가 다운되었을 때 슬레이브가 여러 대 있으면 어느 서버가 마스터가 될지 우선순위를 설정합니다.
- default는 100이고, 숫자가 적을 수록 우선순위가 높습니다.
- 0은 특별한 값으로 마스터가 되지 않도록 하는 값입니다.
- redis 4.x 이전버전은 replica-priority 입니다.
11. min-replicas-to-write / min-replicas-max-lag
min-replicas-to-write 3
min-replicas-max-lag 10
- min-replica-to-write: 복제가 성공적으로 수행되어야 하는 최소한의 슬레이브 수를 설정합니다. 슬레이브가 설정보다 적으면 마스터는 쓰기 명령을 수행하지 못하고 에러를 리턴합니다.
- min-replica-max-lag: 복제가 성공적으로 수행되어야하는 시간(초)를 설정합니다. 이 시간은 마스터가 슬레이브에 1초마다 보내는 replconf의 ack로 확인합니다.
- 둘 중 하나만 0으로 설정해도 이 기능은 비활성화 됩니다.
- redis 4.x 이전버전은 min-slaves-to-write / max-slaves-to-write 입니다.
12. replica-announce-ip / replica-announce-port
replica-announce-ip 5.5.5.5
replica-announce-port 1234
- 슬레이브는 replica-announce-ip / replica-announce-port 를 사용해서 docker와 NAT를 지원합니다.
- redis 4.x 이전버전은 slave-announce-ip / slave-announce-port 입니다.
https://www.happykoo.net/@happykoo/posts/51
https://www.happykoo.net/@happykoo/posts/53
https://www.happykoo.net/@happykoo/menus/51
https://www.happykoo.net/@happykoo/posts/54
https://www.happykoo.net/@happykoo/posts/55
https://www.happykoo.net/@happykoo/posts/58
https://proad.tistory.com/entry/Redis-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0