Redis Sentinel은 Master - Slave 가 있고, Master가 다운되면 Sentinel이 자동으로 이를 인지하고 모니터링해서, Slave를 Master로 변경해서 서비스의 가용성을 높여주는 구조이다.
바로 시작해보자. 우선, 가장 먼저 EC2 인스턴스 두개를 만들어준다.
Redis Master EC2
- 이름 → 'redis-master'
- Image → Ubuntu
- 인스턴스 타입 → 프리티어
- 키 페어 → 기존 사용하는 게 있다면 그걸 사용해도 되고 새로 만들어도 된다.
- VPC → 적절히 만든다
- Subnet → 적절히 선택한다
- Public IP → 활성화해서 내 로컬에서 SSH로 접속가능하게 한다
- Security Group → 적절히 만들고 그것으로 선택한다
Redis 전용 Security Group
- Security Group을 만들고, 인바운드 규칙을 두가지 설정하자.
- SSH 접속을 내 IP만 허용
- 6379 포트로 들어오는 트래픽을 허용하는데 그 Source는 마찬가지로 이 Redis Security Group으로 설정한다.
- 그래서 이 Security Group을 선택한 레디스 용 인스턴스끼리 서로 접근이 가능하게 하면 된다.
- 이렇게 redis-master 인스턴스가 하나 생성됐으면, 이 녀석안으로 들어가자. SSH 접속으로 들어가면 된다.
Redis 설치 및 설정
apt-get update
apt-get install redis-server
- 위 두 명령어를 입력하면 레디스가 설치된다.
- 기본 레디스 설정 파일 경로는 `/etc/redis/redis.conf` 이다.
`/etc/redis/redis.conf` 파일 안
- 우선, bind 설정을 0.0.0.0으로 설정해서 외부에서 이 레디스에 접속을 가능하게 설정해줘야 한다.
- 왜냐하면, Slave는 이 Master 인스턴스와는 다른 인스턴스에 설치할 것이고 둘 간 연결을 해야하기 때문이다.
- 어차피, Security Group으로 허용 가능한 트래픽을 설정했기 때문에 0.0.0.0으로 지정해도 큰 무리가 없다.
- 쭉 보면, `protected-mode` 값을 no 로 변경해야 한다.
이렇게 두 설정을 한 후 Redis를 내렸다가 다시 올린다.
service redis stop
service redis start
Redis Master EC2 이미지 복사
위에서 설정한 Redis Master의 인스턴스 이미지를 복사해서 편리하게 Slave를 만들자.
- redis-master 인스턴스를 클릭 후, 위 이미지처럼 Create Image를 클릭해서 이미지를 만든다.
Redis Slave EC2
- 위에서 만든 AMI로 Slave 용 EC2를 하나 더 만든다.
- 다 만들고 나서, 마찬가지로 SSH로 접속해서 Redis 설정을 진행하자.
Slave Redis 설정
우선, SSH로 인스턴스에 접속한 다음 아래 명령어를 입력한다.
vi /etc/redis/redis.conf
그럼 설정 파일에 위에서 한 것처럼 아래 두 가지를 해주자.
bind 0.0.0.0
protected-mode no
이제 Redis를 내렸다가 다시 올린다.
service redis stop
service redis start
이제 아래 명령어로 redis-cli에 접속하자.
redis-cli
그리고 아래 명령어를 입력하자.
replicaof <master-private-ip> 6379
- 여기서 master-private-ip는 redis-master로 만든 인스턴스의 private ip이다.
- 이건 명령어로만 딱 치면 인스턴스가 내려가면 해당 내용이 없어지니까 설정 파일(redis.conf)에 지정해두면 좋다.
연결이 잘 됐는지 확인하려면, redis-cli에 접속한 상태로 info 명령어를 입력해보자.
127.0.0.1:6379> info
- 그럼 이렇게 master 정보가 잘 나오고 master_link_status: up 이렇게 보인다면 연결에 성공한 것이다.
여기까지 하면, Master - Slave 관계까진 끝났다. 이제 Sentinel을 추가적으로 설치해서 Master가 다운되면 자동적으로 Failover 하는 과정을 살펴보자.
Redis Sentinel 설치
Master, Slave 둘 다 다음 명령어로 Sentinel을 설치하자.
apt-get install redis-sentinel
설치가 끝나면 이 sentinel 설정 파일도 동일한 경로에 만들어진다.
`etc/redis/sentinel.conf` 파일 안
- 그럼 여기서 중요한 부분이 이 부분인데, 마스터로 선정된 레디스 IP를 지정해줘야 한다. 아까 Master EC2로 만든 녀석의 Private IP를 넣으면 된다.
- 6379는 포트이다.
- 2는 다수결이다. 그러니까 세 개가 설치된 상태에서 2개가 다운됐다고 판단하면 마스터가 서비스가 내려갔다고 판단하고 Slave 중에서 하나를 마스터로 승격시키는 기준을 말한다.
이 설정을 Master, Slave EC2 둘 다 해준 다음에 지금은 두개의 인스턴스 밖에 없다. 항상 이런 Failover 작업은 홀수개로 만들어야 한다. 그래서 Sentinel 하나만 설치할 EC2 인스턴스를 하나 더 만든다.
홀수개를 채우기 위한 Sentinel EC2 생성
똑같은 이미지로 생성을 한 뒤에, 마찬가지로 redis-sentinel을 설치하고 위 작업을 동일하게 해준다.
그리고 한 가지 더 해줘야 할 작업이 있는데 바로 Security Group에 26379 포트로 들어오는 트래픽을 인바운드 설정을 해줘야한다.
이렇게 설정하고, 각 3개 인스턴스 모두 Sentinel을 다시 실행한다.
systemctl restart sentinel
중간 정리
지금까지 한 작업을 정리해보자.
- Master, Slave, Odd for Sentinel 이렇게 EC2 인스턴스를 세 개 만들었다.
- Master, Slave 간 연결을 설정했다. (bind 옵션, protected-mode 설정, replicaof 설정)
- Security Group 생성 후, 내 IP에서 22번 포트로 들어오는 트래픽, Security Group 간 6379, 26379 포트로 들어오는 트래픽을 허용했다.
- Master, Slave 간 연결을 확인했다.
- 세 개의 인스턴스에서 모두 redis-sentinel을 설치했다.
- sentinel.conf 파일에서 마스터 노드의 IP를 지정했다.
- Sentinel을 재시작했다.
이제, Sentinel 로그를 확인해보면 이렇게 잘 붙었다는 내용이 나온다.
이제, 마스터 노드에서 Redis를 종료해보자. 재밌는 일이 일어난다. 시간이 좀 지나면 Sentinel이 마스터 노드의 레디스가 내려갔다는 것을 판단한 후 Slave 중에서 Master로 승격시킬 노드 하나를 선택한다. 물론, 지금은 딱 하나니까 그 녀석이 Master가 된다.
- 보면 새로운 에포크를 시작한다고 나오고, 투표를 한다고 나온다.
- 마스터를 .55에서 .10으로 변경했다고 나온다.
아래 이미지처럼, Slave 노드가 Master 노드가 됐다.
내렸던 마스터 노드에서 레디스를 다시 실행하면, 이 녀석은 이제 Slave가 된다.
이렇게 Sentinel - Master - Slave 구조로 Redis의 고가용성을 구성해봤다.
'Redis' 카테고리의 다른 글
Replication (0) | 2025.04.20 |
---|---|
Redis Monitoring (0) | 2025.04.20 |
Spring Boot + Redis PubSub (0) | 2025.04.20 |
Spring Boot + Redis Session (0) | 2025.04.20 |
Keys, Scan (0) | 2025.04.20 |