Skip to content

Redis 끊긴 연결 감지 추가 - #1235

Merged
m-a-king merged 1 commit into
devfrom
fix/1234-redis-dead-connection-detection
Oct 15, 2026
Merged

m-a-king merged 1 commit into
devfrom
fix/1234-redis-dead-connection-detection

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

한눈에

앱이 끊긴 Redis 연결을 늦게 알아채는 문제 수정

  • 이전: Redis 서버만 연결을 닫고 앱은 열린 줄 앎
    • 앱이 그 연결로 보낸 요청은 응답 없이 시간 초과
    • 앱이 그 연결을 버리기까지 약 15분
    • 결과: 10-15 prod 에서 약 16분 동안 로그인 실패
  • 앱이 30초마다 Redis 연결이 살아 있는지 확인
  • 요청에 10초 동안 응답이 없으면 앱이 연결을 새로 맺음
  • 결과: 같은 상황에서 약 10초 안에 복구
  • 머지하면 dev 자동 배포
    • prod 는 다음 승격 때 반영

Situation

반쪽 연결

  • Redis 끊긴 연결 감지 추가 #1234
  • 추가
    • 반쪽 연결은 한쪽만 닫힌 채 다른 쪽은 열린 줄 아는 TCP 연결
    • 자동 업데이트가 갱신한 패키지는 systemd·udev (prod 앱 서버 apt 기록, 06:18 UTC)
    • 15:20 에서 16:03 사이 앱의 Redis 명령 0건
      • 결과: 16:03 첫 로그인에서야 드러남
    • 재연결은 첫 실패 뒤 약 15.8분
      • 원인: 앱 컨테이너의 tcp_retries2 15 (OS 기본 재전송 한도)

Task

Redis 끊긴 연결 감지

Action

Redis 연결 확인 30초 주기

  • Redis 서버 기본 주기(300초)보다 앞서 앱이 확인 패킷을 보냄
    • 결과: 앱 서버의 NAT 기록이 지워져도 확인 패킷이 기록을 다시 만듦

응답 없는 연결 10초 뒤 닫기

  • 리눅스 TCP 옵션 TCP_USER_TIMEOUT 사용
  • Lettuce(Redis 클라이언트)는 이 값을 epoll 전송에서만 적용
    • netty epoll 네이티브 런타임 의존성 추가 (arm64·x86_64)
    • 배포 서버는 arm64
    • CI 는 x86_64
    • 예외: 맥 로컬은 이 값 없이 동작 (경고 로그 1줄)
      • 원인: 맥에는 epoll 없음

connect-timeout 다시 설정

  • 원인: 소켓 옵션 교체가 Boot 가 먼저 넣은 connect-timeout 1초를 지움

테스트

  • arm64 epoll 네이티브 파일이 classpath 에 있는지 확인
    • 원인: 코드 참조가 없는 런타임 의존성은 정리 때 지워지기 쉬움
  • 리눅스(CI)에서 Lettuce 가 epoll 을 쓸 수 있는지 확인
  • 소켓 옵션 교체 뒤 connect-timeout 유지 확인

구현 방식 비교

선택지 감지 범위 비용
연결 확인 주기 + 응답 한도 (채택) 쉬는 연결·요청 중인 연결 둘 다 epoll 네이티브 의존성
연결 확인 주기만 쉬는 연결만 요청 중에 끊긴 연결은 여전히 약 15분
연결을 꺼낼 때마다 PING (Spring validateConnection) 쉬는 연결·요청 중인 연결 둘 다 Redis 호출마다 왕복 1번 추가·끊긴 뒤 첫 요청은 2초 대기

Result

arm64 리눅스 컨테이너 재현

  • 조건: 앱 쪽 연결의 패킷을 방화벽으로 버린 뒤 Redis 가 그 연결을 닫음
  • prod 와 같은 Redis 7.4·Lettuce 6.8.2·netty 4.2.12
설정 앱이 다시 붙기까지
연결 확인 주기 + 응답 한도 (채택) 9초
설정 없음 90초 관찰 동안 재연결 없음
  • 위험: prod 승격 전까지 같은 재시작으로 재발 가능
    • 다음 자동 업데이트는 10-16 06:25 UTC 무렵

후속

  • dev 배포 뒤 dev 서버에서 Redis 소켓에 확인 타이머가 붙었는지 확인
  • core 가 다른 서버로 맺어 두는 유휴 연결(extractor 호출용 HTTP 연결 풀)의 같은 위험 확인

연관 이슈

- Lettuce 소켓 옵션에 TCP keepalive·TCP_USER_TIMEOUT 추가 (#1234)
  - 원인: 10-15 prod 앱 서버 자동 업데이트 뒤 Redis 서버 쪽만 연결을 닫음
  - 원인: Lettuce 는 명령 시간 초과에도 연결을 버리지 않음
  - 결과: OS 재전송 한도 약 15분 동안 Redis 호출 전부 실패
- keepalive 시작 30초
  - 원인: Redis 서버 기본 tcp-keepalive 300초보다 먼저 앱 서버의 NAT 기록을 되살려야 함
- TCP_USER_TIMEOUT 10초
- netty-transport-native-epoll 런타임 의존성 추가 (linux-aarch_64·linux-x86_64)
  - 원인: Lettuce 는 TCP_USER_TIMEOUT 을 epoll 에서만 적용
  - 배포 서버는 arm64
  - CI 는 x86_64
- socketOptions 교체 뒤 connect-timeout 다시 설정
  - 원인: Boot 가 먼저 넣은 값이 교체로 사라짐
- arm64 리눅스 컨테이너에서 사고 재현
  - 결과: 설정 적용 시 9초 뒤 재연결
  - 결과: 설정 없으면 90초 내내 실패
- 대안: 컨테이너 tcp_retries2 낮춤
  - 기각: MySQL·extractor 호출·SSE 등 모든 TCP 연결에 적용
@m-a-king m-a-king added the fix 외부 가시적 결함 수정 label Oct 15, 2026
@m-a-king m-a-king linked an issue Oct 15, 2026 that may be closed by this pull request
@m-a-king m-a-king self-assigned this Oct 15, 2026
@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: TeamPiKi/core/.coderabbit.yml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e23eac9d-6137-48fe-8a5b-7c6f1429ab92
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@m-a-king
m-a-king merged commit ab9df00 into dev Oct 15, 2026
7 checks passed
@m-a-king
m-a-king deleted the fix/1234-redis-dead-connection-detection branch October 15, 2026 08:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 외부 가시적 결함 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Redis 끊긴 연결 감지 추가

1 participant