概要
Redisのレプリケーション設定にslave-read-only設定がある。
デフォルトはyesになっていてslaveにデータは書き込めないようになっている。
設定をnoにするとslaveにデータが書き込めるようになるがそのデータはそのslaveサーバーにしか存在しない状態になる。
その動きを確認した際のメモ。
検証した際のマスターとスレーブの構成は以下の通り
redis01 | master |
redis02 | slave |
redis03 | slave |
redis03(slave)
slave-read-only yesの状態
[tsunokawa@redis03 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379> 127.0.0.1:6379> set testkey6 testvalue6 (error) READONLY You can't write against a read only slave. 127.0.0.1:6379>
yesからnoに変更
slave-read-only yes
↓
slave-read-only no
これでredis03(slave)に書き込みができるようになった。
本当に書き込みができるか試してみる。
[tsunokawa@redis03 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379> 127.0.0.1:6379> set testkey6 testvalue6 OK 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 6) "testkey6" 127.0.0.1:6379>
書き込めた。
redis01(master)
[tsunokawa@redis01 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379>
redis02(slave)
[tsunokawa@redis02 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379>
当然redi01(master)ともう一つのスレーブサーバーのredis02(slave)には更新は反映されない。
先ほど無理やり書き込みを行ったredis03(slave)だけにsetした値
testkey6:testvalue6
同じキーで
testkey6:testvalue777
と値だけ変えたものをredis01(master)でsetした場合、redis03(slave)にだけ存在しているtestkey6:testvalue6
はどうなるのか確認した。
結果を先に書くとデータが上書きされた。
redis03(slave)
[tsunokawa@redis03 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 6) "testkey6" 127.0.0.1:6379> get testkey6 "testvalue6" 127.0.0.1:6379>
redis01(master)
[tsunokawa@redis01 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379>
testkey6
はまだ無い
redis02(slave)
[tsunokawa@redis02 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 127.0.0.1:6379>
testkey6
はまだ無い
この状態でredis01(master)から値をset
[tsunokawa@redis01 ~]$ redis-cli 127.0.0.1:6379> set testkey6 testvalue777 OK 127.0.0.1:6379> get testkey6 "testvalue777" 127.0.0.1:6379> 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 6) "testkey6" 127.0.0.1:6379>
レプリケーションされたため、redis02(slave)でも値が入った
[tsunokawa@redis02 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 6) "testkey6" 127.0.0.1:6379> get testkey6 "testvalue777" 127.0.0.1:6379>
redis03(slave)は上書きされた。
[tsunokawa@redis03 ~]$ redis-cli 127.0.0.1:6379> KEYS * 1) "testkey1" 2) "testkey2" 3) "testkey3" 4) "testkey4" 5) "testkey5" 6) "testkey6" 127.0.0.1:6379> 127.0.0.1:6379> get testkey6 "testvalue777" 127.0.0.1:6379>
よって同じキーがsetされると上書きされる。
特にエラーが出たりはしない。