wtatsuruの技術方面のブログ

はてなスタッフ id:wtatsuru です。日常ブログはこちら https://tatsuru.hatenablog.com/

開発合宿でDockerとMesosを使っていい感じにリソース提供とデプロイするやつを作ってた

3日間の開発合宿で、Docker と Mesos を使ってリソース管理からテスト・デプロイ管理までするやつのプロトタイプを作ってた。
4人チームで3日間みっちりやって、それなりにいい感じにはできたと思う。id:shiba_yu36 が既に書いてるけど、自分の視点から感想だけ書いておく。
本番環境のBlue-Green Deploymentの仕組みのプロトタイプを作っていた - $shibayu36->blog;

経緯

  • 最近忙しくてあまり触れてない、Immutable Infrastracture みたいなのを作ってみたかった。
  • Docker を開発に使うのはいい感じだけど、実際の運用に組み込むには、というイメージをつかみたかった。
  • というのをラーメン屋で話してたら4人集まったので風呂敷を広げてみた。

どんなものを作ったか

  • アプリケーションは Docker コンテナとして動かす。
    • Debian Wheezy に 3.10.23 のカーネルを入れて使った。
  • コンテナ環境を提供するリソースプールは Mesos 上のフレームワーク Marathon で管理する。
  • 特定バージョンの環境は Marathon 上のジョブとして実行される。反映や切り戻しはボタン一発で行える。
  • 各種リソースをモニタリングしアプリケーションごと・ジョブごとに可視化される。
    • Docker イメージ中に sensu と fluentd を入れてログやメトリクスを転送・監視する。
    • 可視化は Graphite で。いい感じにまとめてダッシュボードに表示する。
  • コンテナのテストから可視化まで Jenkins で行う。
    • git リポジトリに push したら Docker イメージのビルドとテスト。
    • 全体のフルビルド・アプリ変更のみの差分ビルドを用意して普段は後者のみ行う。
    • Docker イメージを push する形は選ばなかった。
  • 全体を統括するダッシュボードアプリから反映操作を行う。
    • バージョンごとに Marathon にリソース要求。nginx 設定を生成し、ヘルスチェックが通ったら切り替えボタンでリリースできる。
    • 個別のバージョン環境へのアクセス提供。実際にアクセスして確認できる。
    • Jenkinsでテストが通ったらすぐに最新版が作られる。手動で作成もでき、各バージョンは削除するまで残されている。

感想

開発用にはすぐにでも導入したい

  • コンテナ型の起動時間とリソース消費の少なさで気軽に Immutable にできる。
    • サーバ設定変更・反映含めて思った以上に気楽にできた。既存の社内環境やAWS で5-10分かかるのと比較しても心理的な障壁がかなり小さい。
  • 気軽に環境作成・分離ができる。

本番導入には課題が多い

  • Docker 自身もまだ発展途上にある
  • リソース管理まわりのミドルウェアが揃っていない気がする。*1
    • Marathon を動かしていると mesos-slave 自身の負荷がかなり高い
    • Marathon や executor の mesos-docker もドキュメントが足りなくて、チームメンバがソースを読んで挙動を確認する感じになった。*2
    • 何もしない分、オートスケール部分は自分で管理しないといけない。
    • Flynn には期待してる。
  • (Fluentd|Sensu) + Graphite という組み合わせで可視化と監視はいい感じにできる。
    • Fluentd, Sensu 両方動かしたくはないけど、一長一短あって両方動かすことになった。気合いを入れて fluentd に寄せるといいかもしれない
      • Sensu を使うと client 一覧をちゃんと管理しないと破滅するので面倒 (作りなおすたびに増える)
    • Graphite の記法が強力で楽しい

自分がやったこと

  • Mesos + Docker をどうやって動かすかという部分。
    • Torque は触ったことあったけど PBS はサービスに向いてないのでそれっぽい Marathon でやってみた。
  • リソースプールの準備
    • OSとカーネルを入れ替えて Docker 環境を作っておく
  • Dockerfile 叩き台
    • chef は本質的ではないので Dockerfile にスクリプトを書き連ねるだけ。
  • データ収集まわり
    • Fluentd, Sensu の client/server を用意してメトリクス・ログの収集
    • Graphite に投げてアプリ単位・バージョン単位のダッシュボードに表示

