RabbitMQ負荷等化(1)

5722 ワード

大量の業務アクセス、高同時要求に対して高性能のサーバーを使用してRabbitMQサービスの負荷能力を向上させることができる.シングルマシン容量が限界に達すると、クラスタのポリシーを採用して負荷能力をさらに向上させることができますが、ここでは負荷の不均衡の問題があります.1つのクラスタに3つのノードがある場合、すべてのクライアントがその中の1つのノードnode 1とTCP接続を確立すると、node 1のネットワーク負荷は必然的に大きく増加して耐えられなくなり、他のノードはそれほど負荷がないためハードウェアリソースの浪費をもたらすため、負荷の均衡が特に重要になると考えてみましょう.
ロードバランシング(Load balance)は、複数のコンピュータ(コンピュータクラスタ)、ネットワーク接続、CPU、ディスクドライブ、または他のリソースに負荷を割り当てるコンピュータネットワーク技術であり、最適なリソース使用、スループットの最大化、最小応答時間、および過負荷回避の目的を達成する.単一のコンポーネントの代わりに、負荷分散を伴う複数のサーバコンポーネントを使用すると、冗長性により信頼性が向上します.負荷等化は、通常、ソフトウェア負荷等化とハードウェア負荷等化の2つに分けられる.
ソフトウェア負荷等化とは、1つまたは複数のインタラクティブなネットワークシステム内の複数のマウントサーバに1つまたは複数の対応する負荷等化ソフトウェアをインストールして、等化負荷技術を実現することを意味する.ソフトウェアはサーバに容易にインストールでき、一定のバランスのとれた負荷機能を実現します.ソフトウェア負荷等化技術は構成が簡単で、操作も模倣されており、最も重要なのはコストが低いことです.
ハードウェア負荷バランシングとは、複数のサーバ間に対応する負荷バランシングデバイス、すなわち、負荷バランサ(例えばF 5)をインストールしてバランシング負荷技術を完成させることであり、ソフトウェア負荷バランシング技術に比べて、より良い負荷バランシング効果を達成することができる.ハードウェア負荷分散テクノロジーは、負荷分散器を追加する必要があり、コストが高いため、トラフィックの高い大規模なWebサイトシステムに適しています.
ここでは主にRabbitMQクラスタに対してどのように効果的にソフトウェア負荷等化技術を使用するかを議論し,現在主流の方式はクライアント内部で負荷等化を実現するか,あるいはHAProxy,LVSなどの負荷等化ソフトウェアを使用して実現することである.
クライアント内部での負荷分散
RabbitMQでは,クライアント接続時に負荷等化アルゴリズムを簡単に用いて負荷等化を実現できる.負荷等化アルゴリズムには多くの種類があり、主流は以下の通りである.
ポーリング法は、要求をバックエンドサーバに順番に割り当て、サーバの実際の接続数と現在のシステム負荷に関係なく、バックエンドの各サーバを均等に処理します.例えば、コードリストに示すように、複数のクライアントがこの3つのノードを有するRabbitMQクラスタに接続する必要がある場合、RoundRobinを呼び出すことができる.getConnectionAddress()を使用して、対応する接続アドレスを取得します.
public class RoundRobin {
    private static List list = new ArrayList(){{
        add("192.168.0.2");
        add("192.168.0.3");
        add("192.168.0.4");
    }};
    private static int pos = 0;
    private static final Object lock = new Object();
    public static String getConnectionAddress(){
        String ip = null;
        synchronized (lock) {
            ip = list.get(pos);
            if (++pos >= list.size()) {
                pos = 0;
            }
        }
        return ip;
    }
}

ランダム法はランダムアルゴリズムにより,バックエンドサーバのリストサイズ値に基づいてランダムに1台のサーバを選択してアクセスする.確率統計理論から,クライアントがサービス側を呼び出す回数が増えるにつれて,その実際の効果は,呼び出し量をバックエンドに平均的に割り当てるサーバ,すなわちポーリングの結果に近づくことが分かった.対応するサンプルコードは次のとおりです.
public class RandomAccess {
    private static List list = new ArrayList(){{
        add("192.168.0.2");
        add("192.168.0.3");
        add("192.168.0.4");
    }};
    public static String getConnectionAddress(){
        Random random = new Random();
        int pos = random.nextInt(list.size());
        return list.get(pos);
    }
}

ソースアドレスハッシュ法ソースアドレスハッシュの考え方は、取得したクライアントIPアドレスに基づいて、ハッシュ関数によって計算された数値であり、この数値でサーバリストのサイズをモデリング演算し、得られた結果、クライアントがサーバにアクセスするシーケンス番号である.ソースアドレスハッシュ法を用いて負荷等化を行い,同じIPアドレスのクライアントは,バックエンドサーバリストが変わらない場合,毎回同じバックエンドサーバにマッピングしてアクセスする.
public class IpHash {
    private static List list = new ArrayList(){{
        add("192.168.0.2"); add("192.168.0.3"); add("192.168.0.4");
    }};
    public static String getConnectionAddress() throws UnknownHostException {
        int ipHashCode = InetAddress.getLocalHost().getHostAddress().hashCode();
        int pos = ipHashCode % list.size();
        return list.get(pos);
    }
}

重み付けポーリング法の異なるバックエンドサーバは、マシンの構成と現在のシステムの負荷が異なるため、耐圧能力が異なる可能性があります.構成が高く、負荷が低い機械により高い重みを配置し、より多くの要求を処理させる.一方、低負荷で負荷の高いクラスタを構成し、より低い重みを割り当て、システム負荷を低減することで、重み付けポーリングはこの問題をうまく処理し、要求順序をバックエンドに割り当てます.
重み付けランダム法は重み付けポーリング法と同様に,重み付けランダム法もバックエンドマシンの構成,システムの負荷に応じて異なる重み付けを割り当てる.異なる点は、順序ではなくウェイトに従ってバックエンドサーバをランダムに要求することです.
最小接続数法最小接続数アルゴリズムは比較的柔軟で知能的であり、バックエンドサーバの配置が異なるため、要求の処理が遅い.バックエンドサーバの現在の接続状況に応じて、現在の蓄積接続数が最も少ない1台のサービスを動的に選択して現在の要求を処理し、バックエンドサービスの利用効率をできるだけ向上させ、負荷を各サーバに合理的に分流させる.
重み付けポーリング法,重み付けランダム法,最小接続数法の実現についても簡単であるが,ここでは読者自身に実践を残しておく.