LabHub

Tomcat & nginx 운영 · 업스트림 부하분산과 장애 격리 · 실습

업스트림 부하분산과 장애 격리

LabHub 에서 이어서 보기

목표

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.jar8082 포트로 기동해 둡니다.
nginx 는 /root/ng 를 prefix 로 씁니다.
1. /root/ng/nginx.confupstream app 블록을 만들어
127.0.0.1:8080127.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:8080weight=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자 이상이어야 합니다.

참고

단계 8개

  1. 업스트림 그룹 구성
  2. 라운드로빈 분배 확인
  3. 가중치 분배
  4. 세션 고정
  5. 장애 서버 자동 제외
  6. 업스트림 Keep-Alive
  7. 최소 연결 방식
  8. 분배 알고리즘 선택 기준 정리