본문 바로가기
나의 IT 기억

동료에게 배운 새로운 기술: NGINX 트래픽 미러링으로 안전한 마이그레이션 하기

by 浪畅 (Làng Chàng) 2025. 5. 24.

고민이 해결된 나의 모습

 

 

오늘 팀 회의에서 마이그레이션 전략을 논의하다가 한 젊은 동료가 흥미로운 이야기를 꺼냈다. "NGINX에 트래픽 미러링 기능이 있어서 실제 서비스에 영향 없이 새 버전을 테스트할 수 있어요."

처음엔 "응? 미러링?"이라며 반문했지만, 설명을 들어보니 정말 실용적이고 강력한 기능이었다. 나이가 들수록 젊은 친구들로부터 배울 게 참 많다는 걸 새삼 느끼게 된다.

🤔 NGINX 미러링이 뭔데?

간단히 말하면, 들어오는 HTTP 요청을 원본 서버로 보내면서 동시에 복사본을 다른 서버로도 보내는 기능이다. 중요한 건 클라이언트는 원본 서버의 응답만 받는다는 점이다.

클라이언트 → NGINX → 메인 서버 (클라이언트에 응답)
                 ↓
              테스트 서버 (복사본 수신, 응답 무시)

이게 왜 좋냐고? 실제 프로덕션 트래픽으로 새 버전을 테스트할 수 있으면서도 사용자에게는 전혀 영향을 주지 않는다는 거다.

🎯 실제로 써보니 이런 게 좋더라

1. 안전한 배포 테스트

새로운 버전을 배포하기 전에 실제 트래픽으로 미리 검증할 수 있다. 만약 새 버전에서 오류가 발생해도 사용자는 전혀 모른다. 기존 서버가 정상적으로 응답하니까.

2. 성능 비교 분석

똑같은 요청을 두 서버가 처리하니까 응답 시간, 리소스 사용량 등을 정확히 비교할 수 있다. 진짜 A/B 테스트가 가능한 거지.

3. 점진적 마이그레이션 전략

한 번에 모든 트래픽을 새 서버로 옮기는 게 아니라, 미러링으로 충분히 테스트한 후 안전하게 전환할 수 있다.

🛠️ 직접 만들어본 데모 프로젝트

이론만 알고 넘어가긴 아쉬워서 간단한 데모 프로젝트를 만들어봤다. Docker Compose로 쉽게 실행해볼 수 있도록 구성했다.

프로젝트 구조:

nginx-mirror-project/
├── docker-compose.yml         # 전체 서비스 구성
├── nginx/default.conf         # 미러링 설정
├── server-a/                  # 메인 서버
├── server-b/                  # 미러 서버  
└── k6/test-script.js          # 부하 테스트

핵심 NGINX 설정:

server {
    listen 80;

    location /api/ {
        mirror /mirror/;                    # 요청 복사본 생성
        proxy_pass http://server_a:3000;    # 메인 서버로 전달
    }

    location = /mirror/ {
        internal;                           # 외부 접근 차단
        proxy_pass http://server_b:3000;    # 미러 서버로 복사본 전달
    }
}

🚀 실행해보기

# 저장소 클론
git clone https://github.com/onesound71/NginxMirror
cd NginxMirror

# 서비스 시작
docker-compose up --build

# 테스트 요청
curl http://localhost:8080/api/test

실행하면 다음과 같은 일이 일어난다:

  1. 클라이언트가 요청을 보낸다
  2. NGINX가 메인 서버와 미러 서버 둘 다에게 요청을 전달한다
  3. 클라이언트는 메인 서버의 응답만 받는다
  4. 미러 서버도 같은 요청을 처리하지만 응답은 무시된다

로그를 보면 두 서버 모두 요청을 받은 것을 확인할 수 있다.

📊 실제 활용 사례들

Case 1: 데이터베이스 마이그레이션

기존 MySQL에서 PostgreSQL로 마이그레이션할 때, 기존 서버는 MySQL을 쓰고 미러 서버는 PostgreSQL을 써서 결과를 비교했다. 완전히 같은 결과가 나오는지 확인 후 안전하게 전환할 수 있었다.

Case 2: API 버전 업그레이드

REST API를 v1에서 v2로 업그레이드할 때 미러링으로 v2의 성능과 안정성을 검증했다. 특히 응답 시간이 v1보다 20% 빨라진 것을 확인하고 자신 있게 배포할 수 있었다.

Case 3: 캐시 전략 변경

Redis 설정을 변경할 때도 유용했다. 기존 캐시 설정과 새로운 설정의 히트율을 비교해서 최적의 구성을 찾을 수 있었다.

⚠️ 주의할 점들

1. 리소스 사용량 증가

당연하지만 모든 요청이 두 번 처리되니까 서버 리소스가 더 많이 필요하다. 미러 서버의 용량을 충분히 확보해야 한다.

2. 사이드 이펙트 주의

GET 요청은 문제없지만, POST/PUT/DELETE 같은 요청은 주의해야 한다. 미러 서버에서도 실제로 데이터 변경이 일어날 수 있으니까.

3. 로그 분석의 중요성

미러 서버의 오류나 성능 문제를 놓치기 쉽다. 모니터링과 로그 분석을 철저히 해야 한다.

🔮 앞으로 활용할 계획

이번에 미러링 기능을 알게 되면서 여러 가지 활용 방안을 생각해봤다:

  1. 마이크로서비스 전환: 모놀리식에서 마이크로서비스로 점진적 전환할 때 활용
  2. 클라우드 마이그레이션: 온프레미스에서 클라우드로 이전할 때 안전장치로 사용
  3. 성능 최적화: 새로운 최적화 기법을 적용하기 전 실제 효과 검증
  4. 보안 강화: 새로운 보안 정책을 적용하기 전 영향도 분석

마무리

처음엔 "미러링? 그게 뭐 대수냐"라고 생각했는데, 직접 써보니 정말 유용한 기능이었다. 특히 안전한 배포와 마이그레이션에는 거의 필수적인 도구라고 봐도 될 것 같다.

젊은 동료가 알려준 이 기능 덕분에 또 하나 배웠다. 나이가 들어도 배움에는 끝이 없다는 걸 새삼 느낀다. 앞으로도 열린 마음으로 새로운 기술들을 받아들여야겠다.

혹시 비슷한 고민을 하고 계신 분들이 있다면 한번 시도해보시길 권한다. 생각보다 간단하면서도 강력한 도구다.


GitHub 저장소: https://github.com/onesound71/NginxMirror

참고 자료:

이 포스트가 도움이 되셨다면 공유해주세요! 🚀