[nginx] 부하 균형 전략 - RobinRound
4742 단어 nginx
주체 구조
upstream backend {
server 192.168.0.1:8080 weight=2 max_fails=3;
server 192.168.0.2:8080 weight=1 max_fails=3;
}
ngx_http_upstream_server()
명령 상세 참조: Server;ngx_http_upstream_init_main_conf()
, RobinRound 초기 화 함수 ngx_http_upstream_init_round_robin()
호출;ngx_http_upstream_init_round_robin()
upstream 의 모든 server 를 peer 로 초기 화하 고 peer 의 가중치, 최대 실패 횟수, 시간 초과, 실패 여 부 를 채 우 며 초기 화 요청 함수 us->peer.init = ngx_http_upstream_init_round_robin_peer
를 설정 합 니 다.us->peer.init()
, 실제 호출 ngx_http_upstream_init_round_robin_peer()
, tried 와 tries 변 수 를 만 듭 니 다. 그 중에서 tried 는 peer 가 사용 한 bit 그림 을 표시 하고 tries 는 이번 요청 이 백 엔 드 를 가 져 오 는 횟수 를 표시 합 니 다.peer 의 가 져 오기, 핸들 을 설정 합 니 다.이 실행 입 구 는 ngx_http_upstream_init_request()
upstream 에서 함수 끝 부분 을 초기 화 할 것 을 요청 합 니 다.ngx_http_upstream_get_round_robin_peer()
를 가 져 오고 부하 균형 전략 은 백 엔 드 사무 기 를 가 져 옵 니 다. 입구 함 수 는 ngx_http_upstream_connect()
= > ngx_event_connect_peer()
입 니 다.ngx_http_upstream_free_round_robin_peer()
를 풀 어 주 고 오류 가 발생 하면 다음 백 엔 드 서버 를 가 져 올 수 있 도록 상 태 를 기록 해 야 합 니 다.입구 함 수 는 ngx_http_upstream_next()
다음 peer 또는 ngx_http_upstream_finalize_request()
upstream 종료 요청 을 가 져 옵 니 다.2. peer 획득
백 엔 드 서버 를 가 져 옵 니 다. 백 엔 드 서버 가 하나 밖 에 없 으 면 바로 돌아 오 면 됩 니 다. 그러나 여러 개의 선택 이 있 으 면 호출
ngx_http_upstream_get_peer()
합 니 다.RoundRobin 은 백 엔 드 서버 의 접근 여 부 를 tried 비트 맵 으로 기록 합 니 다. uintptrt 배열, 각 요소 8bit 는 8 개의 서버 를 기록 하기 때문에 서버 i 의 상 태 는 다음 과 같 습 니 다.n = i / (8 * sizeof(uintptr_t));
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
if (tried[n] & m) {
// i
}
부하 균형 정책 은 Weighted Round Robin 으로 사용 가능 한 모든 서버 (비 down, fails < max fails) 를 옮 겨 다 니 며 가중치 가 totalk 로 누적 되 고 가중치 가 가장 큰 peer 를 선택 하 며 이 peer 의 당시 가중치 를 totalk 에서 뺀 peer 로 되 돌려 줍 니 다.
3. peer 방출
사용 중인 백 엔 드 서버 를 방출 합 니 다. 백 엔 드 하나만 있 으 면 바로 방출 됩 니 다. 백 엔 드 가 여러 개 있 으 면
// ,
if (state & NGX_PEER_FAILED) {
now = ngx_time();
peer->fails++;
peer->accessed = now;
peer->checked = now;
if (peer->max_fails) {
peer->effective_weight -= peer->weight / peer->max_fails;
}
if (peer->effective_weight < 0) {
peer->effective_weight = 0;
}
} else { //
if (peer->accessed < peer->checked) {
peer->fails = 0;
}
}
if (pc->tries) {
pc->tries--;
}
이 peer 접근 이 실 패 했 을 때 실패 계수 기 를 1 로 추가 하고 그 당시 시간 을 기록 할 때 access, checked 변 수 를 기록 합 니 다.
그래서 다음 과 같은 장면 이 있 습 니 다: 백 엔 드 서버 A 실패 횟수 maxfails, 그리고 시간 checked 가 fail 을 초과 하지 않 았 습 니 다.timeout, 이 peer 는 후보 목록 에 있 지 않 습 니 다 (if.. contine).냉각 시간 이 되면 이 peer 는 다시 후보 목록 으로 돌아 가 고 선택 되면 checked 를 업데이트 합 니 다.peer 가 다시 살아 서 정상 적 인 요 구 를 할 수 있다 면 peer 석방 절차
checked>accessed
에서 실패 한 계수 기 를 제거 하고 정상 으로 회복 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.