nginx の upstream backend の ip_hash について

バックエンドに以下のような記述をしています。ただ、ip_hash を消しても動作するので気になって調べることにしました。ちなみにこの記事は間違っている部分もあるかと思いますので、もし間違っている部分があれば指摘頂ければ幸いです。

1
2
3
4
upstream backend {
    ip_hash;
    server 127.0.0.1:8080;
}

下記のページに ip_hash についての記述があります。こちらのページの “This method guarantees that the client request will always be transferred to the same server.” っていうところ「このクライアントのりクエストはいつも同じサーバーに転送されことが保証されます」っていう所が鍵なんじゃかいかと推測しています。

あと下記の文言、上手く和訳できているか分かりませんが「もしいずれかのサーバーをしばらくの間削除する必要がある場合は、サーバーに *down* とマークする必要があります」って書いてあります。

If one of the servers must be removed for some time, you must mark that server as *down*.

ということを踏まえてサンプルコードを見て推測すると、バックエンドサーバーは簡単に複数作ることができるんだけど、その中にある ip_hash がそれを美味いこと振り分ける(おそらくハッシュキーか何かで)ためのコードであって、複数のバックエンドサーバが無い場合は無くても問題ないということですね。

1
2
3
4
5
6
7
upstream backend {
    ip_hash;
    server   backend1.example.com;
    server   backend2.example.com;
    server   backend3.example.com  down;
    server   backend4.example.com;
}

また、言ってみれば消す必要もないというわけですね。あと、Facebook で友達にも訓えて頂きましたが weight などでサーバー毎の振り分けの比率を変更したりもできます。先程紹介した参考ページを見ると下記のようなコードがあります。

1
2
3
4
5
upstream backend  {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
}

本当に負荷分散する時には必ずしも全てのサーバーが同じスペックとは限りませんし、こういう分散の仕方ができればスペックに合わせて各サーバーへの振り分けを調節できますよね。nginx って本当に凄いなと思いました。もちろん Apache などでも分散できるとは思いますが。

コメント

コメントは受け付けていません。