共計 5272 個字符,預計需要花費 14 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
丸趣 TV 小編給大家分享一下 Redis 中哨兵模式的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
主從切換技術的方法是:
當主服務器宕機時,需要將從服務器手動切換 (slaveof no one) 到主從服務器,這需要人工干預。
這既費時又費力,但也會在一段時間內導致服務不可用。這不是推薦的方法。
更多的時間,我們優先考慮哨兵模式,這是當前企業應用程序的主流模式。Redis Sentinel 是 Redis 的高度可用的實現。
Sentinel 是管理多個 Redis 實例的工具。它可以監視,通知 Redis 并自動進行故障轉移。
Redis Sentinel 的基本概念主從復制和 Sentinel 高可用性架構的示意圖
Redis Sentinel 架構
Redis Sentinel 的主要功能 Sentinel 的主要功能包括:主節點生存檢測,主從操作檢測,自動故障轉移以及主從切換。
Redis 的最小標記配置是一臺主機和一臺從機;
Redis 的 Sentinel 系統可用于管理多個 Redis 服務器。
系統可以執行以下四個任務:
1、監視:Sentinel 會不斷檢查主服務器和從屬服務器是否正常運行;
2、通知:當受監控的 Redis 服務器出現問題時,Sentinel 會通過 API 腳本向管理員或其他應用程序發送通知;
3、自動故障轉移:當主節點無法正常工作時,Sentinel 將啟動自動故障轉移操作。它將與發生故障的主節點處于主從關系的從節點之一升級到新的主節點,并將其他從節點指向新的主節點;
4、配置提供程序:在 Redis Sentinel 模式下,初始化客戶端應用程序時,它將連接 Sentinel 節點集合以獲取主節點的信息;
Redis Sentinel 如何工作
當哨兵節點連接到 Redis 實例時,它將創建兩個連接:cmd 和 pub/sub。Sentinel 通過 cmd 連接將命令發送到 Redis,并通過 pub/sub 連接到 Redis 實例上的其他哨兵實例。
Sentinel 與 Redis 主節點和從節點進行交互的命令
每個 Sentinel 每秒向其已知的主實例,從屬實例和其他 Sentinel 實例發送一個 PING 命令。
如果一個實例花費的時間比上次對 PING 命令的有效回復(毫秒)后 down 所指定的時間更長,那么 Sentinel 會將該實例標記為主觀離線。
如果將主服務器標記為主觀注銷,則將監視主服務器的所有 Sentinel 節點以確認主服務器確實已經每秒進入一次主觀注銷狀態。
如果將主服務器標記為主觀注銷,并且在指定的時間范圍內有足夠的哨兵(至少配置文件中指定的數量)與該判斷相符,則將主服務器標記為客觀下線。
通常,每個 Sentinel 每 10 秒向其所有已知的主服務器和從服務器發送 INFO 命令。當 Sentinel 將主服務器標記為脫機時,Sentinel 發送 INFO 命令給脫機主服務器的所有從屬服務器的頻率將從每 10 秒一次更改為每秒一次。
Sentinel 和其他哨兵協商主節點的狀態。如果主節點處于 SDOWN 狀態,投票將自動選擇新的主節點。將其余的從節點指向新的主節點以進行數據復制。
如果沒有足夠的哨兵以允許主服務器注銷,則將刪除主服務器的客觀注銷狀態。當主服務器對 Sentinel 的 PING 命令返回有效答復時,主服務器的主觀脫機狀態將被刪除。
note
健壯的 Redis Sentinel 群集應至少使用三個 Sentinel 實例,并確保將這些實例放置在不同的計算機上,甚至放置在不同的物理區域上.
Sentinel 無法保證強一致性。常見客戶端應用程序庫中支持 Sentinel。
Sentinel 需要不斷測試和觀察以確保高可用性
測試
創建配置文件
內容簡單配置如下:
port 16379 # 哨兵端口號
daemonize yes
sentinel monitor master 127.0.0.1 6379 1 # 監視 master
protected-mode no
logfile /usr/local/bin/sentinel-1/sentinel-1.log # 日志文件
先啟動 redis 設置集群,啟動 redis-cli,設 6379 為 master
再啟動 sentinel
sudo redis-sentinel sentinel-1/sentinel.conf
關閉 6379
查看另外兩個 redis-cli 的角色情況
再啟動 6379
查看 sentinel 日志
sentinel.conf 說明
# Example sentinel.conf
# *** IMPORTANT ***
# 綁定 IP 地址
# bind 127.0.0.1 192.168.1.1
# 保護模式(是否禁止外部鏈接,除綁定的 ip 地址外)# protected-mode no
# port sentinel-port
# 此 Sentinel 實例運行的端口
port 26379
# 默認情況下,Redis Sentinel 不作為守護程序運行。 如果需要,可以設置為 yes。daemonize no
# 啟用守護進程運行后,Redis 將在 /var/run/redis-sentinel.pid 中寫入一個 pid 文件
pidfile /var/run/redis-sentinel.pid
# 指定日志文件名。 如果值為空,將強制 Sentinel 日志標準輸出。守護進程下,如果使用標準輸出進行日志記錄,則日志將發送到 /dev/null
logfile
# sentinel announce-ip ip
# sentinel announce-port port
# 上述兩個配置指令在環境中非常有用,因為 NAT 可以通過非本地地址從外部訪問 Sentinel。# 當提供 announce-ip 時,Sentinel 將在通信中聲明指定的 IP 地址,而不是像通常那樣自動檢測本地地址。# 類似地,當提供 announce-port 有效且非零時,Sentinel 將宣布指定的 TCP 端口。# 這兩個選項不需要一起使用,如果只提供 announce-ip,Sentinel 將宣告指定的 IP 和“port”選項指定的服務器端口。# 如果僅提供 announce-port,Sentinel 將通告自動檢測到的本地 IP 和指定端口。# Example:
# sentinel announce-ip 1.2.3.4
# dir working-directory
# 每個長時間運行的進程都應該有一個明確定義的工作目錄。對于 Redis Sentinel 來說,/tmp 就是自己的工作目錄。dir /tmp
# sentinel monitor master-name ip redis-port quorum
# 告訴 Sentinel 監聽指定主節點,并且只有在至少 quorum 哨兵達成一致的情況下才會判斷它 O_DOWN 狀態。# 副本是自動發現的,因此您無需指定副本。# Sentinel 本身將重寫此配置文件,使用其他配置選項添加副本。另請注意,當副本升級為主副本時,將重寫配置文件。# 注意:主節點(master)名稱不能包含特殊字符或空格。# 有效字符可以是 A-z 0-9 和這三個字符 .-_ .
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果 redis 配置了密碼,那這里必須配置認證,否則不能自動切換
# Example:
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# sentinel down-after-milliseconds master-name milliseconds
# 主節點或副本在指定時間內沒有回復 PING,便認為該節點為主觀下線 S_DOWN 狀態。# 默認是 30 秒
sentinel down-after-milliseconds mymaster 30000
# sentinel parallel-syncs master-name numreplicas
# 在故障轉移期間,多少個副本節點進行數據同步
sentinel parallel-syncs mymaster 1
# sentinel failover-timeout master-name milliseconds
# 指定故障轉移超時(以毫秒為單位)。 它以多種方式使用:# - 在先前的故障轉移之后重新啟動故障轉移所需的時間已由給定的 Sentinel 針對同一主服務器嘗試,是故障轉移超時的兩倍。# - 當一個 slave 從一個錯誤的 master 那里同步數據開始計算時間。直到 slave 被糾正為向正確的 master 那里同步數據時。# - 取消已在進行但未生成任何配置更改的故障轉移所需的時間
# - 當進行 failover 時,配置所有 slaves 指向新的 master 所需的最大時間。# 即使過了這個超時,slaves 依然會被正確配置為指向 master。# 默認 3 分鐘
sentinel failover-timeout mymaster 180000
# 腳本執行
# sentinel notification-script 和 sentinel reconfig-script 用于配置調用的腳本,以通知系統管理員或在故障轉移后重新配置客戶端。# 腳本使用以下規則執行以進行錯誤處理:# 如果腳本以“1”退出,則稍后重試執行(最多重試次數為當前設置的 10 次)。# 如果腳本以“2”(或更高的值)退出,則不會重試執行。# 如果腳本因為收到信號而終止,則行為與退出代碼 1 相同。# 腳本的最長運行時間為 60 秒。 達到此限制后,腳本將以 SIGKILL 終止,并重試執行。# 通知腳本
# sentinel notification-script master-name script-path
# 為警告級別生成的任何 Sentinel 事件調用指定的通知腳本(例如 -sdown,-odown 等)。# 此腳本應通過電子郵件,SMS 或任何其他消息傳遞系統通知系統管理員 監控的 Redis 系統出了問題。# 使用兩個參數調用腳本:第一個是事件類型,第二個是事件描述。# 該腳本必須存在且可執行,以便在提供此選項時啟動 sentinel。# 舉例:
# sentinel notification-script mymaster /var/redis/notify.sh
# 客戶重新配置腳本
# sentinel client-reconfig-script master-name script-path
# 當主服務器因故障轉移而變更時,可以調用腳本執行特定于應用程序的任務,以通知客戶端,配置已更改且主服務器地址已經變更。# 以下參數將傳遞給腳本:# 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 用于傳遞主服務器的舊地址和所選副本的新地址。# 舉例:
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
# 安全
# 避免腳本重置,默認值 yes
# 默認情況下,SENTINEL SET 將無法在運行時更改 notification-script 和 client-reconfig-script。# 這避免了一個簡單的安全問題,客戶端可以將腳本設置為任何內容并觸發故障轉移以便執行程序。sentinel deny-scripts-reconfig yes
# REDIS 命令重命名
# 在這種情況下,可以告訴 Sentinel 使用不同的命令名稱而不是正常的命令名稱。# 例如,如果主“mymaster”和相關副本的“CONFIG”全部重命名為“GUESSME”,我可以使用:# SENTINEL rename-command mymaster CONFIG GUESSME
# 設置此類配置后,每次 Sentinel 使用 CONFIG 時,它將使用 GUESSME。 請注意,實際上不需要尊重命令案例,因此在上面的示例中寫“config guessme”是相同的。# SENTINEL SET 也可用于在運行時執行此配置。# 為了將命令設置回其原始名稱(撤消重命名),可以將命令重命名為它自身:# SENTINEL rename-command mymaster CONFIG CONFIG
以上是“Redis 中哨兵模式的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節