Redis설치 및 Configuration(2)
현재
인스턴스a : master
인스터스b : slave
상태인데
인스턴스b를 이렇게 restart하면
sudo service redis restart
인스턴스b가 master로 되기 때문에
다시 인스턴스b에서
redis-cli 로
replicaof master대상IP 6379 명령어로
레디스를 slave로 만들어줘야한다.
redis-cli
> replicaof master의ip 6379
그러면 다시 master의 redis-cli info 와 slave의 redis-cli info를 했을때
명확히 master - slave 관계를 알수 있으며
slave 에서 해당 명령어를 입력해도 master - slave 관계를 알 수 있다.
tail -f /var/log/redis/redis-server.log
참고로 sentinel.conf 파일이든 redis.conf 파일이든 수정했으면
redis를 재실행 해야한다.
즉, 만약 sentinel.conf 를 수정했으면
service redis-sentinel restart
이렇게 restart 명령어 실행하면 된다.
센티넬을 master와 slave 인스턴스에 설치한다.
인스턴스a 에 sentinel 설치
apt-get install redis-sentinel
인스턴스b 에 sentinel 설치
apt-get install redis-sentinel
우선적으로
서비스에 대한 vm을 만들어 놓고
sentienl을 설치하겠다.
my_first_redis : master
my_second_redis : replica
my_price_service : spring boot 서비스를 올릴거임
이렇게 3개의 인스턴스에는 sentinel을 올린다.
sentinel 설치는 홀수개로 하는 것이 좋다. 이는 다수결을 통해 장애 여부와 failover 시 조치를 결정하기 때문이다.
my_price_service는 redis를 올릴 필요가 없다. sentinel 만 설치하면 된다.
master replica의 fail over가 잘 되는지 확인이 필요하다.
3번째 my_price_service 인스턴스
sudo do # root 사용자로 전환
apt-get update
apt-get install redis-sentinel
cd /etc/redis
vi sentinel.conf
여기서
bind를
bind 자기ip 127.0.0.1 으로 변경하고
service sentinel restart
ps -ef | grep sentinel
일단 3개의 인스턴스에서
service sentinel stop
해당 명령어로 sentinel을 전부 내린다.
3개의 인스턴스에서 sentinel.conf 설정
cd /etc/redis
vi sentinel.conf
sentinel monitor mymaster 마스터인스턴스의ip 6379 2
# sentinel이 모니터링할거다 다스터는 ip이다. 6379포트를 보고 여기서 숫자 '2'는 2개이상
# 다운되면 다운이다. 만약에 3이면 3개다 다운되면 다운이다.
3개 다 모두 sentinel.conf 파일에서 mymsater를 마스터인스턴스의ip로 변경한다.
이 때 인바운드 규칙에서 26379 port 열어줘야한다.
인스턴스 서비스 올리기
service sentinel start # 3개의 인스턴스모두 실행한다.
3번째 my_price_service 에서 로그 확인
tail -f /var/log/redis/redis-sentinel.log
# 아래처럼
# +monitor master mymaster 172.31.10.4 6379 quorum 2
# 라고 뜨는 부분이 있는 quorum (의사 결정에 필요한 수) 방식
root@ip-172-31-8-199:/etc/redis# tail -f /var/log/redis/redis-sentinel.log
27274:X 22 Sep 2024 11:16:06.318 # Redis version=6.0.16, bits=64, commit=00000000, modified=0, pid=27274, just started
27274:X 22 Sep 2024 11:16:06.318 # Configuration loaded
27274:X 22 Sep 2024 11:16:06.325 * Running mode=sentinel, port=26379.
27274:X 22 Sep 2024 11:16:06.325 # Sentinel ID is 344da5d665cca2ac773b58b3bde3420531375226
27274:X 22 Sep 2024 11:16:06.325 # +monitor master mymaster 172.31.10.4 6379 quorum 2
27274:X 22 Sep 2024 11:16:06.334 * +slave slave 172.31.12.33:6379 172.31.12.33 6379 @ mymaster 172.31.10.4 6379
27274:X 22 Sep 2024 11:16:36.352 # +sdown slave 172.31.12.33:6379 172.31.12.33 6379 @ mymaster 172.31.10.4 6379
27274:X 22 Sep 2024 11:17:00.493 * +sentinel sentinel 69150d6a671553fc6119830f4fc28b2586bc54a8 172.31.12.33 26379 @ mymaster 172.31.10.4 6379
27274:X 22 Sep 2024 11:17:00.508 # +new-epoch 263
27274:X 22 Sep 2024 11:17:24.334 * +sentinel sentinel 10d0c0e09411e88e5b07417e6c8b697c0cd6acc4 172.31.10.4 26379 @ mymaster 172.31.10.4 6379
1번의 redis를 내리면
redis가 다운된 걸 인지하고 fail-over를 시켜줘야 한다.
fail-over 대상은 slave redis이다.
인스턴스a의 master 내리기
service redis stop
인스턴스a의 master 올리기
service redis start # 한뒤
# 다시 role을 확인한다
redis-cli info | grep role
처음에는 start한지 얼마 안돼서
role:master로 뜨다가 결국
role:slave로 뜨게 된다.
이러면
master가 down 되도 slave가 master가 되는 failover가 성공했다!!
참고로
인스턴스a의 redis를 내리고 그 과정을 인스턴스c의 sentinel.conf 의 로그를 보면 다음과 같다.
root@ip-172-31-14-137:/etc/redis# tail -f /var/log/redis/redis-sentinel.log
2353:X 28 Sep 2024 12:21:23.792 # WARNING supervised by systemd - you MUST set appropriate values for TimeoutStartSec and TimeoutStopSec in your service unit.
2353:X 28 Sep 2024 12:21:23.792 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2353:X 28 Sep 2024 12:21:23.792 # Redis version=6.0.16, bits=64, commit=00000000, modified=0, pid=2353, just started
2353:X 28 Sep 2024 12:21:23.792 # Configuration loaded
2353:X 28 Sep 2024 12:21:23.793 * Running mode=sentinel, port=26379.
2353:X 28 Sep 2024 12:21:23.794 # Sentinel ID is 35e81a76c797e5018731e2b9b142f270d5e23156
2353:X 28 Sep 2024 12:21:23.794 # +monitor master mymaster 172.31.7.13 6379 quorum 2
2353:X 28 Sep 2024 12:21:23.798 * +slave slave 172.31.15.119:6379 172.31.15.119 6379 @ mymaster 172.31.7.13 6379
2353:X 28 Sep 2024 12:21:32.212 * +sentinel sentinel a6f0dd83a3f9bf4c8cb2733a9ed40393a5977550 172.31.7.13 26379 @ mymaster 172.31.7.13 6379
2353:X 28 Sep 2024 12:21:32.223 # +new-epoch 3
2353:X 28 Sep 2024 12:35:20.590 # +sdown master mymaster 172.31.7.13 6379
2353:X 28 Sep 2024 12:35:20.686 # +new-epoch 4
2353:X 28 Sep 2024 12:35:20.691 # +vote-for-leader a6f0dd83a3f9bf4c8cb2733a9ed40393a5977550 4
2353:X 28 Sep 2024 12:35:21.465 # +config-update-from sentinel a6f0dd83a3f9bf4c8cb2733a9ed40393a5977550 172.31.7.13 26379 @ mymaster 172.31.7.13 6379
2353:X 28 Sep 2024 12:35:21.465 # +switch-master mymaster 172.31.7.13 6379 172.31.15.119 6379
2353:X 28 Sep 2024 12:35:21.465 * +slave slave 172.31.7.13:6379 172.31.7.13 6379 @ mymaster 172.31.15.119 6379
2353:X 28 Sep 2024 12:35:51.485 # +sdown slave 172.31.7.13:6379 172.31.7.13 6379 @ mymaster 172.31.15.119 6379
2353:X 28 Sep 2024 12:43:54.996 # -sdown slave 172.31.7.13:6379 172.31.7.13 6379 @ mymaster 172.31.15.119 6379
2353:X 28 Sep 2024 12:44:04.963 * +convert-to-slave slave 172.31.7.13:6379 172.31.7.13 6379 @ mymaster 172.31.15.119 6379
결국 인스턴스a(172.31.7.13)의 redis를 service redis stop 하고
인스턴스b(172.31.15.119)의 slave가 master로 failover 되고
인스턴스a 의 redis를 service redis start
도중에 인스턴스a 에서 root계정으로
service redis stop 명령어를 입력하는데 명령어를 실행하고 종료되지 않는다.
대체 왜 이런 상황이 발생할까?
redis.conf 설정이
인스턴스a는 bind 0.0.0.0
인스턴스b는 bind 127.0.0.1 ::1
으로 되어있었다.
일단 인스턴스b의 bind도
bind 0.0.0.0 으로 변경했으나 이는 상관이 없었다.
그래서 검색해보니까
master redis의 redis.conf 에서
protected mode 를 no로 변경했더니 성공했다.
# 현재 master
vi redis.conf
protected mode yes
protected mode no # 이렇게 변경했다
그 다음 master를
service redis restart 했더니
master - slave 관계가 제대로 형성 됐다!
#master의 redis-cli info
# Replication
role:master
connected_slaves:1
#slave의 redis-cli info
# Replication
role:slave
master_host:172.31.0.19
master_port:6379
master_link_status:up