総括

  • Immutable infrastructure 環境作成まわりのミドルウェアとその上で動くアプリケーションの要求についてなんとなく感覚が掴めた。
  • 動くものを3日で勢いよく開発するのはなかなか楽しかった。3ヶ月に1回くらいやりたい。

疲れてるのでこれくらいにします。自分が触った部分の詳細については別の記事できっと書きます。

*1:このへんはサーベイが少し足りないかも

*2:勝手に作ったAPIドキュメント公開してほしいなー

dockerをDebianで動かす(2013-12-14版)

これ、まだたまにアクセスあるので現状に合わせたやつを書いておきます。
docker を Debian で動かす - wtatsuru's blog

最近はもっと簡単になってます。Installation のページでも紹介されてますがパッケージからやると簡単です。
Requirements and Installation on Ubuntu Linux - Docker Documentation

curl http://get.docker.io | sudo sh -x
sudo adduser `whoami` docker
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
  • パッケージで入って適切なiptables, cgroupの設定まで行われます。
  • カーネルは新しい方がいいと思います (wheezy でビルドした 3.10.23 で確認)
  • ログアウト・ログインすると docker グループに入ってて sudo 無しで docker が使えると思います
  • curl でダウンロードしたやつを sudo で食わせるなんて恐ろしいので、可能な人はちゃんと食わせる前にスクリプトを読みましょう

Xfceにした

GNOME3.8 へのアップデート対応で疲れたので勢い余ってXfceにした。

  • xfce4 パッケージをインストール
  • 起動設定してX再起動。やらなくてもgdmで簡単に選べたぽい。
sudo update-alternatives --config x-session-manager
  • capslocl を ctrl にする方法探してたらこういうのにいきあたったので設定 XFCE4 Cheat Sheet
  • ショートカット設定。ターミナル起動とウィンドウサイズ操作変更まわり。
  • emacsとターミナルを半透明にする。ウィンドウマネージャの設定(詳細)ってやつの合成処理をONにするといけた
  • パネルが上下方向場所食ってるの気に食わないので左に動かす
  • 電源管理まわり。サスペンド設定など
  • 設定確認のため一度ログアウトしてみる

それなりに快適に使えてる。

/etc/network/interfaces で bridge作る

これ見れば最近のやり方が書いてある。BridgeNetworkConnections - Debian Wiki
VMホストでブリッジ生やしたいだけならこれでOK

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
  bridge_ports eth0

#isucon 負けました

isucon に Third Party Cookies として id:onishi さん、 id:motemen さんと参加してきました*1。よく言えば7位、完走した中では最下位、惨敗でした。変更はけっこうrevertしてしまったので初期スコアとあまり変わりません。。
ISUCON公式Blog
やったのはこんなかんじでした。他の2人がアプリ中心なので自分はインフラ側の視点から、という立場でした(今思うと区切ってしまったのがよくなかった)

  • アカウント・互いのログイン・hosts そういうの整える
  • nginx に入れ替えて ltsv ログ、mysql の slow.log、logrotate まわり整える
  • ログと時間の割合の分析を見てアーキテクチャの目標をなんとなく思い浮かべる。とりあえず1台で帯域飽和するかどうかまで見てみる
  • mysql 自体はチューニング要らないのでスキーマだけちょろっと触って終わる
  • タイムライン高速化まわりで memcached, redis あたりほしいと言われたので適当な設定で
  • 複数台のときの同期の仕組みを考える。lsyncd/rsyncd でさらっと(入れると失敗しそう)
  • 画像を事前に変換しといて nginx で rewrite して対応する。ここでけっこうハマってしまった
  • 最後の仕上げで落ちないように

優勝したLINE選抜の話を聞くと、最初の方に全体アーキテクチャを考えてそこに向かう、というやり方をとっていてなるほどと思いました。スタート地点の意識の違いと、それを可能にするだけの裏付けがあるな(使う道具の選定と導入、そしてとくにそういう風に見積もれたのがのがすごい)と思いました。負けないように精進したいです。

今回は運営・問題とも素晴らしかったです。実際の運用・サービスにつながる感じの問題、事前・当日の運営の仕切りと、そういう背景があった上での素晴らしいISUCONだったと思います。弁当、ビールもおいしかった。おつかれさまでした && ありがとうございました。

悔しかったので、次に開催されるとき(来年?)までに実力を高めておこうと思います。*2

*1:はてなブログは Third Party Cookie の受け入れを推奨しています

