1.編寫redis集群主節點的配置文件
redis-master.conf
port 6379 bind 0.0.0.0 protected-mode no
redis-slavle1.conf
port 6379 bind 0.0.0.0 slaveof redis-master 6379 protected-mode no
redis-slavle2.conf
port 6379 bind 0.0.0.0 slaveof redis-master 6379 protected-mode no
字段解析:
1. port 6379 含義:指定 Redis 服務監聽的 TCP 端口號。 默認值:6379。 作用: 客戶端通過該端口連接 Redis 服務器。 同一臺機器上運行多個 Redis 實例時,需為每個實例分配不同端口(如 6380、6381)。 2. bind 0.0.0.0 含義:指定 Redis 監聽的 網絡接口(IP 地址)。 默認值:默認僅監聽本地回環地址 127.0.0.1。 作用: 0.0.0.0 表示監聽所有可用網絡接口(允許任意 IP 連接 Redis)。 若需限制訪問來源,可指定具體 IP(如 bind 192.168.1.100)。 3. slaveof redis-master 6379 含義:將該 Redis 實例配置為 從節點(Slave),復制指定主節點(Master)的數據。 redis-master:主節點的域名或 IP 地址。 6379:主節點的端口。 作用: 從節點會自動連接主節點并同步數據(全量或增量復制)。 若主節點配置了密碼,需在從節點添加 masterauth <password> 參數。 4. protected-mode no 含義:是否啟用 保護模式。 yes:若未配置密碼且未綁定 IP,僅允許本地連接。 no:允許遠程連接,即使未設置密碼。 作用: 生產環境強烈建議設為 yes,并配合 requirepass 設置密碼。 在測試或內網環境中可設為 no,但需確保網絡安全(如防火墻限制)
# 安全增強配置(建議生產環境啟用) requirepass your_redis_password # 設置 Redis 訪問密碼 masterauth your_master_password # 主節點密碼(從節點需要)
2.編寫sentinel配置文件
sentinel1.conf
port 26379 sentinel monitor mymaster 47.117.177.159 6379 2 logfile "sentinel1.log" sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 protected-mode no
sentinel2.conf
port 26379 sentinel monitor mymaster 47.117.177.159 6379 2 logfile "sentinel2.log" sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 protected-mode no
sentinel3.conf
port 26379 sentinel monitor mymaster 47.117.177.159 6379 2 logfile "sentinel3.log" sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 protected-mode no
配置文件解析
port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" # 主節點配置:監控名為 mymaster 的主節點,地址為 192.168.1.100:6379,法定人數為 2 sentinel monitor mymaster 192.168.1.100 6379 2 # 主節點密碼(與 Redis 的 requirepass 一致) sentinel auth-pass mymaster your_redis_password # 主節點 5000 毫秒無響應視為下線 sentinel down-after-milliseconds mymaster 5000 # 故障轉移超時時間為 3 分鐘 sentinel failover-timeout mymaster 180000 # 每次允許 1 個從節點同步新主節點 sentinel parallel-syncs mymaster 1 # 關閉保護模式(允許外部訪問) protected-mode no # 哨兵節點間通信密碼(可選) requirepass "your_sentinel_password"
docker-compose.yaml
version: "3.7" services: redis-master: image: redis:latest container_name: redis-master ports: - "6379:6379" volumes: - redis_master_data:/data - ./redis-master.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf # 告訴 Docker 在啟動容器時運行redis-server命令,并且使用/usr/local/etc/redis/redis.conf這個配置文件來啟動 Redis 服務。 networks: - redisnet redis-slave1: image: redis:latest container_name: redis-slave1 ports: - "6380:6379" volumes: - redis_slave1_data:/data - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf depends_on: - redis-master networks: - redisnet redis-slave2: image: redis:latest container_name: redis-slave2 ports: - "6381:6379" volumes: - redis_slave2_data:/data - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf depends_on: - redis-master networks: - redisnet redis-sentinel1: image: redis:latest container_name: redis-sentinel1 ports: - "26379:26379" volumes: - redis_sentinel1_data:/data - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf depends_on: - redis-master - redis-slave1 - redis-slave2 networks: - redisnet command: redis-sentinel /usr/local/etc/redis/sentinel.conf redis-sentinel2: image: redis:latest container_name: redis-sentinel2 ports: - "26380:26379" volumes: - redis_sentinel2_data:/data - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf networks: - redisnet depends_on: - redis-master - redis-slave1 - redis-slave2 command: redis-sentinel /usr/local/etc/redis/sentinel.conf redis-sentinel3: image: redis:latest container_name: redis-sentinel3 ports: - "26381:26379" volumes: - redis_sentinel3_data:/data - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf depends_on: - redis-master - redis-slave1 - redis-slave2 networks: - redisnet command: redis-sentinel /usr/local/etc/redis/sentinel.conf networks: redisnet: driver: bridge volumes: redis_master_data: redis_slave1_data: redis_slave2_data: redis_sentinel1_data: redis_sentinel2_data: redis_sentinel3_data:
哨兵之間的常見問題
在 Redis 哨兵(Sentinel)模式中,哨兵不僅監聽主節點,還會自動發現并監控所有從節點和其他哨兵節點。以下是哨兵的監控范圍和詳細工作機制:
1. 哨兵的監控對象
| 監控對象 | 說明 |
|---|---|
| 主節點(Master) | 核心監控目標,哨兵通過定期心跳檢測主節點健康狀態。 |
| 從節點(Slave) | 自動發現主節點的所有從節點,并監控其在線狀態和復制延遲。 |
| 其他哨兵節點 | 哨兵之間互相通信,組成分布式集群,共同決策故障轉移。 |
2. 哨兵如何發現從節點和其他哨兵?
-
從節點的發現:
哨兵通過向主節點發送INFO REPLICATION命令,獲取主節點的從節點列表,隨后與每個從節點建立連接并監控。bash復制# 主節點返回的示例信息(包含從節點地址) # Replication role:master connected_slaves:2 slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0 slave1:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=1 -
其他哨兵的發現:
哨兵通過向主節點的__sentinel__:helloPub/Sub 頻道發布自身信息,其他哨兵訂閱該頻道以互相發現。bash復制# 哨兵發布的消息格式 [sentinel_ip,sentinel_port,sentinel_runid,current_epoch] master_name,master_ip,master_port,config_epoch
3. 哨兵的監控行為
對主節點的監控
-
心跳檢測:
哨兵每隔sentinel down-after-milliseconds配置的時間(默認 30 秒)向主節點發送PING命令,檢測其是否存活。 -
角色驗證:
哨兵定期檢查主節點是否仍為role:master,防止配置錯誤或手動干預導致角色異常。
對從節點的監控
-
復制狀態檢查:
哨兵驗證從節點是否正常復制主節點數據(通過INFO REPLICATION檢查master_link_status)。 -
數據同步延遲監控:
哨兵記錄從節點的復制偏移量(offset),用于選擇新主節點時優先選擇數據最新的從節點。
對其他哨兵的監控
-
存活檢測:
哨兵定期與其他哨兵通信,確保集群多數派存活,避免因網絡分區導致腦裂。 -
配置同步:
哨兵通過共識協議(如 Raft)同步主節點狀態和故障轉移決策。
4. 哨兵的核心職責
-
主節點健康檢測:
判斷主節點是否客觀下線(ODOWN)。 -
自動故障轉移:
選舉新主節點并更新集群配置。 -
配置傳播:
通知客戶端和其他節點新主節點的地址。 -
從節點管理:
監控從節點狀態,確保數據一致性。
5. 示例場景
-
初始狀態:
-
主節點:
Master:192.168.1.100:6379 -
從節點:
Slave1:192.168.1.101:6379、Slave2:192.168.1.102:6379 -
哨兵:
Sentinel1:192.168.1.200:26379、Sentinel2:192.168.1.201:26379
-
-
主節點故障后:
-
哨兵檢測到主節點不可達,觸發故障轉移。
-
哨兵選擇
Slave1為新主節點,并通知Slave2切換復制源。 -
原主節點恢復后,哨兵將其設置為
Slave1的從節點。
-
6. 配置參數
在哨兵配置文件(sentinel.conf)中,以下參數控制監控行為:
# 監控主節點 sentinel monitor mymaster 192.168.1.100 6379 2 # 主節點無響應 5 秒后標記為“主觀下線” sentinel down-after-milliseconds mymaster 5000 # 從節點優先級(值越小優先級越高) sentinel slave-priority mymaster 50
總結
-
監控范圍:
哨兵同時監控主節點、從節點和其他哨兵,確保集群狀態全面可見。 -
核心目標:
通過多維度監控和自動化決策,保障 Redis 集群的高可用性和數據一致性。 -
配置要點:
合理設置down-after-milliseconds和quorum,避免誤判和腦裂。
浙公網安備 33010602011771號