Dubbo - 로드 밸런싱

1. 부하 균형이 무엇입니까


LoadBalance는 부하 균형이다. 네트워크 요청이나 다른 형식의 부하를 서로 다른 기계에 균등하게 나누는 것이 직책이다.집단 중의 일부 서버는 압력이 너무 크고 다른 서버는 비교적 한가한 상황을 피한다.부하 균형을 통해 모든 서버가 자신의 처리 능력에 적합한 부하를 얻을 수 있다.고부하 서버를 분류하는 동시에 자원 낭비를 피할 수 있어 일거양득이다.

2. 부하 균형 분류


부하 균형은 소프트웨어 부하 균형과 하드웨어 부하 균형으로 나눌 수 있다.우리가 일상적으로 개발하는 과정에서 일반적으로 하드웨어 부하의 균형을 접하기 어렵다.그러나 소프트웨어 부하 균형은 Nginx와 같은 접촉할 수 있다.

3. Dubbo에서 왜 부하 균형을 스스로 실현해야 하는가


Dubbo에서도 부하 균형의 개념과 상응하는 실현이 있다.Dubbo는 소수의 서비스 제공자의 부하가 너무 크지 않도록 서비스 소비자의 호출 요청을 분배해야 한다.서비스 제공자의 부하가 너무 크면 일부 요청이 시간을 초과할 수 있다.따라서 모든 서비스 제공자에게 부하를 균형 있게 하는 것이 필요하다.

4. Dubbo의 4중 부하 균형 정책


Dubbo는 권중 랜덤 알고리즘을 바탕으로 하는 RandomLoad Balance, 최소 활성 호출수 알고리즘을 바탕으로 하는 Least Active Load Balance,hash 일치성을 바탕으로 하는 Consistent Hash Load Balance, 가중 퀴즈 알고리즘을 바탕으로 하는 Round Robin Load Balance 등 4가지 부하 균형 실현을 제공했다.
Dubbo에서 모든 부하 균형 실현 클래스는 AbstractLoadBalance에서 계승되었다. 이 클래스는 LoadBalance 인터페이스를 실현하고 일부 공공 논리를 봉인했다.
@Override
public  Invoker select(List> invokers, URL url, Invocation invocation) {
    if (invokers == null || invokers.isEmpty())
        return null;
    //   invokers   Invoker, , 
    if (invokers.size() == 1)
        return invokers.get(0);
    
    //   doSelect  , , 
    return doSelect(invokers, url, invocation);
}

