Nginx 부하 균형 코드 의 가중 폴 링

3529 단어
1. 프로필:
       가중 폴 링 은 폴 링 방식 으로 서로 다른 서버 를 스케줄 링 하고 현재 서버 의 상 태 를 기록 하지 않 으 며 상태 가 없 는 스케줄 링 방법 입 니 다.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

좋은 웹페이지 즐겨찾기