시스템 · 서버심화 · 18분 읽기

HAProxy 부하 분산·헬스 체크·장애 전환

부하 분산은 요청을 여러 서버로 나누는 기능입니다. 실제 준비 상태를 검사하고 분산 장치 자체의 장애도 고려해야 합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. frontend·backend·서버 선택·헬스 체크의 관계를 설명한다.
  2. 헬스 판정 변화가 신규 요청과 기존 연결에 미치는 영향을 구분한다.
  3. 부하 분산기와 애플리케이션·DB의 장애 전환 범위를 나눈다.
먼저 알면 좋은 개념정방향·역방향 프록시와 캐시

01frontend·backend·server가 연결 하나를 처리하는 순서

  • 는 클라이언트 연결을 받는 주소·포트와 진입 정책을 정한다.
  • 요청 조건을 평가한 뒤 default_backend 또는 use_backend 규칙으로 backend를 선택한다.
  • backend는 서버 목록과 분산 방식·상태 검사를 가지고 있고 server 항목이 실제 전달 대상이다.
  • 는 보통 클라이언트와의 연결, 백엔드와의 연결을 각각 관리하므로 두 구간의 연결 수와 timeout도 구별한다.
  • 는 스트림을 중심으로 중계하며 HTTP 경로나 Host를 기본 HTTP 규칙처럼 해석하지 않는다.
  • 는 HTTP 메시지를 해석해 헤더·URI 기준 분기와 조작을 수행할 수 있다.
  • 암호화된 HTTPS 내용을 검사하려면 에서 를 종료하거나 해당 정보를 얻을 수 있는 구성을 선택해야 한다.
    • 통과 전달과 종료 후 재암호화는 서로 다른 신뢰 경계다.

02roundrobin·leastconn·hash와 세션 상태

  • roundrobin은 사용 가능한 서버 사이에 순환하여 배정하는 방식이다.
  • leastconn은 현재 연결 수 등을 기준으로 선택하여 연결 지속시간 차이가 큰 상황에서 유용할 수 있다.
  • hash는 지정한 키로 선택의 일관성을 제공한다.
  • 구체적인 가중치와 동작은 구현·설정에 따라 달라지므로 알고리즘 이름만으로 정확한 처리량을 계산하지 않는다.
  • 앱의 이 한 서버 메모리에만 있으면 다음 요청이 다른 서버로 가서 로그인 상태를 잃을 수 있다.
  • 쿠키 기반 고정이나 hash로 같은 서버를 선택하는 것은 우회 수단이지만 서버 장애 때 세션을 다른 서버로 복제하지는 않는다.
  • 공유 세션 저장소·상태 없는 토큰·업로드 저장소·DB 구성은 분산과 별도로 설계해야 한다.
  • HTTP 분산기가 HTTP 요청을 명령으로 바꾸는 것도 아니다.

03작은 HAProxy 설정을 한 줄씩 읽기

  • 아래 예시는 실습 앱 두 개를 HTTP로 나누는 구조다.
  • 의 가 진입 포트, default_backend가 선택 대상, backend의 balance가 배정 방식이다.
  • server의 check가 상태 검사 대상에 등록하는 부분이고 HTTP 검사에서는 실제 앱이 기대하는 Host와 URI를 전달한다.
  • 문서용 IP를 사용하므로 실제 배포 전에 환경의 주소와 포트로 구체화해야 한다.
  • defaults의 timeout connect는 백엔드 연결 수립 대기, client와 server는 해당 구간의 비활동 시간 제한에 관여한다.
  • 값을 너무 길게 하면 자원을 오래 점유하고 너무 짧게 하면 정상적인 긴 요청을 끊을 수 있다.
  • 설정의 문법 통과와 실제 요청 성공은 다르므로 각 값이 연결 생애의 어느 부분에 작용하는지 먼저 이해한다.
defaults
    mode http
    timeout connect 3s
    timeout client 30s
    timeout server 30s
