개발일지/message queue,broker

Redis설치 및 Configuration(2)

티에리앙리 2024. 8. 28. 10:50

현재

인스턴스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