본문 바로가기
글모아

redis 읽기 전용(replica) 모드에서 쓰기 모드(master)로 전환하기

by 989898 2025. 10. 11.

배포환경에서 로그인을 테스트 하던 도중 로그인이 정상적으로 진행되지 않는 현상 발생.

 

원격서버로 가서 확인을 해보니

 

이런 오류 발생.

 

🚨 Redis READONLY 오류 해결기 (Spring Boot + Docker 환경)

Spring Boot 애플리케이션 실행 중 아래와 같은 에러가 발생했다.

 
io.lettuce.core.RedisReadOnlyException: READONLY You can't write against a read only replica.

🧩 문제 원인

이 에러는 Redis가 Master가 아니라 Read-Only Replica(복제본) 으로 동작 중일 때 발생한다.
즉, 쓰기 명령(SET, HSET, INCR 등)을 replica에 시도한 것.

나는 Redis를 원격 서버에 Docker로 단독 실행했는데,
어떤 이유로든 Redis가 replica 모드(role:slave)로 떠 있었던 게 문제였다.


🛠️ Redis 오류 해결 방법 요약 검토

제시해 주신 단계는 Redis 복제본(Replica, 또는 Slave)을 독립적인 Master 인스턴스로 강제 전환하여 쓰기 작업을 가능하게 하는 표준적인 방법입니다.

1️⃣ Redis 컨테이너 접속

Bash
 
docker exec -it redis-server redis-cli
  • 목적: redis-cli를 사용하여 실행 중인 Docker 컨테이너 내부의 Redis 서버에 명령을 내리기 위함입니다. (redis-server는 컨테이너 이름 또는 ID입니다.)

2️⃣ 현재 역할 확인

INFO replication
  • 목적: Redis 인스턴스의 현재 복제 상태를 확인합니다.
  • role:slave: 현재 이 인스턴스가 다른 Master로부터 데이터를 복제받는 **복제본(Replica/Slave)**임을 의미하며, 쓰기 작업을 거부합니다.

3️⃣ Master로 전환

SLAVEOF NO ONE
  • 목적: 이 명령은 현재 인스턴스에 설정된 모든 복제 관계를 끊고 (더 이상 누구의 복제본도 되지 않음), 스스로 독립적인 Master로 승격시키라는 명령어입니다.
  • 주의: 이 명령을 실행하면 이전에 Master로부터 복제받던 모든 데이터가 사라지지는 않지만, 향후 Master의 데이터와 동기화는 중단됩니다.

4️⃣ 변경 확인

INFO replication
  • 결과 확인: role:master 로 표시되면 정상적으로 쓰기 작업이 가능한 상태로 전환된 것입니다.

🧱 영구 적용 (컨테이너 재시작 시 유지하려면)

도커 실행 시 --replicaof 옵션이 들어갔거나 Redis 설정파일(redis.conf)에
slaveof 항목이 있다면 모두 제거해야 한다.

 
docker run -d --name redis-server -p 6379:6379 redis:7

팁: 보안을 위해 비밀번호 설정도 함께 추가하자

 
docker run -d --name redis-server -p 6379:6379 redis:7 redis-server --requirepass yourpassword

✅ 정리

항목내용
에러명 RedisReadOnlyException
원인 Redis가 replica(읽기 전용)로 기동됨
해결 방법 SLAVEOF NO ONE 명령으로 master 전환
예방 Docker 실행 시 --replicaof 옵션 제거, role:master 확인

💡 한 줄 요약

"Redis는 Master여야 쓸 수 있다. INFO replication으로 먼저 확인하자."