Nginx 부하 균형 코드 의 가중 폴 링
가중 폴 링 은 폴 링 방식 으로 서로 다른 서버 를 스케줄 링 하고 현재 서버 의 상 태 를 기록 하지 않 으 며 상태 가 없 는 스케줄 링 방법 입 니 다.Nginx 에 서 는 스케줄 링 된 서버 가 실 패 했 을 때 가중치 제 어 를 통 해 서버 상 태 를 간단하게 제어 합 니 다.
2. 주요 변수:
가중치 제어 의 주요 세 가지 변수: 1) weight: 설정 의 가중치 원시 값 을 표시 합 니 다. 실제 스케줄 링 과정 에 참여 하지 않 습 니 다. 주로 서버 가 실 행 된 후 가중치 가 감소 한 후 회복 과정의 최대 값 에 사 용 됩 니 다.2) effect_weight: 현재 가중치 의 유효 값 입 니 다. 초기 화 할 때 설정 한 가중치 로 설정 합 니 다. 예약 한 서버 가 실 패 했 을 때 유효 가중치 가 감소 하고 후속 스케줄 링 과정 에서 점차 회복 합 니 다.3) current_weight: 현재 가중치, 매 라운드 스케줄 링 시 유효 가중치 가 추 가 됩 니 다. 서버 가 선택 되 었 을 때 하나의 값 이 감소 합 니 다 (이번 라운드 유효 총 가중치).
3. 폴 링 과정:
폴 링 은 주로 두 함수 에서 이 루어 집 니 다. ngxhttp_upstream_get_round_robin_peer 는 주요 입구 로 주로 단기 장면 과 폴 링 결과 의 귀환 을 처리 했다.ngx_http_upstream_get_peer 이 함수 가 실제 폴 링 과정 을 실현 합 니 다.1) ngx_http_upstream_get_round_robin_peer:
if (peers->single) {
peer = &peers->peer[0];
if (peer->down) {
goto failed;
}
}
단일 필드 에서 유일한 서버 가 오프라인 되 지 않 으 면 서버 로 돌아 갑 니 다.
failed:
if (peers->next) {
/* ngx_unlock_mutex(peers->mutex); */
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
rrp->peers = peers->next;
n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
/ (8 * sizeof(uintptr_t));
for (i = 0; i < n; i++) {
rrp->tried[i] = 0;
}
rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);
if (rc != NGX_BUSY) {
return rc;
}
/* ngx_lock_mutex(peers->mutex); */
}
홈 서버 그룹 폴 링 에 실 패 했 을 경우 예비 서버 에서 폴 링 을 진행 합 니 다.2)
ngx_http_upstream_get_peer:
폴 링 단 계 는 모든 서버 를 옮 겨 다 니 며 이미 시도, 오프라인, 실패 횟수 가 제 한 된 서버 에 대해 서 는 실제 폴 링 과정 에 참여 하지 않 습 니 다.
폴 링 의 실제 계산 과정 은 비교적 간단 하 며, 단순히 효과 적 인 가중치 에 대한 계산 과 회복 이다.
peer->current_weight += peer->effective_weight;
total += peer->effective_weight;
if (peer->effective_weight < peer->weight) {
peer->effective_weight++;
}
if (best == NULL || peer->current_weight > best->current_weight) {
best = peer;
}
최 우수 치 를 선택 한 후 최 우수 치 현재 의 가중치 를 업데이트 하고 모든 폴 링 노드 의 유효 가중치 총 계 를 빼 야 합 니 다.
if (best == NULL) {
return NULL;
}
i = best - &rrp->peers->peer[0];
rrp->current = i;
n = i / (8 * sizeof(uintptr_t));
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
rrp->tried[n] |= m;
best->current_weight -= total;
if (now - best->checked > best->fail_timeout) {
best->checked = now;
}
return best;
서버 가 모두 유효 할 때 (시간 초과 등 이상 도 없 음) 모든 서버 의 유효 가중치 가 변 하지 않 습 니 다. 매 라운드 문의 시 총 유효 가중치 가 같 습 니 다. 기본 가중치 가 큰 서버 는 현재 가중치 가 마이너스 일 때 회복 이 빠 르 고 재 활성화 빈도 도 높 습 니 다.
4. Patch 부대 예 [2]:
a. b c 대응 가중치 가 511 이 고 기간 유효 가중치 가 변 하지 않 습 니 다.첫 번 째 행 위 는 문의 가 완성 되 고 두 번 째 행 위 는 완성 후의 현재 가중치 를 선택한다.
a b c
0 0 0 (initial state)
1 라운드:
5 1 1 (a selected)
-2 1 1
2 라운드:
3 2 2 (a selected)
-4 2 2
제3 차
1 3 3 (b selected)
1 -4 3
제4 라운드
6 -3 4 (a selected)
-1 -3 4
제5 차
4 -2 5 (c selected)
4 -2 -2
제6 라운드:
9 -1 -1 (a selected)
2 -1 -1
제7 라운드:
7 0 0 (a selected)
0 0 0
5. 참고 문서:
[1]http://blog.csdn.net/zhangskd/article/details/50194069
[2]https://github.com/phusion/nginx/commit/27e94984486058d73157038f7950a0a36ecc6e35
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.