2015年4月9日木曜日

大量データを持つRedisのレプリケーションを作るときにやったこと

Simon Berry THE PILOT | REPLICATION PLANNING https://www.flickr.com/photos/bezznet/5377561358
10GB超のデータを持つRedisのレプリケーションを作ろうとしたとき、通常の方法ではレプリケーションが構築できませんでした。
[2905] 03 Apr 11:19:11.050 # Client id=5243450 addr=10.10.10.10:58580 fd=10 name= age=68 idle=68 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16362 oll=9770 omem=252745360 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.
[2905] 03 Apr 11:19:11.150 # Connection with slave 10.10.10.10:6379 lost.
上記のようにRedisマスターのログにコネクションロストが出力されて。レプリケーションを再構築しようと何度もリトライがかかるようになり、レプリケーションが完了しない状態に陥りました。

この状況を回避するためにやったことは以下のようになります。
すべて、Redisマスターでの設定になります。

1)レプリケーションタイムアウトを伸ばしておく。
$ redis-cli CONFIG GET repl-timeout
1) "repl-timeout"
2) "60"
$ redis-cli CONFIG SET repl-timeout "1800" 
2)ディスクレスレプリケーションを有効にする。
$ redis-cli CONFIG GET repl-diskless-sync
1) "repl-diskless-sync"
2) "no"
$ redis-cli CONFIG SET repl-diskless-sync "yes" 
3)同期遅延の設定を0にする。
$ redis-cli CONFIG GET repl-diskless-sync-delay
1) "repl-diskless-sync-delay"
2) "5"
$ redis-cli CONFIG SET repl-diskless-sync-delay "0" 
4)client-output-buffer-limit slaveの値を無効化する。
$ redis-cli CONFIG GET client-output-buffer-limit
1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
$ redis-cli CONFIG SET client-output-buffer-limit "slave 0 0 0"

これらの設定をした後に、スレーブサーバでRedisを起動します。
レプリケーション構築の成功時のログは以下のようになります。

Redisマスター側のスレーブ構築成功のログ
[8590] 03 Apr 15:17:38.563 * Streamed RDB transfer with slave 10.10.10.10:6379 succeeded (socket). Waiting for REPLCONF ACK from slave to enable streaming
[8590] 03 Apr 15:18:51.758 * Synchronization with slave 10.10.10.10:6379 succeeded
Redisスレーブ側のスレーブ構築成功のログ
[3341] 03 Apr 15:11:30.839 * Full resync from master: f32b9311221a763966777e18e84c93d7389f4119:1
[3341] 03 Apr 15:11:31.469 * MASTER <-> SLAVE sync: receiving streamed RDB from master
[3341] 03 Apr 15:17:38.331 * MASTER <-> SLAVE sync: Flushing old data
[3341] 03 Apr 15:17:38.331 * MASTER <-> SLAVE sync: Loading DB in memory
[3341] 03 Apr 15:18:51.142 * MASTER <-> SLAVE sync: Finished with success

以下の資料を参考にしました。

Replication – Redis
http://redis.io/topics/replication

Top Redis Headaches for Devops – Replication Buffer
https://redislabs.com/blog/top-redis-headaches-for-devops-replication-buffer#.VR4z2JOUc4Q

Top Redis Headaches for Devops – Replication Timeouts
https://redislabs.com/blog/top-redis-headaches-for-devops-replication-timeouts#.VR4z2pOUc4Q