들어가며
Redis > Document > Replication 을 번연한 것입니다. http://redis.io/topics/replication
오역 및 잘못된 내용이 있을 수 있습니다. 참고 용로도만 사용해 주세요.
작성 기준일: 2012-07-08, redis-io-replication.pdf
복제(Replication)
Slave 서버가 Master 서버의 정확한 복제본이 되도록 해주는 master-slave replication을 설정하고 사용하는 것은 매우 간단하다. 아래는 Redis replication이 가지는 매우 중요한 특성들이다.
- 하나의 Master는 여러 Salve를 가질 수 있다.
- Savle들은 다른 Slave들의 연결을 허용할 수 있다.
- Redis replication은 master 쪽에서는 non-blocking 작업이다. 이것은 master가 하나 또는 그 이상의 slave들과 첨으로 동기화 할 때도 요청되는 query들을 처리할 수 있다는 것을 의미한다.
- 만약 redis.conf에 예전 데이터를 가지고 query에 대해서 응답하도록 설정 했다면, slave가 첫 동기화를 하는 동안 Replication은 slave 쪽에서는 non-blocking 작업이다. 그렇지 않으면, master와의 연결이 끊어졌을 떄 clinet에게 error 메시지를 보내도록 설정 할 수 있다. 하지만 예전 dataset이 제거되고 새로운 dataset이 로드되는 동안은 slave로 요청되는 연결(connection)은 막힐(block)것이다.
- Replication은 확장성 뿐만 아니라 read-only query를 위한 여러 slave를 가지는데 사용될 수 있다. (예를 들어서, 무거운 SORT 연산들은 slave들에게 위임될 수 있다. 또는 단순한 데이터 복제를 위해서 사용될 수 있다.)
- master가 저장 프로세스(saving process)가 수행하는 것을 피하기 위해서 replication을 사용하는 것도 가능하다. 단지 master의 redis.conf에 saving을 하지 않도록 설정(모든 'save' 지시어들을 주석처리해라 )하고, 가끔씩 저장을 수행하도록 설정한 slave를 연결한다.
Redis replication 동작 방법
Slave를 설정하면, Slave는 Master에게 SYNC command를 보낸다. 이것은 Master와 첫번째 연결이든 재 연결이든 상관없다.
SYNC 명령어를 받은 Master는 background saving을 시작한다. 그리고 새롭게 요청된 command들 중에 dataset을 변경하는 모든 명렁어들을 저장한다. background saving이 완료되었을 때, master는 디스트에 저장된 database 파일을 slave에게 전송한다. 파일을 전송받은 slave는 이것을 메모리로 불러온다. 그리고 master는 누적된 dataset을 변경하는 command들을 slave에게 전송한다. 이것은 Redis protocol과 동일한 command들을 전달함으로서 완료된다.
이것은 telnet을 통해서 실험해 볼 수 있다. 특정 작업을 수행하고 있는 서버에 연결하고, SYNC command를 수행해 보자. 한번의 bulk 전송이 이루어 지고, master에 의해서 받은 모든 command들이 telnet session에서 재 요청(re-issue) 될 것이다.
master와 slave간 연결에 문제가 발생했을 때, lsave는 자동적으로 재연결을 지도한다. 만약 master가 동시에 여러 동기화 요청을 받게되면, 모든 slave와의 동기화를 처리하기 위해서 단 하나의 background save가 수행된다.
master와 slave가 재연결 되었을 때는 완전한 재동기화(full resync)가 수행된다.
설정 방법(Configuration)
replication을 설정하는 것은 간단한다. slave의 설정 파일에 단지 아래 내용을 추가하면 된다.
slaveof 192.168.1.1 6379
물론 192.168.1.1 6379 를 실제 마스터의 IP 주소(또는 hostname)와 port로 변경해 주어야 한다. 다른 방법은 slave client에서 SLAVEOF 명령어를 호출하는 것이다. 명령어가 호출되면 master 는 slave와 동기화를 시작할 것이다.
읽기 전용(Read only) slave
Redis 2.6 부터 slave는 기본적으로 읽기 전용(read-only) 모드를 지원한다. slave의 행동은 redis.conf 파일에서 slave-read-onlcy 옵션에 의해서 제어된다. 그리고 CONFIG SET 명령어를 사용해서 runtime 중에 활성화 및 비활성화가 가능하다.
실수를 방지하기 위해서 읽기 전용 모드가 활성화된 slave는 모든 쓰기 명령어들을 거부(reject)할 것이다. 하지만 이것은 인터넷이나 믿을 수 없는 사용자가 존재하는 네트워크에 노출 할 수 있다는 것을 의미하지 않는다. 왜냐하면 DEBUG나 CONFIG 같은 명령어 들은 여전히 사용 가능하기 때문이다. 하지만 읽기 전용 instance의 보안은 'rename-command' 지시어를 이용해서 redis.conf에서 명령어들을 비활성화 시킴으로서 높일 수 있다.
아마도 왜 초기값으로 되돌아 가고 쓰기 수행이 가능한 slave instance들을 가지는지 궁긍할 것이다. .....
slave가 master에게 인증받도록 설정하는 방법
master가 requirepass를 이용해서 비밀번호를 가진다면, slave가 모든 동기화 수행에서 비밀번호를 사용하도록 설정하는 것은 간단하다.
운영중인 instance에서 설정하기 위해서는 redis-cli를 이용해서 아래와 같이 타이핑한다.
config set masterauth <password>
만약 지속적으로 설정하고 싶다면, 설정 파일에 아래 라인을 추가해라
masterauth <password>
'Dev > Redis' 카테고리의 다른 글
Redis Administration (0) | 2012.07.07 |
---|---|
All About Redis (0) | 2012.07.07 |
Redis 서버 설정 정리 (1) | 2012.07.04 |