Glide Note

glidenote's blog

Serf+HAProxyで作るAutomatic Load Balancer

Serf使ってますか!サーフ!

諸事情というか大人の事情で急遽自前でロードバランサを用意しないといけなくて、それをissueに書いてたら、 あんちぽさんがSerf+HAProxy使ったらいいのでは、 とIRCで助言をくれて、同日のmizzyさんのブログでもSerfに言及していたので、 ちょっとSerfの概要を知るためと、Serf+HAProxyが実際ロードバランサとしてどんな感じに使えるのか検証してみた。

Serfは新しいプロダクトだし、公式でSerf+HAProxyをDemoと言って紹介してるけど、ドキュメントが少なくて、 どうすれば動くのか、どういう仕組みなのか理解に苦労したので先に概要をちょっとまとめてみる。

Serf + HAProxyの概要

  • Serfは全てのサーバで動かす必要がある。
  • クラスタという概念があって、各サーバ(ノード)で動いているSerfがクラスタにjoin/leaveすることが出来る。
  • クラスタに参加している、ノード同士が相互通信をしていて、クラスタへのjoin/leaveするノードを検知している
  • ノードがクラスタにjoin/leaveするとイベントが発生して、事前に設定したスクリプトを走らせることが出来る。 今回の例だとロードバランサ側で/etc/haproxy/haproxy.cfgの修正スクリプトが走って、バランシング先のWEBサーバを自動で追加、除外してくれる。

2013年10月31日 19:00 修正
HAProxyの再起動と書いてましたが、正しくは/etc/init.d/haproxy reloadなので、設定再読込でした。

1.ロードバランサのクラスタにweb server1がjoin

2.Web server1がクラスタにjoinしてきたので、member-joinイベントが発生

  1. ロードバランサでmember-joinイベントで指定しているスクリプトが実行される
  2. ロードバランサの/etc/haproxy/haproxy.cfgの書き換え、HAProxyの設定再読込がかかり、Web Server1がバランシング先に追加される。
  3. Web Serve1にアクセスが流れるようになる

3.Web server2がクラスタにjoinしてきたので、member-joinイベントが発生

  1. ロードバランサでmember-joinイベントで指定しているスクリプトが実行される
  2. ロードバランサの/etc/haproxy/haproxy.cfgの書き換え、HAProxyの設定再読込がかかり、Web Server2がバランシング先に追加される。
  3. Web Serve1とWeb Server2にアクセスが流れるようになる

4.Web server1が突然の死。member-leaveイベントが発生

  1. ロードバランサでmember-leaveイベントで指定しているスクリプトが実行される
  2. ロードバランサの/etc/haproxy/haproxy.cfgの書き換え、HAProxyの設定再読込がかかり、Web Server1がバランシング先から除外
  3. Web Server2だけアクセスが流れるようになる

もしWeb Server1が復活したら、勝手にクラスタに参加してくるので、再度バランシング先に自動追加される。

Serf+HAProxyのまとめ

  • Webサーバの増減に伴って設定ファイル書き換え、commit、push、deployして、HAProxyのreloadとかする必要ない。
  • Webサーバの増減をロードバランサが自動で検知してバランシング先に追加、除外を自動でしてくれる。
  • Puppet(Chef)でSerf+HAProxyの設定をしておけば、インスタンス起動してPuppet(Chef)流せば勝手にサービスに投入される

公式だとapt-getでCentOSで動かなかったり、apache勝手に入れてきたり、クラスタに参加出来なかったり 動くようになるまでなかなかつらかったので、CentOSでとりあえず動くものをGitHubに公開しておきましたので参考にどうぞ。 ローカルLAN用のeth1が無いと使えなかったり、私も触って1日なので、よく分かってない部分が多くて改良の余地が大いにありますが。 facterを組み合わせれば、自分自身の情報を他のノードに伝える事が簡単にできると思う。

http://LP_IP:9999/にアクセスするとHAProxyの状態が確認出来て、自動でバランシング先が変化するのが確認出来る。

あんちぽさんも/etc/hostsを自動で書き換えるものを作っていたので、勉強になります。

想定される使いどころとして、すぐ思い浮かぶのがnagiosとかmuninとかサーバ増えるたびに設定ファイル修正が必要なので、Serf使いどころだと思う。 サーバの増減とかに伴って、ファイル修正が必要な部分はSerf使えば解決するはず。

Serfはドキュメントも読み切れてないので引き続きいろいろと検証を続けてる。

Nagiosから脱却すべく最近使い始めたSensuも、サーバの増減を自動で検知して勝手に監視が始まるので、 従来のサーバ増やした(減らした) => 設定ファイル修正commit、push、deploy みたいな作業は今後無くなっていくんだろうな-。

Nagiosに代わるであろう監視ソフトSensuについても、頑張って検証しているので機会があればブログに書こうと思う。

参考

Comments