Redis哨兵詳解,哨兵搭建流程,哨兵的運作流程和選舉原理(主觀下線,客觀下線,如何選舉出哨兵leader)。
Redis哨兵(sentinel)
哨兵是什麼?
吹哨人巡查監控後台master主機是否有故障,如果故障了根據投票數自動將某一個從庫轉換為新主庫,繼續對外服務。 【相關推薦:Redis影片教學】
俗稱,無人值守運維。
幹什麼?
- 主從監控:監控主從redis庫執行是否正常
- 訊息通知:哨兵可以將故障轉移的結果傳送給客戶端
- 故障轉移:將其中一個Slave作為新的Master
- 配置中心:客戶端透過連接哨兵來獲得目前Redis服務的主節點位址
案例
架構
3個哨兵:自動監控和維護集群,不存放數據,只是吹哨者。
1主2從:用於讀取與存放資料
#步驟
-
將redis安裝路徑下的sentinel.conf 拷貝到myredis目錄下
cp sentinel.conf /myredis/sentinel26379.conf
-
修改設定檔
vim sentinel26379.conf bind 0.0.0.0 # protected-mode yes 修改为 protected-mode no protected-mode no # daemonize no 修改为 daemonize yes daemonize yes # port port 26379 # pid文件名字,pidfile pidfile /var/run/redis_26379.pid # log文件名字,logfile(修改 logfile "" 为 logfile "/myredis/26379.log") logfile "/myredis/26379.log" # 指定当前的工作目录(修改 dir /temp 为 dir /myredis) dir /myredis
設定要監控的master伺服器
quorum:確認客觀下線的最少哨兵數。同意故障遷移的法定票數。
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
設定連線master服務的密碼
# sentinel auth-pass <master-name> <password>
#我們知道,網路是不可靠的,有時候一個sentinel會因為網路阻塞而誤以為一個master redis已經死掉了,在sentinel集群環境下需要多個sentinel互相溝通來確認某個master是否真的死了,quorum這個參數是進行客觀下線的一個依據,意思是至少有quorum個sentinel認為這個master有故障,才會對這個master進行下線以及故障轉移。因為有的時候,某個sentinel節點可能因為自身網路原因,導致無法連接master,而此時master並沒有出現故障,所以,這就需要多個sentinel都一致認為該master有問題,才可以進行下一步操作,這保證了公平性和高可用。
安裝三台linux
ip和port分別為
# sentinel00 192.168.157.112 26379 # sentinel01 192.168.157.113 26380 # sentinel02 192.168.157.118 26381
設定三台哨兵
sentinelxxxx.conf檔案
sentinel00
sentinel26379.conf
bind 0.0.0.0 daemonize yes protected-mode no port 26379 logfile "/myredis/sentinel26379.log" pidfile /var/run/redis-sentinel26379.pid dir /myredis sentinel monitor mymaster 192.168.157.115 6379 2 sentinel auth-pass mymaster 1234
sentinel01
sentinel26380.conf
bind 0.0.0.0 daemonize yes protected-mode no port 26380 logfile "/myredis/sentinel26380.log" pidfile /var/run/redis-sentinel26380.pid dir /myredis sentinel monitor mymaster 192.168.157.115 6379 2 sentinel auth-pass mymaster 1234
sentinel02
sentinel26381. conf
bind 0.0.0.0 daemonize yes protected-mode no port 26381 logfile "/myredis/sentinel26381.log" pidfile /var/run/redis-sentinel26381.pid dir /myredis sentinel monitor mymaster 192.168.157.115 6379 2 sentinel auth-pass mymaster 1234
測試
基於先前的redis複製,啟動1主2從測試是否主從複製是否正常,輸入info replication 檢視是否正常
-
#啟動三台哨兵,完成監控
redis-sentinel /myredis/sentinel26379.conf --sentinel redis-sentinel /myredis/sentinel26380.conf --sentinel redis-sentinel /myredis/sentinel26381.conf --sentinel
測試主從複製,一切良好
- ##查看日誌
- 檢視設定檔sentinel.conf
> 后面为自动新增内容-模擬master宕機
- master主機
# 模拟宕机 shudown
##問題兩台從機資料是否正常? (yes)
- 會不會從剩下的兩台機器中選出新的master?(yes)
- 之前的master重啟之後會不會重新上位,重新成為master? (no)
salve取得資料
- 查看新的master
- 重寫啟動原始master
-
#master不會重新上位。
對比設定檔
- sentinel6379.conf 檔案
- 舊master
新master
哨兵运行流程和选举原理
当一个主从配置中的master失效后,sentinel可以选举出一个新的master用于自动替换原master的工作,主从配置中的其他redis服务自动指向新的master同步数据,一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。
SDown主观下线(Subjectively Down)
SDOWN(主观不可用)是单个哨兵自己主观检测到的关于master的状态,从sentinel的角度来看,如果发送了PING心跳后,在一定时间内没有收到合法的回复,就到达了SDOQN的条件。
sentinel配置文件中的 down-after-milliseconds 设置了主观下线的时间长度(默认30秒)。
# sentinel down-after-milliseconds <masterName> <timeout> sentinel down-after-milliseconds mymaster 30000
ODown客观下线(Objectively Down)
ODOWN需要一定数量的sentinel,多个哨兵达成一致意见才能确认一个master客观上已经宕机了。
# sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor mymaster 127.0.0.1 6379 2
选举出领导者哨兵
当主节点被判断客观下线后,各个哨兵节点会进行协商,先选举出一个领导者哨兵节点,并由该领导者哨兵节点进行failover(故障迁移)
领导者哨兵如何选出来的?
Raft算法
监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得,即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。
选新的master(im)
整个过程由sentinel自己独立完成,无需人工干涉。
新主登基
某一个slave被选中成为master
选出新的master的规则,剩余slave节点健康的前提下
- redis.conf文件中,优先级slave-priority或者replica-priority最高节点(数字越小优先级越高)
- 复制偏移量offset最大的从节点。
- 最小Run ID的从节点。
群臣俯首
执行 slaveof no one 命令让选出来的从节点成为新的主节点,并通过 slaveof 命令让其他节点成为其从节点。
sentinel leader 会对选举出来的新 master 执行 slaveof no one,将其提升为master节点
sentinel leader 向其他slave发送命令,让剩余的slave成为新的master节点的slave。
旧主拜服
- 将之前的已经下线的旧master设置为新选出的新master的从节点,当旧master重新上线后,它会成为新master的从节点
- sentinel leader 会让原来的master降级为slave并恢复正常工作。
哨兵使用建议
- 哨兵节点数量应该为多个,哨兵本身应该为集群,保证高可用
- 哨兵节点数量应该是奇数
- 各个哨兵节点的配置应该一致
- 如果哨兵节点部署在docker等容器里面,尤其要注意端口的正确映射
- 哨兵集群 + 主从复制,并不能保证数据零丢失
更多编程相关知识,请访问:编程视频!!
以上是深入搞懂Redis中的哨兵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