protected abstract  Invoker doSelect(List> invokers, URL url, Invocation invocation);
  • RandomLoadBalance

  • RandomLoadBalance는 가중 랜덤 알고리즘의 구체적인 실현으로 그의 알고리즘 사상은 매우 간단하다.만약에 우리가 서버 서버 서버 = [A, B, C]를 가지고 있다면 그들이 대응하는 권중은 weights = [5, 3, 2]이고 권중은 모두 10이다.이제 이 권중치를 1차원 좌표값에 평평하게 깔고,[0, 5) 구간은 서버 A, [5, 8) 구간은 서버 B, [8, 10) 구간은 서버 C에 속한다. 다음은 무작위 생성기를 통해 하나의 범위를 생성한다.[0, 10) 사이의 랜덤 수를 계산한 다음 이 랜덤 수가 어느 구간에 떨어질지 계산한다. 예를 들어 숫자 3은 서버 A에 대응하는 구간에 떨어진다. 이때 서버 A로 돌아가면 된다. 권한이 큰 기계일수록 좌표축에 대응하는 구간의 범위가 넓기 때문에 랜덤 수 생성기가 생성하는 숫자는 이 구간에 더 큰 확률로 떨어진다. 랜덤 수 생성기가 생성하는 랜덤 수의 분포성이 좋으면 얼마나 거치느냐에 따라두 번째 선택 후 각 서버가 선택된 횟수 비례는 그 권중 비례에 가깝다.예를 들어 만 번의 선택을 거친 후 서버 A가 선택된 횟수는 약 5000회, 서버 B가 선택된 횟수는 약 3000회, 서버 C가 선택된 횟수는 약 2000회이다.
  • LeastActiveLoadBalance

  • LeastActiveLoadBalance는 최소 활성 로드 밸런스를 번역합니다.활성 호출 수가 적을수록 이 서비스 제공자의 효율이 높고 단위 시간 내에 더 많은 요청을 처리할 수 있음을 나타낸다.이 때 요청을 이 서비스 제공자에게 우선적으로 분배해야 한다.구체적인 실현에서 모든 서비스 제공자는 하나의 활약수active에 대응한다.초기 상황에서 모든 서비스 제공자의 활약수는 0이다.요청을 받을 때마다 활약수에 1을 더하고, 요청을 완료하면 활약수를 1 감소시킵니다.서비스가 한동안 실행된 후에 성능이 좋은 서비스 제공자가 요청을 처리하는 속도가 더욱 빨라지고 활동수도 빨리 떨어진다. 이때 이런 서비스 제공자는 새로운 서비스 요청을 우선적으로 얻을 수 있다. 이것이 바로 최소 활동수 부하 균형 알고리즘의 기본 사상이다.최소 활약수를 제외하고 Least ActiveLoad Balance는 실현에 있어 권중치를 도입했다.그래서 정확하게 말하자면 Least ActiveLoad Balance는 가중치 최소 활성화수 알고리즘을 바탕으로 이루어진 것이다.예를 들어 한 서비스 제공자 집단에서 성능이 우수한 서비스 제공자가 두 명 있다는 것을 설명한다.어느 순간 그들의 활약수는 같다. 이때 Dubbo는 그들의 권중에 따라 요청을 분배한다. 권중이 클수록 새로운 요청을 얻을 확률이 높다.만약 두 서비스 제공자의 권한이 같다면, 이때 무작위로 하나를 선택하면 된다.
  • ConsistentHashLoadBalance

  • 일치성hash 알고리즘은 마성이공대학의 Karger와 그 협력자가 1997년에 제기한 것으로 알고리즘이 제기된 초기에는 대규모 캐시 시스템의 부하 균형에 사용되었다.그것의 작업 과정은 이렇다. 우선 IP나 다른 정보에 따라 캐시 노드에hash를 생성하고 이hash를 [0, 232-1]의 원환에 투사한다.조회나 쓰기 요청이 있을 때, 캐시 항목의 키에hash 값을 생성합니다.그리고 이hash 값보다 크거나 같은 첫 번째 캐시 노드를 찾아서 이 노드에서 캐시 항목을 조회하거나 기록합니다.현재 노드가 끊기면 다음 조회나 캐시에 쓸 때 캐시 항목에hash 값보다 큰 다른 캐시 노드를 찾으면 됩니다.대략적인 효과는 아래 그림과 같이 각 캐시 노드가 원환에 있는 위치를 차지한다.캐시 노드hash 값보다 캐시 노드hash 값이 적으면 캐시 노드에 저장하거나 읽습니다.
  • RoundRobinLoadBalance

  • 우선 가중 윤문이 무엇인지 알아보자.여기서 가장 간단한 윤문부터 말하자면, 이른바 윤문이란 요청을 각 서버에 번갈아 분배하는 것을 가리킨다.예를 들어, A, B, C 서버 3대가 있습니다.우리는 첫 번째 요청을 서버 A, 두 번째 요청을 서버 B, 세 번째 요청을 서버 C, 네 번째 요청을 다시 서버 A에 분배할 것이다.이 과정을 윤문이라고 한다.윤문은 무상태 부하 균형 알고리즘으로 간단하고 모든 서버의 성능이 비슷한 장면에 적용된다.그러나 현실적으로 우리는 모든 서버의 성능이 비슷하다고 보장할 수 없다.만약 우리가 같은 양의 요청을 성능이 비교적 나쁜 서버에 분배한다면, 이것은 분명히 불합리한 것이다.따라서 이 때 우리는 모든 서버의 부하를 조절하기 위해 휠체어 조회 과정을 가중해야 한다.가중치를 거친 후, 각 서버가 얻을 수 있는 요청 수 비율은 그들의 가중치에 가깝거나 같다.예를 들어 서버 A, B, C의 가중치는 5:2:1입니다.그러면 8번의 요청 중 서버 A는 5번의 요청을 받고, 서버 B는 2번의 요청을 받고, 서버 C는 1번의 요청을 받는다.
    이상

    좋은 웹페이지 즐겨찾기