メモメモ。泥臭い話で面白かったです。
「大規模Redisサーバ縮小化の戦い」
- 駒井 祐人 氏
- (株)アカツキ
- ゲームのサーバサイド機能開発、インフラの設計構築・保守運用
Redisとは
- インメモリDB
- 5種類のキーバリューのデータ型
- ファイル永続化オプション
システムの問題点
- EC2サーバが20台に対して、AWSのElasticCache(Redis)が64台あった
- なぜ64台あったかというと、リリース直後にRedisの負荷問題があり、8台 => 64台になった
- 調査するとkeys("")を実行している箇所があった
- 当然お金がかかる(cache.m3.large * 64台 = 約135万円/月)
- 冗長化しんどいし、設定ファイルの記載も辛い
- ので、縮小化と冗長化の対処をしたい
現状整理
- 格納されているデータ
- フレンド情報、セール情報、ランキング情報
- キーの件数
- 1サーバに8DB、1DBあたり7万〜40万件
- しかし各Redisで利用されていたのは1DBのみであった...(8=>64台にしたときにコピーして増やしてゴミが残ったままだった)
マージ方法の検討
- それっぽいツールがあったけど、makeできなかったので、自力で頑張ることに
- 案1: key/valueを全部抜き出すパターン
- 案2: dumpファイルを結合するパターン
- ヘッダとフッタをいじればなんとかなりそうだし、計算も案1より少なそうなのでこっちを採用
dumpの構造
- バイナリデータとなっている
- ヘッダが9バイト
- DB番号が2バイト
- その後、key/hashのデータが続いていく
- DB番号・・・データ・・・(繰返)
- 終端文字が1バイト
- checksumが8バイト
マージ方法
- まず要らないゴミを消す
- 最初のDBのヘッダをつけて、そのあとにデータをつなげていく
- 最後にchecksumを付与する
- checksumを無視するオプションもある
- redis-check-dumpを使って構造上問題ないか確認する
縮小化の流れ
- メンテナンス開始
- バックアップ
- EC2でRedisを動かして、リードレプリカとして設定して、dump出力する
- ゴミデータ削除
- マージ
- S3へ
- リストア
- S3のパスを指定して起動
- メンテナンス終了
失敗談
- バックアップ失敗
- ReadReplicaとして接続した際に、過去データをdlushされる前にsaveしても、正確にバックアップが取れない
結果
- かかった時間はトラブル含め4時間
- 縮小&冗長化した上に、135=>38万円/月へコスト削減
縮小後に発生した事象
- Redisのコネクション上限に達した
- APサーバ数 * Unicornのプロセス数 * DB数
- しかし、ElastiCacheの接続数上限は変更できない
- よって、今度はDB数を減らす必要がでてきた
再度マージ方法を検討
- 最初に検討した案1を採用(計算量は多いけど)
- しかし、応答が返ってこない、、、時間はかかる
- 複数サーバで並列に実行し、縮小することができた
- 作者: Eric Redmond,Jim R. Wilson,角征典
- 出版社/メーカー: オーム社
- 発売日: 2013/02/26
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 56回
- この商品を含むブログ (17件) を見る