redis的主從複製(讀寫分離)、哨兵(主從切換)配置
當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。redis提供了一個master,多個slave的服務。
準備三個redis服務,依次命名資料夾子master,slave1,slave2.這裡為在測試機上,不干擾原來的redis服務,我們master使用6000埠。
配置檔案(redis.conf):
master配置修改埠:
port 6000 requirepass 123456
(PS:最好加上:masterauth 123456 ,便於master宕機切換為slave時,無需另修改配置
slave1修改配置:
1 2 3 4 5 6 7 |
|
slave2修改配置:
1 2 3 4 5 6 7 |
|
requirepass:是認證密碼,應該之後要作主從切換,所以建議所有的密碼都一致。masterauth是從機對主機驗證時,所需的密碼(即主機的requirepass)。
啟動主機:
1 |
|
啟動從機:(PS:後臺啟動要把daemonize改為yes)
redis-server redis1.conf redis-server redis2.conf
我這裡遇到一個報錯:(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
原因:強制關閉Redis快照導致不能持久化。
解決方法:127.0.0.1:6379> config set stop-writes-on-bgsave-error no
產看啟動程序,輸入:
ps -ef |grep redis
root 6617 1 0 18:34 ? 00:00:01 redis-server *:6000 root 6647 1 0 18:43 ? 00:00:00 redis-server *:6001 root 6653 1 0 18:43 ? 00:00:00 redis-server *:6002 root 6658 6570 0 18:43 pts/0 00:00:00 grep redis
可以看到主,從機的redis已經相應啟動。
我們來驗證下主從複製:
master:
1 2 3 4 5 |
|
slave1:
1 2 3 4 5 |
|
slave2:
1 2 3 4 5 |
|
可以看到主機執行寫命令,從機能同步主機的值,主從複製,讀寫分離就實現了。
PS:若主從複製不成功,從庫報錯:Opening the temp file needed for MASTER <-> SLAVE synchronization: Permission denied
原因:多半是因為從庫上啟動redis-server時不是root使用者啟動,而普通使用者無法對redis目錄進行寫操作,導致無法在redis安裝目錄產生dump.rdb
解決方法:
1、從庫上用root啟動redis
2、更改redis安裝目錄為啟動使用者可寫
但是萬一主機掛了怎麼辦,這是個麻煩事情,所以redis提供了一個sentinel(哨兵),以此來實現主從切換的功能,類似與zookeeper。
Redis哨兵(sentinel)實現主從切換:
我們配置兩個sentinel程序:
(1)
vi sentinel.conf
1 2 3 4 5 6 |
|
(2)
1 |
|
1 2 3 4 5 |
|
啟動sentinel服務(到對應的目錄執行相應的命令):
1 |
|
檢視日誌:
[7014] 11 Jan 19:42:30.918 # +monitor master mymaster 127.0.0.1 6000 quorum 2 [7014] 11 Jan 19:42:30.923 * +slave slave 127.0.0.1:6002 127.0.0.1 6002 @ mymaster 127.0.0.1 6000 [7014] 11 Jan 19:42:30.925 * +slave slave 127.0.0.1:6001 127.0.0.1 6002 @ mymaster 127.0.0.1 6000
從對應的日誌觀察到,一個master服務,兩個slave服務。
我們現在來kill master程序
1 2 3 4 5 6 7 8 |
|
我們觀察日誌:
1 2 |
|
master切換了,當6000埠的這個服務重啟的時候,他會變成6001埠服務的slave。
因為sentinel在切換master的時候,會把對應從庫的sentinel.conf和redis.conf檔案的配置修改。
期間我們還需要關注的一個問題:sentinel服務本身也不是萬能的,也會宕機,所以我們還得部署sentinel叢集,象我這樣多啟動幾個sentinel。
注意這個配置:
1 |
|