*2:やっと落ち着いてきたので酒を飲んだ勢いで書きました。

#isucon 予選で息も絶え絶えです

酒代がほしくて ISUCON3 に初参加してきました。暫定スコアは2日目5位総合11位くらいなのでたぶん決勝いけてると思います。。。
優勝賞金ドドンと100万円! 第三回 ISUCON 開催のお知らせ #isucon : ISUCON公式Blog

立ち位置的な

すごいアプリケーションエンジニア2名 (id:onishi さん id:motemen さん) と参加したので、メインの方向性は2人におまかせしてひたすら下の方のチューニングをやってました。
普通に仕事でやる分程度にはやりましたが、それ以上のドラスティックな変化が足りなかったかなと反省です。

やったこと

まずは一目見て変なところの調整から入る。

  • innodb memcache plugin とか使ったことないし知らんので memcached 使わせる。
  • 一目見てダメなクエリ対策で index 追加
  • prefork httpd, keepalive off とか意味わからんので keepalive 張らせてまともなスコアが出るように
  • Apache 最近あんまり触ってないから その間に nginx に変更。static file を返す、gzip試す、ltsv ログの準備、$connection_requests あたりの確認。
  • 真面目に my.cnf を作る。そこまで大きな工夫はしてない。普通の InnoDB チューニング。

ここまでは普段の仕事の延長な感じ。このへんから結構だましだまし。。

  • アクセス傾向分析(遅い)
  • 入れたくないけどクエリキャッシュ。
  • フォーマットした結果を DB に入れるとやっぱり重そう。
  • ゲストに varnish 入れてみる。パスごとのヒット率とか見たり。
  • 遅い部分を計測しつつ提案、user から sys に移ってきたからいろいろ悩む。

最後の方はひたすらアプリの改善を見ながらパフォーマンスとボトルネックを見ることだけやってた感じでした。

提出したAMI大丈夫かな…ちゃんと通るかな…。今から不安でしょうがないです。もう酒飲んでるから管理画面は触れないし祈るのみ。

反省

こっからは読まなくていいです

  • 予習足りなかった:前日やればいいやと思ってたけど 酔いつぶれて一日中寝てた とかそういうの。ひどかった。
  • 知らないミドルウェア大杉:varnish はだましだまし、MySQL5.6 そんなに触ってないからけっこうその場で調べたり。
  • 発想の転換:当たり前の発想しかなかった。優勝クラスの人たちに結局ダブルスコア以上つけられてしまったのは、二人にまかせて思考停止してた部分があったなーと。
  • 武器をそろえる:普段からワンライナー書いてばかりだからその場で sed awk 書きまくってたけど、ちゃんとツールにするべきだなーと思った。自分の中でのパフォーマンス解析の定番的な。
  • デプロイとか考えてなかった。そこが直列になってしまった。

結局

なんだかんだで楽しかったです。普段の仕事でここまでカリカリにチューニングすることが減ってるので、なんだか懐かしい。点数をシビアに出されるのは怖いけど、自分なんてまだまだだと痛感します。
運営もすごいなーと感動しました。こんだけちゃんとツール・環境整えるのは大変だったと思います。
決勝出られたらもっと精進したいっすね。やる気でる!!!

明日仕事……

…。

docker を Debian で動かす

更新

以下の記事は古いのでこちらを参照ください
dockerをDebianで動かす(2013-12-14版) - wtatsuru's blog

元記事

いろいろ試すのにちょっと前から docker を使っているので、手元のメモを適当に書いときます。
Homepage - Docker: the Linux container engine
Debianパッケージング用のスクリプトが完備されてるので make するだけ。すごい。

git clone https://github.com/dotcloud/docker.git
cd docker/packaging/debian
make debian

グループ追加

sudo addgroup --system docker
sudo adduser tatsuru docker

NATの設定やってくれないので iptables 設定。docker0から入ってくるのでファイアウォールはそんな感じで書いてやってください。

iptables -t nat -A POSTROUTING -s 172.17.0.0/24 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

あとは普通に動きます。lxc-docker ってなんか長いので docker にでも alias するとよいです。

lxc-docker help

/etc/init.d/lxc-docker を見ると cgroup を勝手にマウントしてくれるまわりなどなんだかなぁと思うので気になる人は外すか自分でマウントしておきましょう。

はてなで一緒に働きませんか?