[大図解]ピグライフはこう動いている

25,681 views
25,470 views

Published on

Published in: Technology
0 Comments
26 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
25,681
On SlideShare
0
From Embeds
0
Number of Embeds
8,872
Actions
Shares
0
Downloads
0
Comments
0
Likes
26
Embeds 0
No embeds

No notes for slide

[大図解]ピグライフはこう動いている

  1. 1. [ 大図解 ] ピグライフはこう動いている 株式会社サイバーエージェント アメーバ事業本部プラットフォームディビジョン システムディベロップメントグループ CA Developers Connect                       桑野 章弘
  2. 2. <ul><li>桑野章弘 </li></ul><ul><ul><li>インフラエンジニア </li></ul></ul><ul><ul><ul><li>アメーバピグの運用/構築を担当 </li></ul></ul></ul><ul><ul><ul><li>ピグライフの運用/構築を担当 </li></ul></ul></ul><ul><ul><li>Twitter </li></ul></ul><ul><ul><ul><li>http:// twitter.com/kuwa_tw </li></ul></ul></ul><ul><ul><li>Blog </li></ul></ul><ul><ul><ul><li>http:// d.hatena.ne.jp/akuwano / </li></ul></ul></ul><ul><ul><li>著書/活動 </li></ul></ul><ul><ul><ul><li>「 MySQL によるタフなサイトの作り方」 </li></ul></ul></ul><ul><ul><ul><li>勉強会( hbstudy, qpstudy ほか)などでの発表など </li></ul></ul></ul>自己紹介
  3. 3. ピグライフ
  4. 4. ピグライフ <ul><li>会員数 </li></ul><ul><ul><li>開始 3 週間で 100 万人あげあげ </li></ul></ul><ul><li>トラフィック </li></ul><ul><ul><li>1.3Gbps </li></ul></ul><ul><li>同時接続数 </li></ul><ul><ul><li>120000 conn </li></ul></ul>
  5. 5. ピグライフ <ul><li>システム構成 </li></ul><ul><ul><li>どのようになっているか </li></ul></ul><ul><li>あったこと </li></ul><ul><ul><li>どんなことがあったか </li></ul></ul>
  6. 6. ピグライフのアーキテクチャ [ リリース直後 ] <ul><li>アーキテクチャ概要 </li></ul>
  7. 7. ピグライフのアーキテクチャ [ リリース直後 ] <ul><li>アプリケーション </li></ul><ul><ul><li>Node.js </li></ul></ul><ul><ul><li>websocket </li></ul></ul><ul><li>データストア </li></ul><ul><ul><li>mongoDB </li></ul></ul>
  8. 8. ピグライフのアーキテクチャ[現在] <ul><li>アプリケーション </li></ul><ul><ul><li>Node.js </li></ul></ul><ul><ul><li>websocket (外から) </li></ul></ul><ul><ul><li>Socket 通信(内部通信) </li></ul></ul><ul><li>データストア </li></ul><ul><ul><li>mongoDB </li></ul></ul><ul><li>静的ファイル </li></ul><ul><ul><li>nginx </li></ul></ul>
  9. 9. ピグライフのアーキテクチャ [ リリース直後 ] <ul><li>アーキテクチャ構成 </li></ul>
  10. 10. アーキテクチャ構成 <ul><li>アメーバピグを基本としている </li></ul><ul><ul><li>Webサーバ </li></ul></ul><ul><ul><li>ソケットサーバ </li></ul></ul><ul><ul><li>DBサーバ </li></ul></ul><ul><li>アメーバピグと比べてアーキテクチャはシンプルになっている </li></ul>
  11. 11. アーキテクチャ構成[アメーバピグ] Web+AP サーバ Socket サーバ Storage サーバ DB サーバ KVS サーバ HTTP 独自プロトコル Socket サーバ ユーザ (ブラウザ) FrontEnd BackEnd Flash データ リクエスト / 取得 ・ユーザ情報 ・チャットデータ ・ゲームデータ リクエスト / 取得 必要なデータの取得 ユーザの Flash データの保存など ユーザ / エリア等の状態データ ユーザ / エリア等の状態データ(現在は無)
  12. 12. アーキテクチャ構成[ピグライフ] stat サーバ Socket サーバ mongodb サーバ HTTP WebSocket 接続 Node.js サーバ ユーザ (ブラウザ) FrontEnd BackEnd Flash データ -> リクエスト / 取得 ・ユーザ情報 ・チャットデータ -> リクエスト / 取得 必要なデータの取得 ユーザ / エリア等の状態データ
  13. 13. ピグライフのアーキテクチャ [ リリース直後 ] <ul><li>サーバ構成 </li></ul>
  14. 14. リリース前構成 Stat サーバ Node.js サーバ MongoDB Log MongoDB ×6 行動ログの保存 mongos テストオープン時に実装
  15. 15. リリース時構成 Stat サーバ Node.js サーバ MongoDB Log MongoDB ×41 行動ログの保存 サーバにも取得 1 シャード追加 大量追加 mongos
  16. 16. リリース時構成 Stat サーバ Node.js サーバ MongoDB Log MongoDB ×41 行動ログの保存 サーバにも取得 1 シャード追加 大量追加 mongos ×3
  17. 17. 現在時構成 Stat サーバ Node.js サーバ MongoDB Log MongoDB ×41 行動ログの保存 サーバにも取得 3 シャード追加 ( 合計 7 シャード ) 大量追加 mongos ・・・・・ ×3
  18. 18. node.js サーバ : アーキテクチャ <ul><li>サーバサイド js を動かすためのサーバ </li></ul><ul><li>Google の v8 エンジンを使用している </li></ul>
  19. 19. node.js サーバ : アーキテクチャ <ul><li>選定理由 </li></ul><ul><ul><li>event 駆動なので同時接続に強い </li></ul></ul><ul><ul><li>Javascript の mongodb との相性の良さ </li></ul></ul><ul><ul><li>WebSocket との相性の良さ </li></ul></ul>
  20. 20. node.js サーバ : アーキテクチャ <ul><li>Node.js は 1CPU に 1 プロセスをとりっぱなしになるので、 Core 数分のプロセスを上げている </li></ul><ul><li>node.js mongodb driver が鬼門 </li></ul>
  21. 21. node.js サーバ:クラスタ構成 <ul><li>各 node.js サーバは冗長確保のためクラスタ構成 </li></ul><ul><li>クラスタは一度作り直している </li></ul><ul><ul><li>旧 cluster は Gossip で通信できるものだったが起動に時間がかかるため mongodb-Socket 版を作成される </li></ul></ul>
  22. 22. node.js サーバ:旧クラスタ構成 Nap サーバ 各サーバでの通信 リング間での通信 Nap サーバ Nap サーバ Nap サーバ サーバ 1   OK サーバ 2   OK サーバ 3   NG サーバ 4   OK サーバ 1   OK サーバ 2   OK サーバ 3   NG サーバ 4   OK
  23. 23. node.js サーバ:現クラスタ構成 Nap サーバ 各サーバの状態は mongodb 側に持つ Nap サーバ Nap サーバ MongoDB 各サーバの死活監視は相互に行う サーバ 1   OK サーバ 2   OK サーバ 3   NG サーバ 4   OK
  24. 24. 静的配信サーバ <ul><li>Nginx を使用 </li></ul><ul><li>各 swf はそれほど量はないので共有ディスクなどはまだ使用していない </li></ul>
  25. 25. 静的配信サーバ:着せ替えサムネイル <ul><li>更新 </li></ul><ul><ul><li>各静的配信サーバへ WebDAV で配信 </li></ul></ul><ul><ul><li>冗長化は heartbeat を使用 </li></ul></ul>
  26. 26. 静的配信サーバ:着せ替えサムネイル stat サーバ stat サーバ stat サーバ WebDAV でアップロード heartbeat
  27. 27. mongodb サーバ <ul><li>Document 志向 DB と呼ばれる種類の NoSQL サーバ </li></ul><ul><li>クエリが js の形式で書かれ、データベースも JSON で表現される事が特徴 </li></ul><ul><li>冗長、スケーラビリティの確保をやってくれる </li></ul><ul><ul><li>レプリカ復旧 </li></ul></ul><ul><ul><li>シャーディング </li></ul></ul><ul><ul><li>生死判別と冗長化 </li></ul></ul><ul><ul><li>負荷分散 </li></ul></ul><ul><ul><ul><li>今の所(バグはあるが)想定どおりには動いているイメージ </li></ul></ul></ul><ul><ul><ul><li>運用負荷自体は低い </li></ul></ul></ul>
  28. 28. mongodb サーバ:アーキテクチャ <ul><li>選定理由 </li></ul><ul><ul><li>運用負荷が軽い </li></ul></ul><ul><ul><li>スケールしやすい </li></ul></ul><ul><ul><li>冗長も取りやすい </li></ul></ul><ul><ul><li>Node.js との相性はいい </li></ul></ul><ul><ul><li>スキーマレスなので構成変更が簡単 </li></ul></ul><ul><ul><ul><li>スキーマ構成は何度か変更している </li></ul></ul></ul><ul><ul><li>データの保全性は低い </li></ul></ul><ul><ul><ul><li>アプリでの対応 </li></ul></ul></ul><ul><ul><ul><li>加えてバックアップの取得はこまめに必要 </li></ul></ul></ul>
  29. 29. mongodb サーバ:バックアップ・リストア <ul><li>mongodump </li></ul><ul><ul><li>1.8.1 では mongos 経由で mongodump が取れなかったが、 1.8.2 では取れる </li></ul></ul>バックアップサーバ MongoDB mongos mongodump mongodump -v --host 127.0.0.1 --port 27020 --out /backup/mongodb/data/testdatabase バックアップ
  30. 30. mongodb サーバ:バックアップ・リストア <ul><li>mongorestore </li></ul><ul><ul><li>同様に mongos 経由で mongorestore コマンドを投げる事で Sharding 構成でレストア可能 </li></ul></ul>バックアップサーバ MongoDB mongos mongorestore mongorestore -v --host 127.0.0.1 --port 27020 --db testdatabase --drop /backup/mongodb/data/testdatabase/ リストア
  31. 31. mongodb サーバ:バックアップ・リストア <ul><li>fsync </li></ul><ul><ul><li>fsync コマンドでライトのロックをかけてファイル単位でのバックアップも可能 </li></ul></ul>use admin switched to db admin > db.runCommand({fsync:1,lock:1}) ロック > db.$cmd.sys.unlock.findOne(); アンロック
  32. 32. mongodb サーバ:いろんな問題 <ul><li>障害ポイント </li></ul><ul><ul><li>RAID カードの性能 </li></ul></ul><ul><ul><ul><li>I/O 性能が要らないわけではない </li></ul></ul></ul><ul><ul><li>Chunk が偏る </li></ul></ul><ul><ul><ul><li>手動移動 </li></ul></ul></ul><ul><ul><ul><li>( export -> import) </li></ul></ul></ul><ul><ul><li>Mongos の自動 Chunk 認識がされない </li></ul></ul><ul><ul><ul><li>修正予定らしい </li></ul></ul></ul><ul><ul><li>Collection の分割 </li></ul></ul><ul><ul><ul><li>クエリの最適化とからめて </li></ul></ul></ul><ul><ul><li>Config サーバの書き換え </li></ul></ul><ul><ul><ul><li>泥臭い運用 </li></ul></ul></ul>
  33. 33. その他 <ul><li>サーバ構築 </li></ul><ul><ul><li>サーバ構築は全面的に、 PXE + Chef での構築に移行中 </li></ul></ul><ul><ul><li>各サーバへの一括処理は、 tomahawk (社内謹製 ssh ラッパー : https:// github.com/oinume/tomahawk )を使用 </li></ul></ul><ul><ul><li>継続的インテグレーションツールは Jenkins 先生で。 </li></ul></ul>
  34. 34. まとめ <ul><li>Node.js と mongodb のサービスではかなり国内含めて大規模サービスになっているのではないかと思います、、、 </li></ul><ul><li>今後も色々ノウハウ公開とかしていけたらと思います ! </li></ul>
  35. 35. まとめ <ul><li>ご清聴ありがとう </li></ul><ul><li>ございました </li></ul>

×