redis的主從復制,哨兵值守
環境:
主服務器:192.168.10.10 Centos 7 redis-5.0.4
從服務器:192.168.10.129 Centos 7 redis-5.0.4
從服務器:192.168.10.130 Centos 7 redis-5.0.4
關於如何安裝redis不再本文討論範圍內,不過您可以參考https://www.cnblogs.com/caesar-id/p/10846541.html
1、自定義192.168.10.10主服務器配置文件
[[email protected] ~]# vim /etc/myredis.conf bind 192.168.10.10 //綁定本機IP地址 port 9000 // redis端口號 daemonize yes // 設置後臺啟動 pidfile /var/log/redis/myredis.pid // 指定redis進程文件位置,為了方便我就放在了日誌文件中,大家自行定義。 loglevel notice // 設置日誌等級 logfile /var/log/redis/myredis.log // 設置日誌文件 dbfilename dump.rdb dir /opt/redis-5.0.4/data/myredis // redis數據庫文件路徑 protected-mode no // 為了方便這裏關閉了安全模式,實際中應開啟次選項
註意這裏的路徑必須存在,redis沒有智能到幫你把路徑都創建好的,所以你需要自己創建上面所需要的文件路徑。
2、創建配置文件中對應的目錄
[[email protected] ~]# mkdir -p /var/log/redis // redis的日誌文件存放路徑 [[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis // 創建redis的數據庫存儲目錄
到此主服務器的配置已經算是初步完成。下面配置從服務器
3、自定義從服務器192.168.10.129配置文件
[[email protected] ~]# vim /etc/myredis.conf bind192.168.10.129 // 綁定本機IP地址 port 9001 // 為了和主服務器區分這裏使用9001 daemonize yes // 設置後臺啟動 pidfile /var/log/redis/myredis.pid // 指定redis進程文件位置,為了方便我就放在了日誌文件中,大家自行定義。 loglevel notice // 設置日誌等級 logfile /var/log/redis/myredis.log // 設置日誌文件 dbfilename dump.rdb dir /opt/redis-5.0.4/data/myredis // redis數據庫文件路徑 protected-mode no // 為了方便這裏關閉了安全模式,實際中應開啟次選項 slaveof 192.168.10.10 9000 // 主服務器的IP和端口
4、同樣創建配置文件中對應的路徑
[[email protected] ~]# mkdir -p /var/log/redis // redis的日誌文件存放路徑 [[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis // 創建redis的數據庫存儲目錄
此時從服務器192.168.10.129配置初步完成,下面配置從服務器192.168.10.30。
5、 自定義從服務器192.168.10.129配置文件
[[email protected] ~]# vim /etc/myredis.conf bind 192.168.10.130 // 綁定本機IP地址 port 9002 // 為了區分這裏使用9002 daemonize yes // 設置後臺啟動 pidfile /var/log/redis/myredis.pid // 指定redis進程文件位置,為了方便我就放在了日誌文件中,大家自行定義。 loglevel notice // 設置日誌等級 logfile /var/log/redis/myredis.log // 設置日誌文件 dbfilename dump.rdb dir /opt/redis-5.0.4/data/myredis // redis數據庫文件路徑 protected-mode no // 為了方便這裏關閉了安全模式,實際中應開啟次選項 slaveof 192.168.10.10 9000 // 主服務器的IP和端口
6、創建配置文件中對應的路徑
[[email protected] ~]# mkdir -p /var/log/redis // redis的日誌文件存放路徑 [[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis // 創建redis的數據庫存儲目錄
好了主從關系到此算是配置完成,下面我們進行驗證配置是否正確。
7、驗證主從配置
7.1開啟192.168.10.10主服務器的redis
[[email protected] ~]# redis-server /etc/myredis.conf
[[email protected] ~]# ps -ef | grep redis
如果你看到上圖說明我們的主服務器192.168.10.10中的redis已經運行起來了。
7.2開啟192.168.10.129從服務器的redis
[[email protected] ~]# redis-server /etc/myredis.conf
[[email protected] ~]# ps -ef | grep redis
非常幸運的跑起來了。
7.3開啟192.168.10.130從服務器的redis
[[email protected] ~]# redis-server /etc/myredis.conf
[[email protected] ~]# ps -ef | grep redis
一切都很順利。
7.4登陸192.168.10.10主服務器查看主從關系
[[email protected] ~]# redis-cli -p 9000 -h 192.168.10.10
希望你也能看到和上面一樣的信息。
7.5登陸192.168.10.129從服務器查看主從關系
[[email protected] ~]# redis-cli -p 9001 -h 192.168.10.129
7.6登陸192.168.10.130從服務器查看主從關系
[[email protected] ~]# redis-cli -p 9001 -h 192.168.10.129
7.7在主服務器添加一個鍵查看是否會同步到從服務器
上面雖然是實現了主從復制的功能,但是如果我們的主服務器突然掛了呢?我們知道從服務器是只讀的,沒有寫入的權限。我們來看下殺掉主進程會變成什麽樣子。
8、刪掉主服務器192.168.10.10的redis
9、查看從服務器狀態
上面的結果我確信並不是我們想要的,我們想要的是主服務器在突發情況下down後,有一臺從服務器能夠代替主服務器繼續工作。
這裏有兩種解決方案:
- 我們手動指定一臺從服務器為主服務器。
- 通過哨兵實現自動在從服務器中選舉出一個主服務器。
1、手動指定192.168.10.129為主服務器(關閉服務器的從服務器的角色)
[[email protected] ~]# redis-cli -p 9001 -h 192.168.10.129 192.168.10.129:9001> slaveof no one // 關閉從服務器角色
1.1、在192.168.10.130從服務器中指定主服務器是192.168.10.129
[[email protected] ~]# redis-cli -p 9002 -h 192.168.10.130 192.168.10.130:9002> slaveof no one // 關閉從服務器角色 192.168.10.130:9002> slaveof 192.168.10.129 9001 // 指定主服務器是192.168.10.129
1.2、最終查看配置如下
也許你會認為這種方式很low並且不智能,我也認為你說的是對的。
2、通過哨兵選舉,在從服務器中選擇一個從服務器作為主服務器。
2.1先停止所有主、從服務器的redis
[[email protected] ~]# pkill -9 redis
·2.2在主服務器192.168.10.10中添加哨兵的配置文件
[[email protected] ~]# vim /etc/myredis-sentinel.conf bind 192.168.10.10 // 綁定本機地址 port 9500 // 哨兵端口 dir "/opt/redis-5.0.4/data/myredis-sentinel" // 哨兵工作目錄 logfile "/var/log/redis/mysentinel.log" // 哨兵日誌文件位置 daemonize yes // 開啟守護進程 protected-mode no // 關閉安全模式
sentinel monitor myredis 192.168.10.10 9000 2 // myredis是主節點的別名,後面是主節點的IP地址及主節點redis的端口號,數字2表示判斷主節點是否down需要最少2個哨兵進行確認
sentinel down-after-milliseconds myredis 30000 // 每個哨兵會定期發送ping確認主節點是否可以連接,如果在3000毫秒沒有回復,就認為主節點不可達。
sentinel parallel-syncs myredis 1 // 當多個哨兵都認為主節點不可達時,主節點哨兵會做故障轉移。並選出一個新的主節點。這個數字越小故障轉移就越慢,但如果越大會導致多個從節點同時向新主機節點復制數據,導致數據不可用。
sentinel failover-timeout myredis 180000 // 故障轉移超時時間。
2.3創建哨兵的工作目錄
[[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis-sentinel
2.4添加從服務器192.168.10.129的哨兵配置文件
[[email protected] ~]# vim /etc/myredis-sentinel.con bind 192.168.10.129 // 綁定本機地址 port 9501 // 哨兵的端口號 dir "/opt/redis-5.0.4/data/myredis-sentinel" // 哨兵工作目錄 logfile "/var/log/redis/mysentinel.log" // 哨兵日誌目錄 daemonize yes // 開啟守護進程 protected-mode no // 關閉安全模式
sentinel monitor myredis 192.168.10.10 9000 2 // myredis是主節點的別名,後面是主節點的IP地址及主節點redis的端口號,數字2表示判斷主節點是否down需要最少2個哨兵進行確認
sentinel down-after-milliseconds myredis 30000 // 每個哨兵會定期發送ping確認主節點是否可以連接,如果在3000毫秒沒有回復,就認為主節點不可達。
sentinel parallel-syncs myredis 1 // 當多個哨兵都認為主節點不可達時,主節點哨兵會做故障轉移。並選出一個新的主節點。這個數字越小故障轉移就越慢,但如果越大會導致多個從節點同時向新主機節點復制數據,導致數據不可用。
sentinel failover-timeout myredis 180000 // 故障轉移超時時間。
2.5創建哨兵的工作目錄
[[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis-sentinel
2.6添加從服務器192.168.10.130的哨兵配置文件
[[email protected] ~]# vim /etc/myredis-sentinel.conf bind 192.168.10.130 // 綁定本機地址 port 9502 // 哨兵端口號 dir "/opt/redis-5.0.4/data/myredis-sentinel" // 哨兵工作目錄 logfile "/var/log/redis/mysentinel.log" // 哨兵日誌目錄 daemonize yes // 開啟守護進程 protected-mode no // 關閉安全模式
sentinel monitor myredis 192.168.10.10 9000 2 // myredis是主節點的別名,後面是主節點的IP地址及主節點redis的端口號,數字2表示判斷主節點是否down需要最少2個哨兵進行確認
sentinel down-after-milliseconds myredis 30000 // 每個哨兵會定期發送ping確認主節點是否可以連接,如果在3000毫秒沒有回復,就認為主節點不可達。
sentinel parallel-syncs myredis 1 // 當多個哨兵都認為主節點不可達時,主節點哨兵會做故障轉移。並選出一個新的主節點。這個數字越小故障轉移就越慢,但如果越大會導致多個從節點同時向新主機節點復制數據,導致數據不可用。
sentinel failover-timeout myredis 180000 // 故障轉移超時時間。
2.7創建哨兵的工作目錄
[[email protected] ~]# mkdir -p /opt/redis-5.0.4/data/myredis-sentinel
2.8開啟主/從服務器的redis服務
[[email protected] ~]# redis-server /etc/myredis.conf
2.9查看主從關系
由上圖可知,redis的主從關系正常。
2.10.1開啟主/從哨兵服務
[[email protected] ~]# redis-sentinel /etc/myredis-sentinel.conf
2.10.2查看哨兵當前狀態
[[email protected] ~]# redis-cli -p 9500 -h 192.168.10.10 info sentinel // 查看主服務器的哨兵(在主服務器192.168.10.10) [[email protected] ~]# redis-cli -p 9501 -h 192.168.10.129 info sentinel // 查看從服務器的哨兵(在從服務器192.168.10.129) [[email protected] ~]# redis-cli -p 9502 -h 192.168.10.130 info sentinel // 查看從服務器的哨兵(在從服務器192.168.10.130)
2.10.3殺掉主服務器192.168.10.10的redis服務,查看哨兵是否會在從服務器中選舉出一臺主服務器。
[[email protected] ~]# ps -ef | grep redis // 查看redis的進程號 [[email protected] ~]# kill -9 6483 // 根據redis的進程id殺掉它
殺掉主服務器後查看兩個從服務器的狀態
發現兩臺從服務器都已經檢測到主服務器192.168.10.10的redis已經無法連接,我們稍等片刻,在來看看我們的哨兵是否盡職盡責,為我們自動選舉出一臺主服務器。
好了哨兵值守就演示到這裏吧。
redis的主從復制,哨兵值守