More Related Content
Similar to 大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
Similar to 大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編) (20)
More from Akihiro Kuwano (20)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
- 2. 自己紹介
桑野章弘
サイバーエージェント
Ameba を運営しています。
- Blogを中心として様々なサービスがあります。
ピグライフの運用/構築を担当
Twitter
@kuwa_tw
Blog
http://d.hatena.ne.jp/akuwano/
著書/活動
「MySQLによるタフなサイトの作り方」
勉強会(hbstudy, qpstudyほか)などでの発表など
2
- 11. ピグライフのアーキテクチャ:全体構成
BackEnd
FrontEnd
ユーザ/エリ
ア等の状態
staticサーバ Node.jsサーバ
Socketサーバ
データ
mongodbサーバ
Flashデータ 必要なデータ
→リクエスト の取得
/取得
HTTP
WebSocket接続
・ユーザ情報
・チャット
データ
→リクエスト
/取得
ユーザ
(ブラウザ)
11
- 17. アーキテクチャの課題
開発スピードの構造
ユーザーコレクションに最終ログインタイムを追加し
たい場合
{
"_id" : "1234567889",
"userid" : "akuwano",
"username" : "Akihiro Kuwano"
}
17
- 18. アーキテクチャの課題
開発スピードの構造
ユーザーコレクションに最終ログインタイムを追加し
たい場合
{
"_id" : "1234567889",
"userid" : "akuwano",
"lastLoginTime" : ISODate("2011-12-25T14:22:46.777Z"),
"username" : "Akihiro Kuwano"
}
18
- 20. MongoDBの構成
Sharding
アプリケーションサーバ データをChunk ReplicaSetsに
の単位に分ける よりサーバの冗
⻑性を確保
DATA
mongos
Mongod[ShardA]
Mongod[ShardB]
mongoc
Mongod[ShardC]
20
- 21. MongoDBの構成
Sharding
アプリケーションサーバ データをChunk ReplicaSetsに
の単位に分ける よりサーバの冗
⻑性を確保
ChunkA ChunkB ChunkC
mongos
mongocは
Mongod[ShardA]
シャーディング
情報を持つ
Mongod[ShardB]
mongoc
ChunkA -> ShardA
ChunkB -> ShardB Mongod[ShardC]
ChunkC -> ShardC
21
- 22. MongoDBの構成
アプリケーションサーバ ReplicaSetsに
Sharding よりサーバの冗
データをChunk ⻑性を確保
の単位に分ける
mongos
mongocは
ChunkA Mongod[ShardA]
シャーディング
情報を持つ
ChunkB Mongod[ShardB]
mongoc
ChunkA -> ShardA
ChunkB -> ShardB ChunkC Mongod[ShardC]
ChunkC -> ShardC
22
- 31. 実運用での課題:サーバキャパプラ
サーバキャパプラ
mongod
DISK I/O:定期的に書きだすのである程度の性能が必要
- ioDriveで⾼速に処理することも可能だが、レプリケーションが
停止する可能性があるのでサーバ単体で使った方がioDriveの性
能を使い切ることができます
CPU:書き込みはグローバルロックが存在しているために、
複数コアを効率良く使えません
メモリ:Index、データをメモリにキャッシュするため多け
れば多いほどよいです
アクセスが多岐に渡る場合にはIndexがメモリから溢れてし
まうので、パフォーマンスが落ちる。その場合ページフォル
トが⼤量に発生し始めるのでそれが目安
31
- 32. 実運用での課題:運用面
index
特定のカラムで検索を⾏う場合にはindexを貼る事で⾼速化を
図ります
2.0系でIndexが⾼速化 & コンパクト化されているので
Indexを多用する場合はバージョンアップする
32
- 33. 実運用での課題:運用面
Index
Indexの確認->explain() Indexなし
replSetTest1001:PRIMARY> db.User.find({'Field02': 'test'}).explain()
{
{"_id" : "1234567889",
"cursor" : "BasicCursor",
"userid" : "akuwano",
"nscanned" : 706456,
"username" : "Akihiro Kuwano"
} "nscannedObjects" : 706456,
"n" : 1,
"millis" : 749,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
33
- 34. 実運用での課題:運用面
Index
Indexの確認->explain() Indexあり
replSetTest1001:PRIMARY> db.User.find({'Field01': 'test'}).explain()
{
"cursor" : "BtreeCursor testIndex_1",
{ "nscanned" : 1,
"_id" : "1234567889", : 1,
"nscannedObjects"
"userid" : "akuwano",
"n" : 1,
"username": :7,
"millis" "Akihiro Kuwano"
} "nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"Field01" : [
[
"test",
"test"
]
]
}
}
34