frontend web
    bind :8080
    default_backend apps
backend apps
    balance roundrobin
    option httpchk
    http-check send meth GET uri /ready ver HTTP/1.1 hdr Host study.example
    http-check expect status 200
    server app1 192.0.2.11:8000 check
    server app2 192.0.2.12:8000 check

교육용 예시. 실제 요청·발송·설정 변경을 실행한 결과가 아니다.

원리 심화

04능동 헬스 체크가 UP·DOWN을 바꾸는 조건

  • 능동 체크는 실제 사용자 요청과 별도로 정해진 대상에 연결하여 조건을 검사한다. 운영 트래픽이 없어도 수행할 수 있지만 검사 내용 밖의 기능까지 보장하지 않는다.
  • 연결 성공은 리스너가 응답한다는 좁은 근거다. HTTP 상태나 본문을 검사하면 더 깊은 조건을 평가할 수 있지만 로그인·결제 등 모든 업무를 대신하지는 않는다.
  • 은 서버를 DOWN으로 제외하기까지 요구하는 연속 실패 횟수다. 한 번의 일시 실패로 상태가 계속 흔들리지 않도록 실패를 누적해 판정한다.
  • 는 DOWN 서버가 UP으로 돌아올 때 요구하는 연속 성공 횟수다. 실패 판단과 복귀 판단을 별도로 두므로 첫 성공만으로 즉시 트래픽을 받지 않을 수 있다.
  • inter와 전이 상태의 fastinter, DOWN 상태의 downinter는 검사 주기를 바꾼다. 연결 시간 제한과 스케줄 지연도 있으므로 inter×을 항상 정확한 장애 탐지 시간으로 단정하지 않는다.
LEARN THROUGH PRACTICE

헬스 체크의 404와 사용자 503을 조건부로 연결하기

서버 등록· 검사·HTTP 상태 검사·사용자 응답을 구별하여 가용 서버가 사라지는 조건을 설명한다.

실습 구성과 전제

  • 설정 화면, /healthz 패킷, 503 화면은 검사 조건을 달리한 실습 사례다. 첫 화면의 server check만으로 HTTP 404가 DOWN 판정의 원인이라고 단정하지 않는다.
  • HTTP 상태를 기준으로 검사하려면 option httpchk 또는 http-check 설정이 실제 적용되어 있어야 한다. 아래 코드는 이를 명시한 재구성이다.
  1. frontend의 분기와 backend의 서버 집합을 읽는다

    • 는 수신 포트와 을 정의하고 는 static, 나머지는 app으로 보낸다. app에는 roundrobin과 두 server 행이 보인다.
    • server의 check는 능동 검사를 켜지만 검사 종류는 주변 설정에 달려 있다. HTTP 검사가 없으면 기본 연결 검사가 HTTP 본문의 상태까지 읽는 것으로 해석해서는 안 된다.
    HAProxy 분산과 상태 검사 · 리버스 프록시 (3)원본 크기로 보기 ↗
    • frontend는 80에서 받고 경로·확장자 ACL에 따라 backend를 나눈다.
    • backend app은 balance roundrobin이며 두 server 행에 check가 붙어 있다.
    확인 기준

    요청이 어느 backend로 갔는지와 그 backend의 검사 설정을 함께 확인한다. 다른 backend의 정상 상태를 근거로 삼지 않는다.

  2. HTTP 검사 경로와 기대 상태를 명시한다

    • 패킷 사진은 연결 수립 뒤 GET /healthz 요청에 404를 받은 사례다. 연결 자체는 가능하지만 그 URI는 기대한 상태를 반환하지 않는다.
    • 재구성 설정에서 기대 상태를 200으로 정하면 404는 실패로 누적된다. 3이면 연속 세 번의 실패 후 DOWN, 2이면 연속 두 번의 성공 후 UP 조건이 된다.
    backend lab_app
        mode http
        option httpchk GET /healthz
        http-check expect status 200
        server app1 192.0.2.21:80 check inter 2s fall 3 rise 2
        server app2 192.0.2.22:80 check inter 2s fall 3 rise 2

    HTTP 200을 성공 기준으로 명시한 재구성이다. 사진의 초기 설정과 동일한 전체 설정이라고 가정하지 않는다.

    HAProxy HTTP 상태 검사 · 각 웹 서버에 health check 파일 추가 (2)원본 크기로 보기 ↗
    • TCP 연결 뒤 GET /healthz HTTP/1.0 요청이 보인다.
    • 서버는 HTTP 404로 응답하므로 연결 성공과 준비 상태 URL의 성공이 구별된다.
    확인 기준

    검사 URI가 실제 앱에 있는지, Host 헤더가 필요한지, 인증이 걸려 있지 않은지 확인한다. 404 자체가 곧 서버 종료를 뜻하지 않는다.

  3. 503을 서버 선택 상태와 맞춰 확인한다

    • 선택한 backend에 요청을 처리할 가용 서버가 없으면 프록시가 503을 반환할 수 있다. 사용자 화면의 503을 특정 한 패킷의 404와 연결하려면 같은 backend·시간·검사 상태라는 추가 증거가 필요하다.
    • 정상 복구는 건강한 응답 한 번만 보는 것이 아니라 설정된 조건을 통과해 선택 집합에 돌아오는 과정이다.
    HAProxy 분산과 상태 검사 · 테스트를 위해 옵션 임시 해제 (7)원본 크기로 보기 ↗
    • 브라우저 응답은 503 Service Unavailable이다.
    • No server is available to handle this request라는 프록시 메시지가 보인다.
    확인 기준

    상태·로그에서 선택 backend와 서버 UP/DOWN 사유를 대조한다. 앱이 직접 반환한 503과 프록시가 만든 503도 구별한다.

