當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務當機,導緻應用當機的情況,我們啟用sentinel(哨兵)服務,實作主從切換的功能。
redis提供了一個master,多個slave的服務。
準備三個redis服務,依次命名檔案夾子master,slave1,slave2.這裡為在測試機上,不幹擾原來的redis服務,我們master使用6000端口。
配置檔案(redis.conf)
master配置修改端口:
port 6000
requirepass 123456
slave1修改配置:
port 6001
slaveof 127.0.0.1 6000
masterauth 123456
requirepass 123456
slave2修改配置:
port 6002
slaveof 127.0.0.1 6000
masterauth 123456
requirepass 123456
requirepass是認證密碼,應該之後要作主從切換,是以建議所有的密碼都一緻, masterauth是從機對主機驗證時,所需的密碼。(即主機的requirepass)
啟動主機
redis-server redis.conf
啟動從機:
redis-server redis1.conf
redis-server redis2.conf
輸入:
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:
[root@localhost master]# redis-cli -p 6000
127.0.0.1:6000> auth 123456
OK
127.0.0.1:6000> set test chenqm
OK
slave1:
[root@localhost slave2]# redis-cli -p 6001
127.0.0.1:6001> auth 123456
OK
127.0.0.1:6001> get test
"chenqm"
slave2:
[root@localhost slave2]# redis-cli -p 6002
127.0.0.1:6002> auth 123456
OK
127.0.0.1:6002> get test
"chenqm"
可以看到主機執行寫指令,從機能同步主機的值,主從複制,讀寫分離就實作了。
但是萬一主機挂了怎麼辦,這是個麻煩事情,是以redis提供了一個sentinel(哨兵),以此來實作主從切換的功能,類似與zookeeper.
我們配置兩個sentinel程序:
vi sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel auth-pass mymaster 123456
vi sentinel.conf
port 26479
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel auth-pass mymaster 123456
啟動sentinel服務(到對應的目錄執行相應的指令):
redis-server sentinel.conf --sentinel
檢視日志:
[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程序
[root@localhost slave1]# ps -ef|grep redis
root 6960 1 0 19:29 ? 00:00:02 redis-server *:6000
root 6968 1 0 19:30 ? 00:00:01 redis-server *:6001
root 6975 1 0 19:30 ? 00:00:01 redis-server *:6002
root 7014 6570 0 19:42 pts/0 00:00:01 redis-server *:26479
root 7017 6789 0 19:42 pts/5 00:00:01 redis-server *:26379
root 7021 6729 0 19:46 pts/3 00:00:00 grep redis
[root@localhost slave1]# kill -9 6960
我們觀察日志:
[7014] 11 Jan 19:43:41.463 # +sdown master mymaster 127.0.0.1 6000
[7014] 11 Jan 19:46:42.379 # +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001
master切換了,當6000端口的這個服務重新開機的時候,他會變成6001端口服務的slave。
因為sentinel在切換master的時候,把對應的sentinel.conf和redis.conf檔案的配置修改。
期間我們還需要關注的一個問題:sentinel服務本身也不是萬能的,也會當機,是以我們還得部署sentinel叢集,象我這樣多啟動幾個sentinel。
關注這個配置:
sentinel monitor mymaster 127.0.0.1 6000 2
這個後面的數字2,是指當有兩個及以上的sentinel服務檢測到master當機,才會去執行主從切換的功能。