[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 succeededRedisスレーブ側のスレーブ構築成功のログ
[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