redis 的默認端口是6379
sentinel監聽端口,默認是26379
Redis Ping 命令使用客戶端向 Redis 服務器發送一個 PING ,如果服務器運作正常的話,會返回一個 PONG 。通常用於測試與服務器的連接是否仍然生效,或者用於測量延遲值。
Redis Info 命令以一種易於理解和閱讀的格式,返回關於 Redis 服務器的各種信息和統計數值。
Redis Monitor 命令用於實時打印出 Redis 服務器接收到的命令,調試用。
Redis哨兵模式
哨兵的幾個不足點:
1、哨兵集羣中只要有一臺宕了,整個集羣的故障轉移機制就失效了。
2、哨兵啓動時候redis主庫必需運行正常,否則故障轉移機制也失效。
3、應用端需要先詢問哨兵才能訪問到redis主庫,是否對效率也有明顯的影響。
一、簡介
在使用主從複製的情況下,Master服務器進行了down機的情況,我們的系統就不能再進行寫的操作,所以此時redis在2.6版本引入了哨兵模式,但是並不穩定,2.8版本之後哨兵模式才穩定了起來。
顧名思義Redis的哨兵模式就是對redis系統進行實時的監控,其主要功能有下面兩點
1.監測主數據庫和從數據庫是否正常運行。
2.當我們的主數據庫出現故障的時候,可以自動將從數據庫轉換爲主數據庫,實現自動的切換。
Sentinel是Redis高可用性的解決方案:
由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將已下線主服務器屬下的模模個從服務器升級爲新的主服務器,然後由新的主服務器代替已下線的主服務器繼續處理命令請求。
Redis提供的sentinel(哨兵)機制,通過sentinel模式啓動redis後,自動監控master/slave的運行狀態,
基本原理是:心跳機制+投票裁決
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其他從服務器改爲複製新的主服務器; 當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可以使用新主服務器代替失效服務器。
哨兵(sentinel) 雖然有一個單獨的可執行文件 redis-sentinel ,但實際上它只是一個運行在特殊模式下的 Redis 服務器,你可以在啓動一個普通 Redis 服務器時通過給定 --sentinel 選項來啓動哨兵(sentinel),哨兵(sentinel) 的一些設計思路和zookeeper非常類似。
Sentinel集羣之間會互相通信,溝通交流redis節點的狀態,做出相應的判斷並進行處理,這裏的主觀下線狀態和客觀下線狀態是比較重要的狀態,它們決定了是否進行故障轉移,可以 通過訂閱指定的頻道信息,當服務器出現故障得時候通知管理員,客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 服務器,你不可以使用 PUBLISH 命令向這個服務器發送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應的事件提醒。一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名爲 +sdown 的頻道就可以接收所有實例進入主觀下線(SDOWN)狀態的事件。
二、步驟:
1. 啓動並初始化Sentinel(哨兵)
a、初始化服務器
b、將普通redis服務器使用的代碼替換成Sentinel專用代碼
c、初始化Sentinel狀態,sentinelState結構中保存了服務器中所有和Sentinel功能有關的狀態:
當前紀元,用於實現故障轉移:uint64_t current_epoch
所有被這個sentinel監視的主服務器:dict *masters
是否進入了tilt模式:int tilt
正在執行的腳本數量:int running_scripts
進入tilt模式的時間:mstime_t tilt_start_time
最後一次執行時間處理器的時間:mstime_t previous_time
FIFO隊列,包含了所有需要執行的用戶腳本:list *scripts_queue
d、根據給定的配置文件,初始化Sentinel的監視主服務器列表(dict *masters):字典的鍵是被監視主服務器的名字,字典的值則是被監視主服務器對應的sentinelRedisInstance結構
e、創建連向主服務器的網絡連接
命令連接:專門用於向主服務器發送命令,並接收命令回覆
訂閱連接:專門用於訂閱主服務器的_sentinel_:hello頻道
2. 獲得主服務器信息
Sentinel默認會以每10s/次的頻率,通過命令連接向它已知的所有Master,Slave發送 INFO命令,並通過分析INFO命令的回覆來獲取主服務器的當前信息。
3. 獲取從服務器信息
當Sentinel發現主服務器有新的從服務器出現時,Sentinel除了會爲這個新的從服務器創建相應的實例結構之外,還會創建連接到從服務器的命令連接和訂閱連接。
4. 向主服務器和從服務器發送信息
默認情況下,Sentinel會以2s/次的頻率,通過命令連接向所有被監視的主服務和從服務器發送信息
5. 接收來自主服務器和從服務器的頻道信息
對於監視同一個服務器的多個Sentinel來說,一個Sentinel發送的信息會被其他Sentinel接收到,這些信息會被用於更新其他sentinel對發送信息sentinel的認知,也會被用於更新其他sentinel對被監視服務器的認知。
6. 檢測主觀下線狀態
默認情況下,sentinel會以1s/次的頻率向所有與它創建了命令連接的實例(包括主服務器、從服務器、其他sentinel在內)發送PING命令,並通過實例返回的PING命令回覆來判斷實例是否在線。
7. 檢查客觀下線狀態
當sentinel將一個主服務器判斷爲主觀下線之後,爲了確認這個主服務器是否真的下線,他會向同樣監視這一主服務器的其他Sentinel進行詢問,看他們是否也任務主服務器已經下線。當Sentinel從其他sentinel那裏接收到足夠數量的已下線判斷之後,sentinel就會將主服務器判定爲客觀下線,並進行故障轉移操作。
8. 選舉領頭sentinel
a、每個成爲candidate的sentinel將自己紀元數+1,並向其他sentinel發送要求選舉自己爲局部領頭sentinel的命令
b、每個folloewer-candidate都選舉第一個接收到的請求作爲自己的局部領頭sentinel並回復,然後將自己的紀元數+1
c、 每個candidate統計自己的票數,如果>=n/2+1,則該sentinel成爲領頭sentinel。
9. 故障轉移
a、 在已下線主服務器屬下的所有從服務器裏面,挑選出一個從服務器,並將其轉換爲主服務器
b、讓已下線主服務器屬下的所有從服務器改爲複製新的主服務器
c、將已下線主服務器設置爲新的主服務器的從服務器,當這個舊的主服務器重新上線時,他就會成爲新的主服務器的從服務器。
三、Sentinel的工作方式:
1):每個Sentinel以 1s/次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令
2):如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線(SDOWN)。
3):如果一個Master被標記爲主觀下線,則正在監視這個Master的所有 Sentinel 要以 1s/次的頻率確認Master的確進入了主觀下線狀態。
4):當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線(ODOWN)。
5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
6):當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次
7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。
四、配置
配置哨兵模式核心文件
sentinel monitor 被監控數據庫名字(自己起名字) 127.0.0.1 6379(主機IP端口) 1
上面最後一個數字1,表示主機掛掉後salve(從機)投票看讓誰接替成爲主機,得票數多少後升爲主機
啓動哨兵模式
redis-sentinel /myredis/sentinel.conf
查看狀態
INFO replication
Sentinel常用命令
1. ping //返回 PONG 。
2. sentinel masters //列出所有被監視的主服務器,以及這些主服務器的當前狀態。
3. sentinel slaves <master name> //列出給定主服務器的所有從服務器,以及這些從服務器的當前狀態。
4. sentinel get-master-addr-by-name <master name> //返回給定名字的主服務器的 IP 地址和端口號。如果這個主服務器正在執行故障轉移操作,或者針對這個主服務器的故障轉移操作已經完成,那麼這個命令返回新的主服務器的IP 地址和端口號。
5. sentinel reset <pattern> //重置所有名字和給定模式 pattern 相匹配的主服務器。pattern參數是一個 Glob風格的模式。重置操作清除主服務器目前的所有狀態,包括正在執行中的故障轉移,並移除目前已經發現和關聯的,主服務器的所有從服務器和Sentinel 。
sentinel failover <master name> //當主服務器失效時,在不詢問其他 Sentinel意見的情況下,強制開始一次自動故障遷移(不過發起故障轉移的 Sentinel 會向其他Sentinel 發送一個新的配置,其他Sentinel 會根據這個配置進行相應的更新)。
Sentinel配置詳解
1. port 26379 //sentinel監聽端口,默認是26379,可以修改。
2. sentinel monitor <master-name> <ip> <redis-port> <quorum>
//告訴 sentinel去監聽地址爲ip:port的一個master,這裏的master-name可以自定義,quorum是一個數字,指明當有多少個sentinel認爲一個master失效時,master纔算真正失效。master-name只能包含英文字母,數字,和“.-_”這三個字符。
配置示例:sentinel monitor master-1 127.0.0.1 6379 2
3. sentinel down-after-milliseconds <master-name> <milliseconds>
//sentinel會向master發送心跳PING來確認master是否存活,如果 master在“一定時間範圍”內不迴應PONG或者是回覆了一個錯誤消息,那麼這個sentinel會主觀地 (單方面地)認爲這個master已經不可用了 (subjectively down, 也簡稱爲SDOWN)。而這個down-after-milliseconds就是用來指定這個“一定時間範圍”的,單位是毫秒。
配置示例:sentinel down-after-milliseconds master-1 5000
4. sentinel failover-timeout <master-name> <milliseconds>
//如果在該時間(ms)內未能完成failover操作,則認爲該failover失敗。
配置示例:sentinel failover-timeout master-1 18000
5. sentinel parallel-syncs <master-name> <numslaves>
//在發生 failover主備切換時,這個選項指定了最多可以有多少個slave同時對新的 master進行同步,這個數字越小,完成failover所需的時間就越長,但是如果這個數字越大,就意味着越多的slave因爲replication而不可用。可以通過將這個值設爲 1來保證每次只有一個slave處於不能處理命令請求的狀態。
配置示例:sentinel parallel-syncs master-1 1
6. sentinel notification-script <master-name> <script-path> //通知型腳本
當sentinel有任何警告級別的事件發生時(比如說redis實例的主觀失效和客觀失效等等),將會去調用這個腳本,這時這個腳本應該通過郵件,SMS等方式去通知系統管理員關於系統不正常運行的信息。調用該腳本時,將傳給腳本兩個參數,一個是事件的類型,一個是事件的描述。如果sentinel.conf配置文件中配置了這個腳本路徑,那麼必須保證這個腳本存在於這個路徑,並且是可執行的,否則sentinel無法正常啓動成功。
配置示例:sentinel notification-script master-1 D:\script.bat
7. sentinel client-reconfig-script <master-name> <script-path>
//當一個 master由於failover而發生改變時,這個腳本將會被調用,通知相關的客戶端關於master地址已經發生改變的信息。以下參數將會在調用腳本時傳給腳本:<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>目前<state>總是“failover”, <role>是“leader”或者“observer”中的一個。參數 from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的slave)通信的。這個腳本應該是通用的,能被多次調用,不是針對性的。
配置示例:sentinel client-reconfig-script mymaster D:\script.bat
8. sentinel auth-pass <master-name> <password>
//設置連接master和 slave時的密碼,注意的是sentinel不能分別爲master和slave設置不同的密碼,因此master和slave的密碼應該設置相同。
配置示例:sentinel auth-pass master-1 grs