如何查看 Redis 版本?步驟如下:啟動 Redis 客戶端執行 INFO 命令查找 redis_version 字段,其值即為 Redis 版本號。

查看 Redis 版本號的方法包括:使用命令行工具 redis-cli、Redis INFO 命令、Redis 管理器和環境變量。 redis-cli --version 適用於本地和遠程實例,而 redis-cli info | grep redis_version 可提供更多信息,但僅適用於本地實例。 Redis 管理器提供圖形化界面,但需要第三方工具。環境變量 echo $REDIS_VERSION 在特定環境(如 Docker)中很有用。

了解 Redis 版本號至關重要,因為它與兼容性、安全性、性能優化、錯誤修復和文檔相關:確保應用程序與 Redis 版本兼容。識別和解決安全漏洞。優化應用程序性能,利用新的優化。獲取錯誤修復,提升應用程序穩定性。訪問特定版本的信息和支持資源。

Redis版本兼容性指的是不同版本之間通信的能力。兼容性分為以下級別:向下兼容:新服務器能處理舊客戶端命令。向上兼容:舊客戶端能連接新服務器,但可能無法使用新功能。完全兼容:不同版本無限制交互。兼容性受協議更改、數據結構變化和新功能添加的影響。使用統一版本、進行測試和使用兼容性庫可以避免兼容性問題。

查看 Redis 中所有 Key 的方法包括:使用 KEYS 命令匹配 Key 名稱;使用 SCAN 命令迭代所有 Key;使用 DUMP 和 RESTORE 命令將 Key 值轉儲和還原;使用 RedisInsight 工具瀏覽 Key;對於 Redis 集群,使用 CLUSTER KEYSLOT 和 CLUSTER GETKEYSINSLOT 命令;使用 Lua 腳本生成包含所有 Key 的表。

Redis 的 KEYS 命令可用於查看所有 key:命令語法:KEYS pattern命令參數:pattern 指定搜索 key 時可使用的通配符模式,如 *(任意字符)和 ?(單個字符)。結果:返回與模式匹配的所有 key 的列表。示例:KEYS * 將返回所有 key。技巧:可使用空模式 "*" 查看所有 key,也可使用可變長度通配符 ":" 匹配任意數量的字符。複雜度:O(n),其中 n 是數據庫中的 key 數量。

Redis keys 命令查找所有與指定模式匹配的鍵,使用通配符 進行匹配。該命令返回一個數組,其中包含匹配的鍵名稱。

使用 keys * 命令存在風險,包括:性能影響:掃描整個鍵空間,導致服務器阻塞。內存消耗:獲取所有鍵的列表需要大量內存。數據洩露:返回所有鍵的列表,包括敏感信息。其他潛在風險:超時失敗、鍵空間變化導致列表不完整或不准確、降低服務器可靠性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用