Tomcat & nginx 운영 · 업스트림 부하분산과 장애 격리 · 실습
업스트림 부하분산과 장애 격리
목표
nginx 업스트림으로 여러 백엔드에 부하를 분산하고, 가중치·세션 고정·장애 격리·
Keep-Alive 를 설정하며, 분배 알고리즘을 상황에 맞게 고를 수 있게 됩니다.
왜 중요한가
SI 현장에서 WAS 를 두 대 이상 두는 이유는 성능보다 **한 대가 죽어도 서비스가
유지되게** 하기 위해서입니다. 그런데 nginx 오픈소스판에는 능동 헬스체크가 없어서,max_fails/fail_timeout 의 의미를 모르면 "죽은 서버로 계속 요청이 간다"는
상황을 만듭니다. 또 업스트림 Keep-Alive 는 세 가지 설정이 모두 있어야 동작하는데proxy_set_header Connection "" 를 빠뜨려 매 요청마다 새 커넥션을 만드는 시스템이
정말 많습니다. 그러면 TIME_WAIT 소켓이 쌓여 어느 순간 포트가 고갈됩니다.
단계
0. 준비: Tomcat(8080)에 labhub.war 를 배포하고,/opt/lab/samples/labhub-boot.jar 를 8082 포트로 기동해 둡니다.
nginx 는 /root/ng 를 prefix 로 씁니다.
1. /root/ng/nginx.conf 에 upstream app 블록을 만들어127.0.0.1:8080 과 127.0.0.1:8082 를 넣고, 8088 의 / 가 이 그룹으로
프록시되게 합니다. log_format 에 $upstream_addr 를 반드시 포함시키고
액세스 로그를 /root/ng/logs/access.log 로 보냅니다.http://127.0.0.1:8088/version 이 200 이어야 합니다.
2. 요청을 20회 보낸 뒤 액세스 로그를 /root/ng/rr.log 로 복사합니다.
서로 다른 업스트림 주소가 2개 이상 기록돼야 합니다.
3. 127.0.0.1:8080 에 weight=3 을 주고 reload 한 뒤,
액세스 로그를 비우고 요청을 40회 보낸 다음 /root/ng/weight.log 로 복사합니다.
8080 으로 간 요청이 28~32회 사이여야 합니다.
4. 분배 방식을 ip_hash 로 바꾸고 reload 한 뒤, 로그를 비우고 요청을 20회 보낸 다음/root/ng/iphash.log 로 복사합니다.
업스트림 주소가 한 종류만 기록돼야 합니다.
5. ip_hash 를 제거하고(설정 파일에 남아 있으면 안 됩니다),
두 서버 모두에 max_fails=2 fail_timeout=10s 를 설정합니다.
그런 다음 8082 프로세스를 정지시키고 요청을 10회 보냅니다.
10회 모두 200 이어야 합니다.
6. 업스트림 Keep-Alive 를 설정합니다. upstream 블록에 keepalive 32;,
location 에 proxy_http_version 1.1; 과 proxy_set_header Connection "";.
세 가지가 모두 있어야 합니다.
7. upstream 블록에 least_conn; 을 추가하고 문법 검사를 통과시킵니다.
8. /root/ng/lb.md 를 작성합니다. 라운드로빈, 가중치, ip_hash, least_conn
네 방식에 대해 각각 언제 쓰는지와 언제 쓰면 안 되는지를 적습니다.세션 이라는 단어가 반드시 등장해야 하고, 전체 400자 이상이어야 합니다.
참고
- 로그 비우기:
> /root/ng/logs/access.log(reload 없이 됩니다) - 단계별 스냅샷:
cp /root/ng/logs/access.log /root/ng/rr.log - 업스트림별 건수:
awk '{...}' access.log | sort | uniq -c - 프로세스 정지:
pkill -f labhub-boot.jar - 흔한 실수 1:
ip_hash와weight를 함께 쓰면서 가중 분배를 기대하는 것. - 흔한 실수 2: Keep-Alive 3종 중
proxy_set_header Connection "";를 빠뜨리는 것. - 흔한 실수 3:
least_conn;을 location 에 쓰는 것.upstream블록 안에 넣어야 합니다.
이걸 빠뜨리면 HTTP/1.1 로 올려도 매 요청마다 커넥션이 끊깁니다.
단계 8개
- 업스트림 그룹 구성
- 라운드로빈 분배 확인
- 가중치 분배
- 세션 고정
- 장애 서버 자동 제외
- 업스트림 Keep-Alive
- 최소 연결 방식
- 분배 알고리즘 선택 기준 정리