tutumでできるwebapp冗長化構成
サービスのリデプロイをするとき、単発のコンテナでサービスしてると、どうしてもダウンタイムが発生してしまいます。
このブログは現在tutum + digital ocean + awsで運用されていて、webappコンテナが3つ稼働しています。つまり、冗長化構成がとられているんですね。
webappの冗長化構成については、tutumのドキュメンテーションにもかいてある事項ではあるんですけど、このブログでも大まかな解説をします。
まずwebappサービスをつくろう
以前解説した手法で、webappサービスを構築してください。
この時、コンテナ数は2個以上にしたいですので、node portはdynamicのままにしておきましょう。そうしないと、同一コンテナ内でstatic port同士が衝突するという悲しい結果になってしまいます。
haproxyをつかおう
実はtutumにはhaproxyのdocker imageが既に用意されています。Launch Service>jump start>Proxiesに、tutum/haproxy
があるので、こいつを使います。
こいつでhaproxyサービスを立ち上げて、既に用意したサービスにリンクしてやると、リンク先サービスにあるコンテナのnode portを認識し、自動的に冗長化構成を構築してくれます。すごい!
Node Portは、外からアクセスする際のポート番号を指定しましょう。コンテナ数は1つにしてくださいね。それから、haproxyサービスの立ち上げで必須なのが、リンク先サービスに前項で構築したサービスを指定することと、API RolesにFull Accessを指定すること。どちらが抜けてもhaproxy側のログにエラーが出てきますので、しっかり確認してください。
これでサービスを起動すると、haproxyサービスのlogに、こんな感じのやつが出てくるはずです。
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z global
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z maxconn 4096
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z pidfile /var/run/haproxy.pid
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z user haproxy
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z group haproxy
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z daemon
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z defaults
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z mode http
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z option redispatch
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z timeout connect 5000
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z timeout client 50000
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z timeout server 50000
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z frontend default_frontend
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z bind 0.0.0.0:80
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z default_backend cluster
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z backend cluster
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z balance roundrobin
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z server cluster-49163 myapp-2.d78d27dd-ytnobody.node.tutum.io:49163
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z server cluster-49160 myapp-1.d78d27dd-ytnobody.node.tutum.io:49160
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z server cluster-49160 myapp-3.d78d27dd-ytnobody.node.tutum.io:49164
[myapp-haproxy-1] 2014-11-07T09:59:08.118084377Z
ここまでできれば完成です。あとはhaproxyのNode Portめがけてリクエストを投げてみてください。webappが見えれば成功です。
試しにhaproxyのlogを観察しながら、webappサービスのコンテナを増やしたり減らしたりして、リクエストを投げてみましょう。新しいコンテナが増えればhaproxyのbackendに自動的に追加され、コンテナが減ればbackendから自動的に外されますよね。このことから、冗長性の確保ができていることが確認できますね。
まとめ
手っ取り早く冗長化構成を立ち上げられるtutum/haproxyを紹介しました。
これで、新しいコンテナを追加してから古いコンテナをterminateすることで、webappの入れ替えをノンストップで実施できますね!