[nginx] 부하 균형 전략 - RobinRound

4742 단어 nginx
  • 부하 균형: 부하 가 가능 한 한 균형 있 게 여러 개의 서로 다른 백 엔 드 서비스 유닛 에 분담 하여 서비스의 가용성 과 신뢰성 을 확보한다.
  • upstream: proxy 와 upstream 모듈
  • nginx 는 기본적으로 robin round 전략 을 사용 하고 상세 한 내용 은 Nginx 학습 의 12 - 부하 균형 - 가중 폴 링 전략 분석 을 참고 합 니 다.
    주체 구조
    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;
  • upstream 설정 로 딩 후 초기 화 함수 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 변 수 를 기록 합 니 다.
  • accessed 는 이 peer 의 최근 방문 이 실 패 했 을 때의 시간 을 나타 낸다.
  • checked 는 이 peer 가 최근 에 실 패 했 을 때의 시간 이나 '죽 었 다' 에서 '살 았 다' 까지 의 살 아 있 는 시간 을 표시 합 니 다. checked > accessed 를 사용 하면 실패 계수 기 를 제거 합 니 다.

  • 그래서 다음 과 같은 장면 이 있 습 니 다: 백 엔 드 서버 A 실패 횟수 maxfails, 그리고 시간 checked 가 fail 을 초과 하지 않 았 습 니 다.timeout, 이 peer 는 후보 목록 에 있 지 않 습 니 다 (if.. contine).냉각 시간 이 되면 이 peer 는 다시 후보 목록 으로 돌아 가 고 선택 되면 checked 를 업데이트 합 니 다.peer 가 다시 살아 서 정상 적 인 요 구 를 할 수 있다 면 peer 석방 절차 checked>accessed 에서 실패 한 계수 기 를 제거 하고 정상 으로 회복 합 니 다.

    좋은 웹페이지 즐겨찾기