re:InventでのParseのDevOps話がとても良かったのでまとめておく
今、AWS re:Inventにきていて、今日parse.comのセッションを聴く時間があったので簡単にまとめておく。とてもざっくり書くと、要点は
- parseは1-3段階のDevOpsの進化を経てきた
- 最初はRoRでデプロイするにも全てのサーバでcapistorano走らせなければ行けなかった。結果として90分から150分くらいデプロイに時間が掛かる。
- 現在はAutoScalingGroupとChefがシームレスに連携していて、5-10分でシステムをフルビルドできるようになった。
ということ。
セッションの概要は以下のとおり。
MBL307 - How Parse Built a Mobile Backend as a Service on AWS
Parse is a BaaS for mobile developers that is built entirely on AWS. With over 150,000 mobile apps hosted on Parse, the stability of the platform is our primary concern, but it coexists with rapid growth and a demanding release schedule. This session is a technical discussion of the current architecture and the design decisions that went in to scaling the platform rapidly and robustly over the past year and a half. We talk about some of the lessons learned managing and scaling MongoDB, Cassandra, Redis, and MySQL in the cloud. We also discuss how Parse went from launching individual instances using chef to managing clusters of hosts with Auto Scaling groups, with instance discovery and registry handled by ZooKeeper, thus enabling us to manage vastly larger sets of services with fewer human resources. This session is useful to anyone who is trying to scale up from startup to established platform without sacrificing agility.
Charity Majors - Production Engineering Manager, Parse
以下僕のとったメモ。
1.5年前
ops philosophy
- 我々はplatformだから
- 全てを自動化すべき
- 全員がfull stack engineerであり、ジェネラリストの小さいチーム
- DevOpsチームのゴール
- 80%の時間はやりたいことをやる
- 20%の時間はしなければいけないことをやる
- つまり、無駄を省いて、自動化していって、改善に時間を費やせるようにするということ
past and present
2013年にgoalを達成
takeaways
- ASGs are your best friend
- automation should be reusable
- choose your source of truth carefully
- puppet chef ansible
- chef
parse stack
- 基本的にデータはmongo
- cassandraもある
- elbのしたにnginxとhaproxy
infrastructure design
- chef
- route 53
- use real hostnames
- distribute evenly across 3 AZs
- 自動フェールオーバー
- single source of truth
EC2 design choises
- m1.large, m1.xlarge, m2.4xlarge
- multicoreであることが大事
- 小さいインスタンスもstatelessなサービスには使ってる
- security groups
- one group per role
- gitとnagiosを使ってセットが動くかどうかを確かめる
以下、markdownでメモるのがめんどくさかったのでツイートした内容。
parseのアーキテクチャに関するセッション始まった pic.twitter.com/34ePVGtvvf
— Kenta Suzuki (@suzu_v) 2013, 11月 15
"MBL307 - How Parse Built a Mobile Backend as a Service on AWS" 会場の4割くらいParseユーザだった
— Kenta Suzuki (@suzu_v) 2013, 11月 15
Parseチームのops方針。全員がfull stackなジェネラリストの小さなチーム。とことん自動化。ゴール: 80%の時間はやりたいことに、20%だけしなければいけないことに使う。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
"Automation should be reusable" #reinvent
— Kenta Suzuki (@suzu_v) 2013, 11月 15
parseのapi。ELBの下にnginxとhaproxy。app serverはunicorn。Goで書いたapi serverが本体。FacebookへのloggingもGoで。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
hostingはelbとelastic ipによるapex domain redirect。また、Goのredirectを利用している。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
Cloud codeサービスはJavaScriptでかかれている。Scrub IPs with squid。これもhaproxyがフロントに置かれている。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
third-partyのモジュールを叩くのはここ。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
push通知はResqueをredisで。700 secを保つようにしている。1ヶ月にbillionのpush。spike時は10k / sec。PPNSは全てのandroidのサービスについてソケットをオープンにしている。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
redisがあらゆる端末へのpushについて集約するような校正になっている
— Kenta Suzuki (@suzu_v) 2013, 11月 15
s/校正/構成
— Kenta Suzuki (@suzu_v) 2013, 11月 15
AWSでのデータベース選びはまだやっぱり難しい。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
MongoDB!
— Kenta Suzuki (@suzu_v) 2013, 11月 15
12 replica sets, ~ 50 notes, 2-4TB per rs. Over 1M collections, Over 170k schemas. Autoindexing of keys based on entropy.
— Kenta Suzuki (@suzu_v) 2013, 11月 15
PIOPS (stripied RAID, 2000-8000 PIOPS/vol), Fully instrumented provisioning with Chef
— Kenta Suzuki (@suzu_v) 2013, 11月 15
アプリケーションレベルでshardingもしてる
— Kenta Suzuki (@suzu_v) 2013, 11月 15
s/notes/nodes
— Kenta Suzuki (@suzu_v) 2013, 11月 15
1M collectionってどういう運用なんだろ。application単位かな。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
Redisはqueingのために。シングルスレッドで利用。今ElastiCacheのredisを検証中。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
MySQLも使ってる。RDSも検証してるけど… AZ failoverはいいよねという話。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
CassandraはParseの解析のフロントとして利用している。12node, m2.4xlarge。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
Priamとの組み合わせでも使っている。ここはASGで。SimpleDBにトラッキングのためのトークンを入れている。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
初期のparse。RoR。chefでAMIをビルド。サービスごとにchef roleを設定。デプロイはcapistrano。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
但し実際は手で書き換える部分が多かったりして大変なことになってた。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
knife-ec2を20回走らせて、capistranoのファイル編集して、yml書きなおして、、、。デプロイ後はすべてのサービスをrestart刷る必要があった。全部で1.5-2.5時間かかっていた。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
問題は面倒を見るのが大変なことだった。サーバのリストも手で管理していた。人間にとって読みづらいhost名だった。また、1ノードにデプロイするのにfull codeをデプロイする必要があった。そして人間が細かい方法を知らないとデプロイ出来なかった。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
なので、環境を書き換えた。(第二世代)chefによってシステムを設定し、hostのリストを生成していた。実態を示すのはgit上のプロダクトコードではなくchefになった。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
結果として30-60分でデプロイできるようになったらしい。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
primaryなゴール: 度のサービスも5分位内にスケールアップできること、新しいノードを自動的にdetectし、downしたノードを自動的にremoveすること。どこであれ手でlistを管理しないこと。AMIはビルドに時間がかかるので極力避ける。goバイナリによるデプロイを試す
— Kenta Suzuki (@suzu_v) 2013, 11月 15
ASG周り。全てのグループがASGに入っている。Base AMIをchefで作成する。システム状態chefで管理。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
あーこれいいな。"ASG名からchefロールを推測""ビルド済みファイルをs3から落とす" -> デプロイ
— Kenta Suzuki (@suzu_v) 2013, 11月 15
parse, ZooKeeper使ってるのか。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
zookeeperでいうDistributed lockingって何のことだろ
— Kenta Suzuki (@suzu_v) 2013, 11月 15
parseの第三世代のインフラ。goを部分的に採用。chefで状態を管理。ASGごとにchef role。capistrano + zk jenkins + s3でのデプロイ。これで5-10分で全てデプロイできるように。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
parseでのASG利用。cloudwatchのメトリクスによるトリガーは最低限。burstパターンが短期間すぎるので反応しないため。ASGをいいかんじにdownsizeするツールが必要。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
今後について。全てVPC環境への移行。redisとmysqlを自動でフェイルオーバーすること。rubyを取り除いたらcapistranoも取り除く。これでauto-deployを全てに適用出来る。すごいな…
— Kenta Suzuki (@suzu_v) 2013, 11月 15
"source of truth"というのをなんと表現すればいいんだろうか。こんなにいい感じにautoscaling使っている事例初めて聴いたかもしれない。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
このparseのスピーカーのエンジニアの人、めっちゃ楽しそうに発表するので見ていて楽しい
— Kenta Suzuki (@suzu_v) 2013, 11月 15
goのバイナリはJenkinsでビルドしてS3へ。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
DynamoDBを使わないの? -> 詳細は教えられないけど、MongoDBでいまはハッピーですよ、とのこと。
— Kenta Suzuki (@suzu_v) 2013, 11月 15
会場からMongoDBへのツッコミが多々あるのは日米共通っぽい
— Kenta Suzuki (@suzu_v) 2013, 11月 15
所感
発表されていたCharityさんがとても楽しそうにDevOpsについて話されていた。なかでもMongoDBのchefによるprovisioningの話や、autoscaling groupをchefのroleとマッチさせて管理しているという話は実践的で面白かった。それと、amiをbuildするのはやはり時間がかるので、極力同じamiを使うようにしたいと言っていた。これはAWSを使うデプロイではとても頭を悩ませる所だと僕らも感じているところ。ただ、immutableなinfrastructureを構成する上ではこのあたりはさけて通れないところだし、parseがGoを利用すること(そして将来的にはGoに完全移行するかもしれないような雰囲気だったこと)はそういう点で理にかなっていると思った。MongoDBについても柔軟性の面からparseにはフィットしたんだと思う。DynamoDBではやはりMBaaSとしてあらゆるクライアントのスキーマに対応するのは厳しい。パフォーマンスもどこかで犠牲になるか、データのスキーマをいい感じに制限するかどちらかになると思うので、その辺のトレードオフを勘案してMongoDBを採用したというような話だった。また、MongoDBについてもProvisioningレイヤーがしっかりと整備されているのは好感が持てた。shardingも利用していて、特定のcollectionだけが肥大化する傾向にあるらしく、そのあたりをうまくわけるような形で管理するようにしているらしい。
ともあれ、1時間のセッションなのに随分と内容が濃かった。良いセッションだった。