はじめに
他のRedis構築に関するページは以下をご参考ください。
Redis構築のまとめ
参考)http://memocra.blogspot.jp/2013/01/redis.html
レプリケーションとは、マスタに書き込んだデータをスレーブにコピーすることで、
書き込みはマスタ、読み取りはスレーブと担当を分けることで負荷を分散させる。
読み取りにはマスタも参加することもある。
環境
CentOS 6.8
Redis 3.2.5(当時の安定バージョン)
検証方法
クラスタ構成では各サーバの設定が必要なので、2台のマスター/スレーブ構成で検証する
構成
IPアドレス | 役割 | ポート番号 |
---|---|---|
192.168.56.111 | master | 6379 |
192.168.56.112 | slave | 6379 |
検証結果
・マスターが落ちると機能しなくなる
・スレーブはマスターに昇格しない
・マスターは書き込み専用・スレーブは読み込み専用で使用する
クラスタ構成と比べて
・クラスタはマスターが1台落ちるとそこでsetした値はgetできなくなる
→Redisからのデータ参照時に不整合が起きる可能性がある
・レプリケーションの場合はマスターが落ちたとしても、マスターでsetした値はスレーブから参照することができる
・データ不整合を考慮しなければクラスタ構成の方が負荷分散・可用性が高い
検証内容詳細
Redisの設定ファイルを修正する
設定するのはslave側の「192.168.56.112」
$ vim /etc/redis/6379.conf
slaveof 192.168.56.111 6379
※この時、cluster-enableはnoにしておくこと
マスターで値をsetする
マスター/スレーブを起動してマスターで値をsetする
$ service redis start
$ redis-cli -h 192.168.56.111
192.168.56.111:6379>set num1 1
OK
その後スレーブで値をgetしてみる
$ redis-cli -h 192.168.56.112
192.168.56.112:6379>get num1
"1"
マスターでsetした値がスレーブにも反映されている
マスターを落とす
マスターを落としてみる。
落とす方法はserviceコマンドでredisを停止したり、サーバ毎落としても可
192.168.56.112:6379> get num2
"2"
192.168.56.112:6379> set num3
(error) ERR wrong number of arguments for 'set' command
マスターが落ちてもスレーブでgetはできる。ただしsetは読み取り専用のためできない
→クラスタのようにマスターに昇格はされない
マスターが復活すると問題なくマスター/スレーブの関係に戻る
スレーブを落とす
スレーブを落としてからマスターでsetを行う
192.168.56.111:6379> set num3 3
OK
その後スレーブを復活させてgetする
192.168.56.112:6379> get num3
"3"
問題なくgetすることができた。
※なお、スレーブが落ちる→マスターでnum5をset→マスターが落ちる→スレーブ復活→スレーブでnum5をgetしてもマスターでsetした値は取り出せない(マスターが復活すればnum5をgetできるようになる)