Redis:レプリケーション設定

Redis のレプリケーション設定についてメモ

公式ドキュメント http://redis.io/topics/replication

Redis のレプリケーション

  • マスターは複数のスレーブをもてる
  • スレーブは別のスレーブの親になれる
  • マスター/スレーブのレプリケート処理はノンブロッキング
  • スレーブは writable (2.6 からは slave-read-only 設定が追加され、デフォルトは read-only)

スレーブの用意
スレーブ用 redis サーバーを起動する。同じサーバ内に起動するのであれば、ポートを変更する必要がある。
redis.conf の port を修正すること。

スレーブ設定方法

confファイルでの設定
redis.conf にマスターの情報を記述する

slaveof <masterip> <masterport>
 ex)
 slaveof 192.168.8.10 6379

CLIでの設定
redis-cli 経由で slaveof コマンドにより設定することも可能

redis 127.0.0.1:9999> slaveof localhost 6379
OK

レプリケーションの確認
info コマンドでステータスを確認できる。

マスター側の確認

マスターに2台のスレーブがぶら下がっている場合の出力例は以下

$ redis-cli info
 redis_version:2.4.7
 ...
 connected_slaves:2
 ...
 vm_enabled:0
 role:master
 slave0:127.0.0.1,36434,online
 slave1:127.0.0.1,36441,online
 ...

スレーブ側の確認

role が slave になっており、マスターの情報を確認できる

$ redis-cli info
 redis_version:2.4.7
 ...
 connected_slaves:0
 ...
 vm_enabled:0
 role:slave
 master_host:localhost
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:3
 master_sync_in_progress:0
 ...

master_last_io_seconds_ago はマスターからコマンド(PING 含む)を受け取ってからの秒数。redisClient->lastinteraction フィールドに保持されており、レプリケート専用というわけではなく、クライアントのタイムアウトチェックにも利用されている(networking.c)。

スレーブからマスターの昇格
Redis 2.4 ではフェイルオーバーの仕組みはない。
スレーブをマスターに昇格するには、マスターを停止し、手動でスレーブ設定を無効化する必要がある。

ref : http://redis.io/topics/admin

スレーブ設定の無効化

slaveof コマンドを利用する。無効にしたあとは info の出力結果 role が master に変更されています。

redis 127.0.0.1:9999> slaveof NO ONE
 OK
 redis 127.0.0.1:9999> info
 redis_version:2.4.7
 ...
 vm_enabled:0
 role:master
 ...

ヘルスチェック

スレーブは redis.conf の repl-ping-slave-period の間隔(デフォルトは10秒)でマスターに PING コマンドを送信している。

PING 送信していることは monitor コマンドで確認できる

redis 127.0.0.1:9999> monitor
 OK
 1329549788.726369 "monitor"
 1329549798.046136 "PING"
 1329549808.066132 "PING"
 1329549818.086138 "PING"
 1329549828.096214 "PING"

master がダウンしている場合に info を確認すると master_link_status が down になり, master_last_io_seconds_ago は -1 となる。またダウンの場合のみダウン後の経過秒数が master_link_down_since_seconds で表示される。

redis 127.0.0.1:9999> info
 ...
role:slave
master_host:localhost
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
master_link_down_since_seconds:13
 ...

Documentation:topics/replicationにもあるように、リンクアップ後は差分同期ではなくフル同期がかかるので注意が必要。

When a master and a slave reconnects after the link went down, a full resync is performed.

マスタとスレーブの同期チェック
レプリケーションの動作が怪しい時に、マスタとスレーブで同期がとれているか確認したい場合、 DEBUG DIGEST コマンドを使うと便利。SHA1 でデータベースのハッシュ値を計算してくれる。ただし、このコマンドはブロックするので注意が必要。さらには、高頻度で書き込みが発生する現場ではハッシュ値が一致するタイミングを捕まえるのは難しい気がする。

redis 127.0.0.1:6379> debug digest
6dc902b2ce5533c6e4bf52318e918167c77c58b3
(6.48s)
Advertisements
Tagged with: ,
Posted in database

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: