Redis 哨兵模式部署--docker版本

redis sentinel 簡介

Redis Sentinel 是 Redis 官方提供的高可用(HA)解決方案,用于監控主從架構中的故障并自動完成故障轉移。當主節點(Master)宕機時,Sentinel 能自動選舉新的主節點,通知從節點(Slave)和客戶端更新配置,實現服務無縫切換。其核心功能包括:

  1. 監控:持續檢查 Redis 主從節點的健康狀態
  2. 自動故障轉移:主節點故障時,自動將從節點提升為主節點。
  3. 配置提供:為客戶端動態推送最新的主節點地址。
  4. 通知:通過 API 通知管理員節點故障信息。

本次使用 1主 + 2從 + 3 Sentinel 的架構進行部署。

準備環境

  • 獲取 redis docker 鏡像

    docker pull redis:7.4.4
    docker images
    
  • 創建目錄 /home/docker/redis-sentinel,將后續相關的配置文件都集中存放在該目錄

    mkdir -p /home/docker/redis-sentinel
    
  • 依次創建 master、salve、sentinel的目錄文件夾

    mkdir -p /home/docker/redis-sentinel/master-data
    mkdir -p /home/docker/redis-sentinel/salve1-data
    mkdir -p /home/docker/redis-sentinel/salve2-data
    mkdir -p /home/docker/redis-sentinel/sentinel1-data
    mkdir -p /home/docker/redis-sentinel/sentinel2-data
    mkdir -p /home/docker/redis-sentinel/sentinel3-data
    
  • 創建用于 redis 通信的專屬 bridge

    docker network create --driver bridge --subnet 172.16.0.0/24 --gateway 172.16.0.1 redis-bridge
    
  • 查看是否創建成功

    docker network ls
    

關于 docker 網絡

參考文檔:https://outmanzzq.github.io/2019/10/22/docker-network/

docker 默認有三個網絡,可以通過 docker network ls 查看

NETWORK ID     NAME           DRIVER    SCOPE
9ac8281b182c   bridge         bridge    local
99abdb470354   host           host      local
8e983d1c7d86   none           null      local

Docker 內置這三個網絡,運行容器時,你可以使用該 –network 標志來指定容器應連接到哪些網絡;如果不指定,則docker默認使用--network=bridge

docker run --network=host
  • Host:與宿主機在同一個網絡,沒有獨立IP;
  • None:該模式將容器放置在它自己的網絡棧中,但是并不進行任何配置。相當于關閉了容器的網絡功能;
  • Bridge:容器連接到 docker0 虛擬網卡,通過 docker0 網橋以及 Iptables nat 表配置與宿主機通信;

通過 ifconfig 可以查看到 docker0

在這里插入圖片描述

在 bridge 模式下,連在同一網橋上的容器可以相互通信,本文的 docker 配置將基于 bridge 模式。

單個容器分開部署

啟動 master

  • 創建主節點啟動配置文件,vim /home/docker/redis-sentinel/redis-master.conf

    # redis-master.conf# 是否為守護進程
    daemonize no
    # 指定 redis 啟動端口
    port 6379
    bind 0.0.0.0# 設置連接密碼
    requirepass 123456
    # 從節點連接主節點時使用的密碼
    masterauth 123456# 使用 aop 持久化
    appendonly yes
    
  • 啟動 redis 鏡像

    docker run -it -d --name redis-master \--net=redis-bridge \--ip 172.16.0.10 \-p 6379:6379 \-v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/master-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf# -it:允許在啟動時附加終端查看日志或調試(如未配置 -d 時),但此處與 -d 共存,實際以守護模式運行,可能用于保留日志輸出能力。
    # -d: 后臺運行容器,返回容器 ID,不阻塞當前終端。
    # --name redis-master: 指定容器的名稱
    # --network redis-bridge:指定容器啟動網絡,方便后續容器之間的通信
    # -p 6379:6379:端口映射,將宿主機 6379 端口映射到容器的 6379 端口
    # -v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf:掛載宿主機文件到容器內,將宿主機配置文件掛載至容器內 Redis 默認配置路徑,覆蓋鏡像默認配置;修改宿主機配置后,重啟容器即可生效。
    # -v /home/docker/redis-sentinel/master-data:/data:掛載宿主機目錄到容器內的 /data 目錄,Redis 持久化文件(如 dump.rdb)存儲在宿主機目錄,避免容器刪除后數據丟失
    # redis:7.4.4:指定使用的 Docker 鏡像及版本
    # redis-server /etc/redis/redis.conf:覆蓋鏡像默認的啟動命令,指定 Redis 啟動時加載的配置文件
    
  • 查看是否成功啟動

    docker ps
    
  • 進入容器

    docker exec -it redis-master redis-cli -a 123456
    

