Redis sentinel 哨兵模式,redissentinel
一、sentinel介紹
Sentinel作用:
1):Master狀態檢測
2):如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave
3):Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
Sentinel工作方式:
1):每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 執行個體發送一個 PING 命令
2):如果一個執行個體(instance)距離最後一次有效回複 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個執行個體會被 Sentinel 標記為主觀下線。
3):如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
4):當有足夠數量的 Sentinel(大於等於設定檔指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
6):當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
8):若 Master 重新向 Sentinel 的 PING 命令返回有效回複, Master 的主觀下線狀態就會被移除。
主觀下線和客觀下線
主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 執行個體對某個redis伺服器做出的下線判斷。
客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 執行個體在對Master Server做出 SDOWN 判斷,並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後,得出的Master Server下線判斷,然後開啟failover.
通俗來講就是:
redis的sentinel系統用來管理多個redis伺服器,可以實現一個功能上實現HA的叢集。該系統主要執行三個任務:
①監控( Monitoring ): Redis Sentinel即時監控主伺服器和從伺服器運行狀態。
②提醒(notification): 當被監控的某個 Redis 伺服器出現問題時, Redis Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程式發送通知
一個簡單的主從結構加sentinel叢集的架構圖如下:
是一主兩從節點,sentinel叢集之間會互相通訊,溝通交流redis節點的狀態,做出相應的判斷並進行處理,這裡的主觀下線狀態和客觀下線狀態是比較重要的狀態,它們決定了是否進行容錯移轉 可以 通過訂閱指定的頻道資訊,當伺服器出現故障得時候通知管理員 用戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 伺服器,你不可以使用 PUBLISH 命令向這個伺服器發送資訊,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來擷取相應的事件提醒。
一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有執行個體進入主觀下線(SDOWN)狀態的事件。
二、搭建redis-sentinel 叢集環境
1、下載redis編譯安裝包:redis-2.8.19.tar.gz,然後解壓縮進行編譯安裝。將redis安裝到/opt/redis目錄下。
1 [root@idxs21-108 redis]# mkdir bin #redis指令檔 2 [root@idxs21-108 redis]# mkdir conf #redis設定檔 3 [root@idxs21-108 redis]# mkdir data #redis的本機資料存放 4 [root@idxs21-108 redis]# mkdir logs #redis記錄檔 5 [root@idxs21-108 redis]# tar zxvf redis-2.8.19.tar.gz cd redis-2.8.19 6 [root@idxs21-108 redis]# make PREFIX=/opt/redis install cp *.conf /opt/redis/conf #把安裝源檔案中的.conf設定檔拷貝一份到安裝目錄下的conf目錄中。 7 [root@idxs21-108 redis]# cd /opt/redis/conf cp redis.cof redis.conf.bak cp sentinel.conf sentinel.conf.bak
2.在安裝redis成功後,可以在/opt/redis/bin目錄下看到以下內容:
1 [root@idxs21-108 bin]# ll2 total 152203 -rwxr-xr-x 1 root root 4586251 Mar 10 2015 redis-benchmark4 -rwxr-xr-x 1 root root 22177 Mar 10 2015 redis-check-aof5 -rwxr-xr-x 1 root root 45387 Mar 10 2015 redis-check-dump6 -rwxr-xr-x 1 root root 4679739 Mar 10 2015 redis-cli7 lrwxrwxrwx 1 root root 27 Jun 20 15:59 redis-sentinel -> /opt/redis/bin/redis-server8 -rwxr-xr-x 1 root root 6241748 Mar 10 2015 redis-server
3、修改master機器設定檔(這裡直接使用的sed命令做的替換):
1 # -- redis.conf #修改redis.conf 2 sed -i 's/daemonize no/daemonize yes/g' redis.conf #使用後台方式運行 3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf #配置日誌路徑 4 # no AOF and RDB for master #配置資料同步策略,master節點注釋關閉掉dump資料同步 5 sed -i 's/save 900 1/# save 900 1/g' redis.conf 6 sed -i 's/save 300 10/# save 300 10/g' redis.conf 7 sed -i 's/save 60 10000/# save 60 10000/g' redis.conf 8 sed -i 's/appendonly no/appendonly yes/g' redis.conf #開啟aof同步 9 sed -i 's/dir \.\//dir "/opt/redis/data/"/g' redis.conf #配置資料檔案存放路徑10 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf11 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf12 13 # -- sentinel.conf #修改sentinel.conf檔案14 echo 'daemonize yes' >> sentinel.conf #後台方式運行sentinel15 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf16 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf #配置哨兵模式
4、修改slave機器設定檔,兩台slave配置一樣:
1 # -- redis.conf 2 sed -i 's/daemonize no/daemonize yes/g' redis.conf 3 sed -i 's/logfile ""/logfile "/opt/redis/logs/redis.log"/g' redis.conf 4 sed -i 's/# save ""/save ""/g' redis.conf 5 sed -i 's/appendonly no/appendonly yes/g' redis.conf 6 sed -i 's/dir \.\//dir "/opt/redis/data/"/g'redis.conf 7 8 # SLOWLOG GET or SLOWLOG GET number 9 sed -i 's/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g' redis.conf10 sed -i 's/slowlog-max-len 128/slowlog-max-len 1000/g' redis.conf12 echo "slaveof 10.135.40.118 6379" >> redis.conf #指定master節點13 14 # -- sentinel.conf15 echo 'daemonize yes' >> sentinel.conf 16 echo 'logfile /opt/redis/logs/sentinel.log' >> sentinel.conf17 sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g' sentinel.conf
5、設定檔修改完成之後啟動redis服務,從master開始啟動,所有節點的啟動方式和命令都是一樣的。
1 啟動redis服務和sentinel服務:2 [root@idxs21-108 redis]# /opt/redis/bin/redis-server /opt/redis/conf/redis.conf3 [root@idxs21-108 redis]# /opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf4 查看服務進程狀態:5 [root@idxs21-108 redis]# ps -ef | grep redis6 root 10024 9807 0 17:14 pts/0 00:00:00 grep redis7 root 68378 1 0 Jul28 ? 01:30:09 /opt/redis/bin/redis-sentinel *:26379 8 root 68379 1 0 Jul28 ? 00:35:16 /opt/redis/bin/redis-server *:6379
6、測試
1>.測試資料同步
1 主redis寫入資料: 2 [root@idxs40-118 redis]# redis-cli -p 6379 3 127.0.0.1:6379> set name abc 4 OK 5 127.0.0.1:6379> get name 6 "abc" 7 127.0.0.1:6379> 8 從redis讀取資料: 9 [root@idxs40-117 redis]# redis-cli -p 637910 127.0.0.1:6379> get name11 "abc"12 127.0.0.1:6379>13 從redis讀取資料:14 [root@idxs40-119 redis]# redis-cli -p 637915 127.0.0.1:6379> get name16 "abc"17 127.0.0.1:6379>
2>.redis預設是讀寫分離的,只有master能寫,slave只能讀:
1 [root@idxs40-117 ~]# redis-cli -p 63792 127.0.0.1:6579> set name 1233 (error) READONLY You can't write against a read only slave.
這裡可看到,slave節點預設只有讀的許可權,無法進行寫入操作。
7、sentinel一些命令介紹 要使用sentinel的命令,我們需要用redis-cli命令進入到sentinel:
[root@idxs21-108 redis]# redis-cli -h 10.135.40.118 -p 26379①INFO sentinel的基本狀態資訊 ②SENTINEL masters 列出所有被監視的主伺服器,以及這些主伺服器的目前狀態 ③SENTINEL slaves 列出給定主伺服器的所有從伺服器,以及這些從伺服器的目前狀態 ④SENTINEL get-master-addr-by-name 返回給定名字的主伺服器的 IP 位址和連接埠號碼 ⑤SENTINEL reset 重設所有名字和給定模式 pattern 相匹配的主伺服器。重設操作清除主伺服器目前的所有狀態, 包括正在執行中的容錯移轉, 並移除目前已經發現和關聯的, 主伺服器的所有從伺服器和 Sentinel 。 ⑥SENTINEL failover 當主伺服器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移,但是它會給其他sentinel發送一個最新的配置,其他sentinel會根據這個配置進行更新
8、如果master節點宕機,會從兩台slave中自動選舉出一台機器接替master角色。後期如果老的master節點重新恢複,重新加入叢集中,也只能是salve節點。