まとめるとip_hashはB2Cでしかロードバランスにならないので、stickyを使いましょうという話。
socket.ioのロードバランス
socket.ioのロードバランスにおける注意点といえばXHRですね。socket.ioさんはXHRで通信することがあり、XHRの向き先がリクエストごとに分散されてしまうと通信できなくなってしまいます。
socket.io公式の方法
公式にも複数node利用する場合の方法が書かれています。
http://socket.io/docs/using-multiple-nodes/
nginxをload balancerに使う場合はip_hashを使ってね。
めでたしめでたし
というわけで、複数nodeでload balanceすることができました。
と、いうわけはなく
ip_hashってproxyとかでNATされたアドレスが同じだと分散されないんじゃないの?と思ったら案の定でして。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash
IP先頭3オクテットでやるよ!
って書いてあるのです。ってことは
192.168.0.xxx - 1号機
192.168.1.xxx - 2号機
なんていうレベルでしか分散されないわけです。
1大企業からの大量アクセスは全て同じサーバーに割り振られます。って、それは負荷分散になってない!
sticky機能
となると、sticky機能を使うという選択になってきます。cookieなどの方法で割り振ることができるようになりますnginx Plusならな!
https://www.nginx.com/products/session-persistence/
金がない場合
もちろん、お金がある場合はサポートも受けられるのでnginx plusを買ったほうが良いです。でも、お金がなければ仕方がない。OSSの同様なnginx moduleを利用させていただきましょう。
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng
作者さんありがとう!
めでたし、めでたし
というわけで、今度こそ分散されて幸せになれたのでした(まる)