啟動 salve

  • 創建從節點啟動配置文件,vim /home/docker/redis-sentinel/redis-salve1.conf

    # redis-salve1.conf# 是否為守護進程
    daemonize no
    # 指定 redis 啟動端口
    port 6379
    bind 0.0.0.0# 設置連接密碼
    requirepass 123456
    # 從節點連接主節點時使用的密碼
    masterauth 123456# 使用 aop 持久化
    appendonly yes# 指定主節點的IP和端口,使用容器名稱即可
    replicaof redis-master 6379
    
  • 啟動從節點鏡像

    docker run -it -d --name redis-salve1 \--network redis-bridge \--ip 172.16.0.11 \-p 6479:6379 \-v /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve1-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
    
  • 查看是否啟動成功

    docker ps
    
  • 進入從容器,嘗試 set 會被拒絕

    docker exec -it redis-salve1 redis-cli -a 123456
    

    在這里插入圖片描述

  • 驗證是主從是否成功

    docker exec redis-master redis-cli -a 123456 INFO replication
    

啟動第二個從節點

  • 創建從節點啟動配置文件,vim /home/docker/redis-sentinel/redis-salve2.conf

    # redis-salve2.conf# 是否為守護進程
    daemonize no
    # 指定 redis 啟動端口
    port 6379
    bind 0.0.0.0# 設置連接密碼
    requirepass 123456
    # 從節點連接主節點時使用的密碼
    masterauth 123456# 使用 aop 持久化
    appendonly yes# 指定主節點的IP和端口,使用容器名稱即可
    replicaof 172.16.0.10 6379
    
  • 啟動從節點鏡像

    docker run -it -d --name redis-salve2 \--network redis-bridge \--ip 172.16.0.12 \-p 6579:6379 \-v /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve2-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
    

啟動 sentinel

  • 創建 sentinel 配置文件,vim /home/docker/redis-sentinel/redis-sentinel.conf

    # redis-sentinel.conf# 端口號
    port 26379daemonize no# 啟用主機名解析
    sentinel resolve-hostnames yes
    # 監控主節點,2 個 Sentinel 同意即觸發故障轉移
    sentinel monitor mymaster redis-master 6379 2
    # 主節點密碼
    sentinel auth-pass mymaster 123456
    # 5 秒無響應視為下線
    sentinel down-after-milliseconds mymaster 5000
    
  • 啟動sentinel1

    docker run -it -d --name redis-sentinel1 \--network redis-bridge \--ip 172.16.0.20 \-p 26379:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel1-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    
  • 啟動另外兩個 sentinel,只需要修改映射端口和容器名稱

    docker run -it -d --name redis-sentinel2 \--network redis-bridge \--ip 172.16.0.21 \-p 26479:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel2-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    
    docker run -it -d --name redis-sentinel3 \--network redis-bridge \--ip 172.16.0.22 \-p 26579:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel3-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
    

驗證

  • 檢測主從狀態

    docker exec -it redis-master redis-cli -a 123456 INFO replication
    

    在這里插入圖片描述

  • 查看 Sentinel 監控

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
    

docker compose 部署

按照上述步驟,可以完整的部署 docker sentinel 集群,但是需要一個個啟動和配置容器,比較麻煩,因此可以通過 docker compose 來簡化操作。

配置文件使用前邊單個容器部署中的配置。

  • 新建 docker compose 配置文件,vim /home/docker/redis-sentinel/docker-compose.yml

    networks:redis-bridge:  # 自定義網絡,確保容器互通external: truename: redis-bridgeservices:# 主節點redis-master:image: redis:7.4.4container_name: redis-mastercommand: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.10volumes:- /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/master-data:/dataports:- "6379:6379"# 從節點(2個)redis-slave1:image: redis:7.4.4container_name: redis-slave1command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.11depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve1-data:/dataports:- "6479:6379"redis-slave2:image: redis:7.4.4container_name: redis-slave2command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.12depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve2-data:/dataports:- "6579:6379"# Sentinel節點(3個)redis-sentinel1:image: redis:7.4.4container_name: redis-sentinel1command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.20volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel1-data:/dataports:- "26379:26379"redis-sentinel2:image: redis:7.4.4container_name: redis-sentinel2command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.21volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel2-data:/dataports:- "26479:26379"redis-sentinel3:image: redis:7.4.4container_name: redis-sentinel3command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.22volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel3-data:/dataports:- "26579:26379"
    
  • 啟動集群

    docker compose up -d
    
  • 查看容器啟動情況

    docker ps
    
  • 進入 master 驗證

    docker exec -it redis-master redis-cli -a 123456
    
  • 主從復制驗證

    docker exec -it redis-master redis-cli -a 123456 INFO replication
    
  • 查看 sentinel 狀態

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
    
  • 批量 停止/啟動/重起 容器

    docker compose stop|start|restart
    # 也可以停止指定容器
    docker compose stop|start|restart redis-salve2
    
  • 清理并重起服務

    docker compose stop
    docker compose rm -f
    docker compose
    

