バックエンドに以下のような記述をしています。ただ、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 などでも分散できるとは思いますが。
コメント