1. 程式人生 > >redis的主從復制,哨兵值守

redis的主從復制,哨兵值守

ice 本機 兩種 .cn 進行 狀態 手動 mod ilo

環境:

主服務器: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
bind 
192.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的主從復制,哨兵值守