Nginx 의 부하 균형 가중 폴 링 (Weighted Round Robin)

부하 균형 설정
Nginx 의 부하 균형 설정 은 다음 과 같 습 니 다.
http {  
    upstream cluster {  
        server a weight=4;  
        server b weight=2;  
        server c weight=1;  
    } 
        ... 
    }

실현 의 원리
모든 백 엔 드 피 어 는 세 개의 가중치 변 수 를 가지 고 있 으 며, 먼저 그들의 의 미 를 설명 한다.
(1) weight
설정 파일 에서 지정 한 이 백 엔 드 의 가중치 입 니 다. 이 값 은 고정 적 으로 변 하지 않 습 니 다.
(2) effective_weight
백 엔 드 의 유효 가중치, 초기 값 은 weight 입 니 다.
백 엔 드 를 방출 할 때 백 엔 드 와 의 통신 과정 에서 오류 가 발생 하면 effective 를 감소 합 니 다.weight。
이후 새로운 요청 이 왔 을 때 백 엔 드 를 선택 하 는 과정 에서 effective 를 점차 증가 시 킵 니 다.weight, 결국 weight 로 회 복 됩 니 다.
이 필드 를 추가 하 는 이 유 는 백 엔 드 에 오류 가 발생 했 을 때 가중치 를 낮 추기 위해 서 입 니 다.
(3) current_weight
백 엔 드 의 현재 가중치 는 처음에는 0 이 었 다가 동적 으로 조정 된다.그렇다면 어떤 동적 조정 일 까?
백 엔 드 를 선택 할 때마다 클 러 스 터 의 모든 백 엔 드 를 옮 겨 다 니 며 백 엔 드 마다 currentweight 그것 의 effective 증가weight,
동시에 모든 백 엔 드 를 누적 하 는 effectiveweight, totalk 로 저장.
이 백 엔 드 의 currentweight 가 가장 큽 니 다. 이 백 엔 드 를 선택 하고 currentweight 에서 total 을 빼다.
이 백 엔 드 가 선택 되 지 않 았 다 면 currentweight 줄 일 필요 없어 요.
세 개의 weight 필드 의 의 미 를 파악 한 후 가중 폴 링 알고리즘 은 다음 과 같이 설명 할 수 있 습 니 다.
  • 모든 요청 에 대해 클 러 스 터 의 모든 사용 가능 한 백 엔 드 를 옮 겨 다 니 며 모든 백 엔 드 peer 에 대해 실행: peer - > currentweight += peer->effecitve_weight。 동시에 모든 peer 의 effective 를 누적 합 니 다.weight, totalk 로 저장.
  • 클 러 스 터 에서 currentweight 가 가장 큰 peer 는 이번 선 택 된 백 엔 드 입 니 다.
  • 이번 선 택 된 백 엔 드 에 대해 실행: per - > currentweight -= total。

  • 상술 한 묘 사 는 그다지 직관 적 이지 않 을 수 있 으 니 예 를 보 자.
    현재 아래 upstream 설정 블록 을 사용 합 니 다:
    upstream backend {
    
        server a weight=4;
    
        server b weight=2;
    
        server c weight=1;
    
    }
    

    이 설정 에 따 르 면 7 개의 클 라 이언 트 요청 중 a 는 4 번 선택 되 고 b 는 2 번 선택 되 며 c 는 1 번 선택 되 며 분포 가 부 드 럽 습 니 다.
    우리 가 이렇게 된 것 인지 아 닌 지 계산 해 보 자.
    initial current_weight of a, b, c is { 0, 0, 0 }
    상기 과정 을 통 해 다음 과 같은 결론 을 얻 을 수 있다.
  • 7 개 요청 중 a, b, c 는 각각 4, 2, 1 회 선택 되 었 고 그들의 가중치 에 부합 되 었 다.
  • 7 개 요구 에서 a, b, c 가 선택 한 순 서 는 a, b, a, c, a, b, a 로 분포 가 고 르 고 권력 이 중대 한 백 엔 드 a 는 연속 적 으로 선택 되 지 않 았 다.
  • 7 개의 요청 이 있 을 때마다 a, b, c 의 currentweight 는 다시 초기 값 {0, 0, 0} 으로 돌아 가기 때문에 상기 절 차 는 계속 순환 합 니 다.

  • 나중에 코드 붙 이기: 계속...

    좋은 웹페이지 즐겨찾기