Docker搭建Redis哨兵模式
系統: CentOS 7
Dockder 版本:
VMware虛擬機
網絡適配器
- 網絡連接
- 橋接模式:直接連接物理網絡
查看IP命令
ip addr

一、哨兵模式概述
1. 官方文檔與關聯博客
- 官方文檔:https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel
- 關聯博客:Redis 主從復制,在后續配置從節點時會用到。
2. 極簡概括
Redis 哨兵模式是一種自動監控 Redis 主節點是否故障的方案。當主節點出現故障時,Redis 會依據投票數自動將從庫切換為主庫,這個過程被稱為仲裁。
3. 解決的問題
在傳統的主從復制架構模式下,若 Redis 主節點掛掉,從節點沒有任何補償操作,在無人工干預的情況下,整個緩存鏈路的寫功能將會喪失。而哨兵模式引入了哨兵看守機制,能夠實現對主機的檢測以及自動將從機切換為主機的功能。
4. 適用場景
適用于需要 7 * 24 小時 高可用,并且公司愿意投入相關運維成本的服務端應用。需要注意的是,作為哨兵節點的 Redis 實例,將無法提供緩存服務,只能作為哨兵使用,而且通常要求哨兵數量為奇數個。
5. 優點
- 降低運維成本:擁有強大的高可用機制,能夠在一定程度上降低運維成本。
- 自動恢復機制:當主節點掛掉后,哨兵會自動從從節點中選出一個作為新的主節點,繼續對外提供服務,無需人工值守。
6. 缺點
- 場景限制:小型公司可能不需要使用 Redis,中型公司也不一定會用到 Redis 主從架構,更不用說使用哨兵這種嚴謹的運維策略。
- 資金問題:Redis 哨兵模式需要部署多個服務器,這對于公司來說是一筆不小的支出,存在一定的資金門檻。
- 延遲問題:當主節點掛掉時,雖然可以實現自動切換,但多個哨兵判斷 Redis 主節點客觀下線的過程需要一定時間,盡管這個時間可以調整,但在此期間 Redis 的寫操作會失效。因此,為了解決這個問題,出現了集群策略。
- 數據丟失問題:Redis 主從復制采用異步復制方式,哨兵模式只是增加了自動化的切換功能,不像 MySQL 有 redo log 機制,無法保證數據 100% 不丟失。
- 腦裂問題:在某些情況下,會引發腦裂問題(后續會詳細說明)。
7. 誤區說明
需要明確的是,哨兵和集群是兩個不同的概念,它們之間沒有關聯。哨兵模式是主從復制架構的高可用優化方案,而不是集群部署的高可用方案。
8. 訪問流程變化
在傳統模式下,編程語言客戶端直接訪問 Redis 主節點或從節點。而在哨兵模式下,客戶端訪問的是哨兵節點(通常由奇數個哨兵組成一個哨兵集群,奇數個哨兵便于進行投票),然后由哨兵節點告知客戶端應該訪問哪個主節點或從節點,從而區分讀寫操作。
二、實操(1 主 + 2 從 + 3 哨)
1. 選擇 3 個哨兵的理由
如同一個小區至少需要 2 個保安輪班倒一樣,為了確保對 Redis 主節點的可靠監控,需要多個哨兵。同時,由于哨兵有類似投票的機制,使用奇數個哨兵可以避免出現投票平局的情況,因此選擇 3 個哨兵是比較合適的。
2. 環境決策
本次部署采用 3 個哨兵 + 1 個 Master + 2 個 Slave 的架構,共需要 6 臺服務器。考慮到 Docker 方案在拉取鏡像時可能會遇到網絡限制(國內網絡環境可能導致鏡像拉不下來,且本地沒有可用鏡像),因此棄用 Docker 方案。
3. 運行環境
- 操作系統:CentOS 7.6
- 內存分配:每個系統分配 1G 內存,Linux 系統可以輕松啟動這些 Redis 實例,總共占用內存 6GB,設備可以承受。但需要注意的是,磁盤占用相對較高,特別是在開機時。
- 遠程連接配置:每個 Redis 實例都已經配置好了遠程連接功能,包括防火墻設置、遠程連接權限配置以及保護模式的調整。
4. IP 分配
主機名 | 服務器配置 | 服務器IP | 網關地址 | 端口號 | 備注 |
---|---|---|---|---|---|
redis-master | 2核CPU、1G內存、300G磁盤 | 192.168.2.100 | 192.168.2.1 | 6379 | 主節點 |
redis-slave1 | 2核CPU、1G內存、300G磁盤 | 192.168.2.101 | 192.168.2.1 | 6379 | 從節點1 |
redis-slave2 | 2核CPU、1G內存、300G磁盤 | 192.168.2.102 | 192.168.2.1 | 6379 | 從節點2 |
redis-sentinel1 | 2核CPU、1G內存、300G磁盤 | 192.168.2.103 | 192.168.2.1 | 26379 | 哨兵1 |
redis-sentinel2 | 2核CPU、1G內存、300G磁盤 | 192.168.2.104 | 192.168.2.1 | 26379 | 哨兵2 |
redis-sentinel3 | 2核CPU、1G內存、300G磁盤 | 192.168.2.105 | 192.168.2.1 | 26379 | 哨兵3 |
網絡拓撲結構如下:
192.168.2.103【哨兵1】 192.168.2.101【從1】/ \ // \ // \ /
192.168.2.xxx -->-> 192.168.2.104【哨兵2】 ---> 192.168.2.100【主】\ / \\ / \\ / \ 192.168.2.105【哨兵3】 192.168.2.102【從2】
5.hosts
# vim /etc/hosts192.168.2.100 redis-master
192.168.2.101 redis-slave1
192.168.2.102 redis-slave2
192.168.2.103 redis-sentinel1
192.168.2.104 redis-sentinel2
192.168.2.105 redis-sentinel3
6. 主要配置說明
初始化配置
創建目錄mk