測試故障轉移

  • 查看原始主節點信息

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
    

    在這里插入圖片描述

  • 停止主節點

    docker stop redis-master
    
  • 通過容器查看是否成功停止

    docker ps
    

    在這里插入圖片描述

  • 等待10s后,再通過 sentinel 查看是否切換為新的主節點

    docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
    

    在這里插入圖片描述

  • 登錄到該從節點確認是否可以執行寫入操作

    docker exec -it redis-salve2 redis-cli -a 123456
    

    在這里插入圖片描述

  • 最后,再重新啟動 redis-master 節點,確認是否加入集群

    docker restart redis-master
    

r ps


[外鏈圖片轉存中...(img-gimuVGTV-1751711594422)]- 等待10s后,再通過 sentinel 查看是否切換為新的主節點```bash
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

[外鏈圖片轉存中…(img-OWCrEdIU-1751711594422)]

  • 登錄到該從節點確認是否可以執行寫入操作

    docker exec -it redis-salve2 redis-cli -a 123456
    

    [外鏈圖片轉存中…(img-abF4A76f-1751711594422)]

  • 最后,再重新啟動 redis-master 節點,確認是否加入集群

    docker restart redis-master
    

    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87666.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java線程中的守護線程

Java線程中的守護線程在Java中,守護線程(Daemon Thread)是一種特殊類型的線程,它在后臺運行,主要用于支持其他線程(如用戶線程)的工作。守護線程不會阻止JVM(Java虛擬機)…

Flink-狀態恢復-isRestore分析

isRestored 方法返回值依賴 restoredCheckpointId 是否為空:restoredCheckpointId 在算子狀態句柄(StreamOperatorStateHandler)中從 StreamOperatorStateContext 獲取并賦值給 StateInitializationContext(該 context 就是 initi…

rk3128 emmc顯示剩余容量為0

機器emmc 容量顯示異常,顯示剩余容量為0,這時候做了一個讓 系統不檢測GPP分區部分的操作,此問題才得以解決,如下: system/vold/DirectVolume.cpp -33,6 33,8 #include "VolumeManager.h"#include "Re…

WebAssembly國際化多語種支持

icu linux數據裁剪 先linux編譯出所有的工具 mkdir build && cd build ../configure --prefix=$(pwd)/build_wasm/install --enable-static --disable-shared --with-data-packaging=static --enable-tools=yes --enable-extras=yes --e…

Ubuntu 安裝 etcd 與 etcd-cpp-apiv3

目錄 安裝 etcd 安裝 etcd-cpp-apiv3 安裝 etcd sudo apt update sudo apt install etcd-server sudo apt install -y etcd-client 在 /etc/default/etcd 配置文件中配置,下面示例是單個服務器內進程之間交換信息且只有一個etcd節點。 #節點名稱,默認為…

Spring Boot 集成 GeoTools 詳解

目錄 一、概述二、集成優勢三、集成步驟四、使用場景五、案例:周邊設施查詢系統六、注意事項七、總結 一、概述 什么是 Spring Boot? Spring Boot 是由 Pivotal 團隊開發的基于 Spring 框架的快速開發工具,它通過自動配置、起步依賴等特性簡…

基礎知識:mysql-connector-j依賴

mysql-connector-j 是 MySQL 官方提供的 Java 數據庫連接驅動(JDBC Driver),用于在 Java 應用程序中連接和操作 MySQL 數據庫。它是 MySQL 8.0 版本之后的標準驅動名稱,替代了舊的 mysql-connector-java。 一、新舊版本對比 驅動…

vscode remote-ssh 拓展免密訪問 linux虛擬機

前置步驟,在linux安裝好ssh并且win可以使用密碼登錄linux sudo apt install openssh-server -y 在win上檢查密鑰是否存在 檢查公鑰和私鑰cat ~/.ssh/id_rsa.pubcat ~/.ssh/id_rsa 如果不存在,重新生成 ssh-keygen -t rsa -b 4096 重新執行 cat ~/.ssh/…

動手學深度學習-學習筆記【二】(基礎知識)

文章目錄 1、概述2、課程學習2.1、深度學習介紹2.2、安裝2.3、數據操作2.4、數據預處理2.5、線性代數2.6、微積分2.7、自動微分2.8、概率2.8.1、基本概率論2.8.2、處理多個隨機變量2.8.3、期望和方差 2.9、查閱文檔 1、概述 本篇博客用來記錄我學習深度學習的學習筆記&#xf…

瑞盟MS4554N/MS4554N1雙向電平轉換器重新定義混合電壓系統連接

在電子設備的“心臟”——電路系統里,不同功能模塊常因性能需求差異,采用差異化的供電電壓:傳感器用1.8V低功耗運行,主控芯片選3.3V高效處理,傳統接口保留5V穩定傳輸……當這些“電壓孤島”需要互聯時,一個…

二叉樹題解——驗證二叉搜索樹【LeetCode】后序遍歷

98. 驗證二叉搜索樹 一、算法邏輯(逐步通順講解每一步思路) 這段算法使用了一種遞歸的思路: 每個節點返回它所在子樹的 最小值和最大值,并在返回的過程中檢查 BST 的合法性。 ? 1?? 定義遞歸函數 dfs(node),其含…

Flink-Source算子點位提交問題(Earliest)

背景 最近在做 Flink 任務數據源切換時遇到 offset 消費問題,遂寫篇文章記錄下來。 切換時只修改了 source 算子的 topic,uid 等其他信息保持不變: 發布時,發現算子的消費者點位重置為earliest,導致消息積壓。消息積…

如何錄制帶備注的演示文稿(LaTex Beamer + Pympress)

參考文獻: Pympress 官網Avidemux 官網Audacity 官網FFmpeg 官網2025年度25大視頻剪輯軟件推薦2025最新音頻降噪軟件盤點,從入門到專業的6個高效工具如何用一段音頻替換mp4視頻格式的原有音頻?免費簡單易用的視頻剪切編輯工具—AvidemuxFFmp…

VS Code 的 Copilot Chat 擴展程序

安裝與啟用 Copilot Chat 擴展 在 VS Code 中打開擴展市場(快捷鍵 CtrlShiftX 或點擊左側活動欄的擴展圖標)。搜索“GitHub Copilot Chat”,點擊安裝。安裝完成后需登錄 GitHub 賬戶并授權 Copilot 權限。確保已訂閱 GitHub Copilot 服務&am…

bash 腳本比較 100 個程序運行時間,精確到毫秒,腳本

腳本如下: #!/bin/bash# 設置測試次數 NUM_TESTS100 # 設置要測試的程序路徑 PROGRAM"./your_program" # 替換為你的程序路徑 # 設置程序參數(如果沒有參數則留空) ARGS"" # 例如: "input.txt output.txt"#…

【Linux學習】Linux安裝并配置Redis

安裝Redis在Linux系統上安裝Redis可以通過包管理器或源碼編譯兩種方式進行。以下是兩種方法的詳細步驟。使用包管理器安裝Redis(以Ubuntu為例):sudo apt update sudo apt install redis-server通過源碼編譯安裝Redis:wget https:/…

redis每種數據結構對應的底層數據結構原理

Redis 的每種數據結構(String、List、Hash、Set、Sorted Set)在底層都采用了不同的實現方式,根據數據規模和特性動態選擇最優的編碼(encoding)以節省內存和提高性能。以下是詳細原理分析: 1. String(字符串) 底層實現: int:當存儲整數值且可用 long 表示時,直接使用…

WPF控件大全:核心屬性詳解

WPF常用控件及核心屬性 以下是WPF開發中最常用的控件及其關鍵屬性(按功能分類): 基礎布局控件 Grid(網格布局) RowDefinitions:行定義集合(如Height"Auto")ColumnDefinit…

馬斯克腦機接口(Neuralink)技術進展,已經實現癱瘓患者通過BCI控制電腦、玩視頻游戲、學習編程,未來盲人也能恢復視力了

目錄 圖片總結文字版總結1. 核心目標與愿景1.1 增強人類能力1.2 解決腦部疾病1.3 理解意識1.4 應對AI風險 2. 技術進展與產品2.1 Telepathy(意念操控)功能與目標技術細節參與者案例 2.2 Blindsight(視覺恢復)**功能與目標**技術細…

Vuex身份認證

雖說上一節我們實現了登錄功能,但是實際上還是可以通過瀏覽器的地址來跳過登錄訪問到后臺,這種可有可無的登錄功能使得系統沒有安全性,而且沒有意義 為了讓登錄這個功能有意義,我們應該: 應當在用戶登錄成功之后給用戶…