실습에서 확인한 동작 원리

  • 연결 검사와 HTTP 준비 상태 검사는 성공 기준이 다르다.
  • 검사 응답→연속 성공·실패 수→서버 선택 가능 여부→사용자 응답을 같은 조건과 시각으로 연결해야 한다.

설정·출력 추가로 확인하기 66장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 1장
9/3 - Haproxy, wazuh · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「HAproxy」 문맥에 삽입된 원본 실습·개념 참고 화면이다. HAProxy 부하 분산·헬스 체크·장애 전환 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 58장
HAProxy HTTP 상태 검사 · httpchk — L7 health check (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · HTTP 상태 검사와 실제 연결 상대를 남기는 로그. 원문에서 「httpchk — L7 health check」에 배치된 그림 또는 화면이다.
HAProxy HTTP 상태 검사 · httpd.conf 로그 peer 설정 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · HTTP 상태 검사와 실제 연결 상대를 남기는 로그. 원문에서 「httpd.conf 로그 peer 설정」에 배치된 그림 또는 화면이다.
HAProxy HTTP 상태 검사 · httpd.conf 로그 peer 설정 (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · HTTP 상태 검사와 실제 연결 상대를 남기는 로그. 원문에서 「httpd.conf 로그 peer 설정」에 배치된 그림 또는 화면이다.
HAProxy HTTP 상태 검사 · 각 웹 서버에 health check 파일 추가 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · HTTP 상태 검사와 실제 연결 상대를 남기는 로그. 원문에서 「각 웹 서버에 health check 파일 추가」에 배치된 그림 또는 화면이다.
HAProxy HTTP 상태 검사 · 각 웹 서버에 health check 파일 추가 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · HTTP 상태 검사와 실제 연결 상대를 남기는 로그. 원문에서 「각 웹 서버에 health check 파일 추가」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · GNS3 토폴로지 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「GNS3 토폴로지」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · Health Check (10)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「Health Check」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · Health Check (8)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「Health Check」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · Health Check (9)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「Health Check」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · redispatch (11)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「redispatch」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · 로드밸런싱 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「로드밸런싱」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · 로드밸런싱 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「로드밸런싱」에 배치된 그림 또는 화면이다.
HAProxy 분산과 상태 검사 · 테스트를 위해 옵션 임시 해제 (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사. 원문에서 「테스트를 위해 옵션 임시 해제」에 배치된 그림 또는 화면이다.
HAProxy 제품 표시원본 크기로 보기 ↗
  • 수업 원본 자료 · 프록시 토폴로지·부하 분산·백엔드 상태 검사.
HAProxy 통계·접속 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과.
HAProxy 통계·접속 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과.
HAProxy 통계·접속 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과.
HAProxy 통계·접속 (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과.
HAProxy 통계·접속 (7)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과.
HAProxy 통계·접속 · HAProxy Statistics (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과. 원문에서 「HAProxy Statistics」에 배치된 그림 또는 화면이다.
HAProxy 통계·접속 · global — node (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · 노드 식별·Statistics·접속 결과. 원문에서 「global — node」에 배치된 그림 또는 화면이다.
HAProxy와 VRRP 이중화 · MASTER 사망 시 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · Keepalived·VRRP를 사용한 프록시 장애 전환. 원문에서 「MASTER 사망 시」에 배치된 그림 또는 화면이다.
HAProxy와 VRRP 이중화 · keepalived 로 HAProxy 이중화 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · Keepalived·VRRP를 사용한 프록시 장애 전환. 원문에서 「keepalived 로 HAProxy 이중화」에 배치된 그림 또는 화면이다.
HAProxy와 VRRP 이중화 · keepalived.conf 설정 (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · Keepalived·VRRP를 사용한 프록시 장애 전환. 원문에서 「keepalived.conf 설정」에 배치된 그림 또는 화면이다.
HAProxy와 VRRP 이중화 · 평상시 — VRRP 광고를 통해 MASTER 로 접속 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · Keepalived·VRRP를 사용한 프록시 장애 전환. 원문에서 「평상시 — VRRP 광고를 통해 MASTER 로 접속」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · HAProxy XFF 변환 (13)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「HAProxy XFF 변환」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · HAProxy XFF 변환 (14)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「HAProxy XFF 변환」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · HAProxy XFF 변환 (15)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「HAProxy XFF 변환」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · Kali 에서 입력 (11)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「Kali 에서 입력」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · Kali 에서 입력 (12)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「Kali 에서 입력」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 신뢰 설정 (1) (8)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 신뢰 설정 (1)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 신뢰 설정 (1) (9)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 신뢰 설정 (1)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 신뢰 설정 (2) (19)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 신뢰 설정 (2)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 신뢰 설정 (2) (20)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 신뢰 설정 (2)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 신뢰 설정 (2) (21)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 신뢰 설정 (2)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 위조 (10)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 위조」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 위조 (서버 직접 접속) (16)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 위조 (서버 직접 접속)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 위조 (서버 직접 접속) (17)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 위조 (서버 직접 접속)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 위조 (서버 직접 접속) (18)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 위조 (서버 직접 접속)」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · XFF 헤더 확인 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「XFF 헤더 확인」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
전달 클라이언트 주소와 신뢰 · httpd.conf XFF 로깅 설정 추가 (7)원본 크기로 보기 ↗
  • 수업 원본 자료 · X-Forwarded-For 처리와 프록시·웹 서버의 신뢰 경계. 원문에서 「httpd.conf XFF 로깅 설정 추가」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (10)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (11)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (12)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (6)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (7)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (8)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf (9)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 로그 설정 옵션 . /etc/httpd/conf/httpd.conf」에 배치된 그림 또는 화면이다.
프록시 주소 전달 로그 · X-forward-for 설정 옵션 . /etc/haproxy/ 설정 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · HAProxy와 Apache의 X-Forwarded-For 설정 및 로그 결과. 원문에서 「X-forward-for 설정 옵션 . /etc/haproxy/ 설정」에 배치된 그림 또는 화면이다.
실습 화면 묶음 03 1장
HAProxy 백엔드와 상태 페이지원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 04 1장
HAProxy 백엔드와 상태 페이지원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
HAProxy 백엔드와 상태 페이지원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
HAProxy 백엔드와 상태 페이지 · stats 기능 설정원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 stats 기능 설정에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
HAProxy 백엔드와 상태 페이지 · stats 기능 설정원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 stats 기능 설정에 수록된 화면·도식이다.
실습 화면 묶음 08 1장
HAProxy 백엔드와 상태 페이지 · 설치 및 설정원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 설치 및 설정에 수록된 화면·도식이다.
실습 화면 묶음 09 1장
HAProxy 백엔드와 상태 페이지 · 설치 및 설정원본 크기로 보기 ↗
  • 학습 원본 · HAProxy 백엔드와 상태 페이지의 설치 및 설정에 수록된 화면·도식이다.
동작·명령 참고 문서
예제로 추적

05fall 3·rise 2의 상태 추적

  1. inter 2s, 3, 2이고 다른 간격 옵션은 없다고 가정한다. 설명을 위해 검사가 시각 2·4·6초 등에 즉시 완료되는 단순 시간선을 사용한다.
  2. 2초와 4초 검사가 실패해도 아직 필요한 연속 실패 3회에 못 미친다. 서버는 전이 상태일 수 있으나 이 모형에서는 DOWN으로 확정되지 않는다.
  3. 6초의 검사도 실패하면 연속 실패 3회가 되어 DOWN으로 제외된다. 새로운 일반 분산 대상 선택에서 그 서버를 빼는 동작과 진행 중 연결의 운명은 분리한다.
  4. 8초 검사가 성공해도 2를 아직 만족하지 못한다. 검사 한 번이 성공했다는 화면과 일반 요청을 다시 배정하는 시점이 다를 수 있다.
  5. 10초 검사가 성공하면 연속 성공 2회가 되어 UP으로 복귀한다. 중간에 실패하면 이 연속 성공 시나리오는 깨지고 다시 상태를 관찰해야 한다.
검사 시각결과상태 판단
2초실패실패 1회
4초실패실패 2회
6초실패DOWN
8초성공회복 성공 1회
10초성공UP
검증·예외

06서버 장애와 프록시 경로 장애를 가르는 관측값

  • 체크 URL은 200인데 실제 요청은 500이면 Host 헤더·경로·인증·DB 의존성 차이가 있는지 본다. 체크가 검사한 기능과 실제 실패 기능을 먼저 맞춘다.
  • 백엔드 연결을 만들지 못하는 시간과 연결 수 한도 때문에 큐에서 기다리는 시간을 구분한다. 응답이 느리다는 하나의 관찰로 애플리케이션 계산이 느리다고 결론내리지 않는다.
  • 클라이언트→와 →서버는 별도 연결이다. 클라이언트가 연결 성공을 보아도 백엔드 쪽 연결과 응답이 성공했다는 뜻은 아니다.
  • 전환이나 서버 제외 후 새 요청이 성공해도 이미 열려 있던 연결·진행 중 응답이 이어졌다는 증거는 아니다. 장애 전후 두 종류를 따로 기록한다.
  • 백엔드가 변경 작업을 마치고 응답을 보내기 전에 끊기면 프록시는 성공 여부를 확정하기 어렵다. 이때 무조건 재시도하면 정상 처리된 작업이 두 번 실행될 수 있다.

07연결 검사와 readiness 검사, DOWN에서 UP까지

  • 검사는 연결을 수락하는지 확인한다.
  • HTTP 검사는 경로와 Host에 요청을 보내 기대 상태·본문이 나오는지까지 확인할 수 있다.
  • 서버가 200을 반환하는 빈 정적 파일은 웹 서버 파일 제공 기능을 보여 주지만 DB·캐시·업무 처리까지 준비됐다는 증거는 아니다.
    • 반대로 외부 부가 기능 하나가 실패했다고 모든 서버를 DOWN시키는 health endpoint는 가용성을 불필요하게 떨어뜨릴 수 있다.
  • 은 연속 실패 몇 번 뒤 제외할지, 는 연속 성공 몇 번 뒤 복귀시킬지와 관련된다.
  • 첫 실패에 즉시 상태가 뒤집히지 않도록 해 일시 변동을 완충한다.
  • L4CON은 연결 단계, L7STS는 HTTP 상태, L7OK는 성공적인 응답 판단을 해석하는 단서가 될 수 있으며 실제 표시 이름은 버전에 따른다.
  • HEAD에는 본문이 없으므로 본문 문자열 검사와 결합하려면 GET 등 맞는 메서드를 사용한다.

08Keepalived VIP 이동과 이미 연결된 세션

  • 백엔드가 두 개여도 한 대만 있으면 그 프록시가 단일 장애점이다.
  • 의 구성은 같은 가상 라우터 그룹에서 우선순위와 광고 상태를 바탕으로 소유자를 정한다.
  • ·는 그룹에서 일치해야 하고 노드의 실제 주소와 우선순위는 다를 수 있다.
    • 예를 들어 기본 110 대 100이고 검사 실패 보정이 -20이면 90이 되어 상대가 더 높아지는 구조를 만들 수 있다.
  • 가 다른 호스트로 이동하면 새 연결을 그 호스트로 받을 수 있지만 진행 중 세션과 애플리케이션 메모리가 자동 복제되는 것은 아니다. standby에서 가 아직 없을 때 가 어떻게 할지도 선택해야 한다.
  • 가 존재하는지만 보는 pgrep 검사는 실제 응답 준비를 보장하지 않는다.
  • 양쪽 설정·인증서·상태 검사와 소유권, 앱 상태의 수명을 함께 설명해야 장애 전환의 범위가 분명해진다.

09부하 분산기 자체의 가용성

  • 하나의 부하 분산기만 두면 그 장치가 단일 장애 지점이 될 수 있다.
  • 와 가상 IP 등을 이용한 구성에서는 어느 노드가 주소를 소유하는지, 장애를 무엇으로 판단하는지, 중복 소유를 어떻게 방지하는지 확인한다.
  • 가상 IP가 이동해도 기존 연결이나 애플리케이션 상태가 자동으로 옮겨지는 것은 아니다.
  • 계획된 장애 실습에서 신규 연결, 기존 연결, 세션 유지와 복구 시간을 각각 확인해야 한다.
    • DB의 쓰기 주체 전환은 별도 문제이다.

10헬스 체크가 서버 선택 집합을 바꾸는 과정

  • 하나의 가 웹 서버 A와 B에 요청을 분산한다고 가정한다. 정상으로 판정된 서버들이 선택 후보가 되고 설정한 알고리즘과 조건에 따라 요청을 전달한다.
  • A의 준비 상태 검사에서 실패가 누적돼 제외 조건을 만족하면 A를 신규 전달 대상에서 빼고 남은 B로 보낸다.
  • 실패 한 번에 바로 제외할지, 여러 차례를 요구할지는 설정에 따라 다르며 실제 헬스 판정과 사용자 요청의 성공률은 따로 관찰해야 한다.
  • 서버를 DOWN으로 표시하는 것과 기존 연결을 모두 끊는 것은 동일한 동작이 아니다.
  • 연결 유지·종료 정책과 프로토콜 모드에 따라 이미 진행 중인 요청의 결과가 달라질 수 있다.
  • A가 회복해도 설정한 정상 검사 조건을 만족한 뒤 다시 선택 후보로 들어온다.
  • 서버가 빠진 동안 B가 전체 부하를 감당할 수 있는지, 복귀한 A에 갑자기 요청이 몰리지 않는지도 중요한 운영 조건이다.
  1. A·B가 신규 전달 후보로 등록돼 있다.
  2. 설정한 실패 판정 조건에 도달했는지 확인한다.
  3. 신규 요청은 남은 후보 B로 전달한다.
  4. 설정한 정상 판정 조건을 충족하면 다시 후보가 된다.

설명과 함께 보는 보조 도식

경로와 상태

헬스 판정에 따른 전달 대상 변경

신규 HTTP 요청의 선택 후보 변화를 나타내며 기존 연결 종료를 자동으로 뜻하지 않는다.

요청전달·검사전달·검사새 요청을 보낸다.클라이언트헬스 상태와 분산 규칙으로 대상을 고른다.HAProxy준비 검사 대상웹 서버 A남은 요청을 처리할 수 있어야 한다.웹 서버 B
전체 단계를 한 번에 읽기
  1. 01

    둘 다 정상

    A·B가 신규 전달 후보로 등록돼 있다.

    후보
    A, B
  2. 02

    A 검사 실패 누적

    설정한 실패 판정 조건에 도달했는지 확인한다.

    즉시 제외 여부
    설정에 따름
  3. 03

    A 제외

    신규 요청은 남은 후보 B로 전달한다.

    후보
    B
    기존 연결
    별도 정책
  4. 04

    A 회복 확인

    설정한 정상 판정 조건을 충족하면 다시 후보가 된다.

    후보
    A, B

파란 실선: 현재 단계에서 강조하는 연결 · 붉은 점선: 사용할 수 없는 연결

학습 모식도. 참조 또는 연결 관계를 표현한다. 흐리게 표시된 요소는 해당 단계에서 아직 사용되지 않거나 제외된 요소다.

11검사 성공인데 사용자는 실패하는 이유

  • 헬스 체크가 단순 연결이면 포트는 열렸지만 애플리케이션이 오류를 반환하는 상황을 놓칠 수 있다.
  • HTTP 검사도 정적 페이지 하나만 확인하면 DB가 필요한 기능의 실패를 발견하지 못할 수 있다.
    • 반대로 모든 외부 의존성을 무거운 질의로 검사하면 검사 자체가 부하를 만들거나 부분 장애 때 모든 서버가 동시에 제외될 수 있다.
  • 준비 상태의 의미를 정하고 가벼운 검사와 실제 사용자 요청 관찰을 함께 사용한다.
  • 의 접속·대기·응답 시간과 backend별 상태, 오류·재시도 횟수를 비교한다.
  • 특정 서버에만 실패가 집중되면 그 서버의 설정과 데이터 상태를 확인하고, 전체 실패면 공통 의존성과 분산기 자체를 조사한다.
  • 가 다른 분산기로 이동해도 기존 연결·세션·DB 쓰기 주체가 자동으로 이동하는 것은 아니다.
  • 장애 실습에서는 새 연결과 진행 중 요청, , 변경 요청의 중복 여부를 별도로 확인해야 가용성 범위를 정확히 설명할 수 있다.
  • 재시도는 일시 장애에 도움이 되지만 이미 처리된 변경 요청을 반복하면 중복 작업이 생길 수 있다. 요청의 멱등성, 재시도 시점, 대상 변경 조건을 검토하고 응답 시간 제한을 다른 계층과 맞춘다.
구성·관찰 대상확인 정보판단할 차이
헬스 상태검사 경로·실패·회복 조건포트 생존과 업무 준비
서버 후보UP·DOWN·분산 상태새 요청의 전달 대상
사용자 요청지연·오류·재시도검사와 실제 트래픽 차이
장애 전환·연결·세션·DB주소 이동과 상태 복구
학습 확인

이해했는지 확인하기

  • L4 연결 확인과 애플리케이션 준비 검사를 구분한다.
  • 재시도와 세션 고정이 업무 상태에 미치는 영향을 확인한다.
  • 분산기 장애 시 신규·기존 연결의 동작을 검증한다.

함께 확인할 공식 자료