實戰使用docker compose 搭建 Redis 主從復制集群

文章目錄

    • 前言
    • 技術積累
      • 1、Redis 主從復制機制
      • 2、Docker Compose 編排
      • 3、 Redis 配置文件定制
      • 4、 驗證主從狀態
      • 5、 自動化部署與維護
    • 環境準備
    • 實戰演示
      • 創建redis目錄及配置
        • 1、創建redis目錄
        • 2、創建redis配置文件
      • 啟動redis集群服務
        • 1、創建docker-compose編排文件
        • 2、編排docker-compose
      • 驗證Redis集群主從復制
      • Redis集群數據持久化驗證
    • 總結

前言

隨著互聯網應用的快速發展,高并發訪問和數據緩存的需求日益增長。Redis 作為一款高性能的內存數據庫,廣泛應用于緩存、消息隊列、分布式鎖等場景。為了提升 Redis 的可用性和讀寫性能,通常采用主從復制架構來實現讀寫分離。本次實戰通過 Docker Compose 快速搭建一個 Redis 主從復制集群,模擬生產環境中 Redis 高可用架構的基礎部署方式。通過該實踐,可以更好地理解 Redis 主從復制機制、Docker 容器編排以及服務間通信原理。

技術積累

1、Redis 主從復制機制

在這里插入圖片描述

  • Redis 主從復制是異步復制,默認情況下從節點連接到主節點后會進行一次全量同步(RDB dump),之后進行增量同步(AOF 或 repl-backlog)。
  • 從節點可處理讀請求,減輕主節點壓力,適用于讀多寫少的場景。
  • 支持鏈式復制,即從節點也可以作為其他從節點的主節點。
  • 普通主從集群沒有自動故障轉移,這個是最大的缺點

2、Docker Compose 編排

  • 使用 docker-compose.yml 文件定義多個容器服務,實現 Redis 主從節點的快速部署。
  • 通過自定義網絡(networks)確保容器間可通過服務名互相訪問。
  • 可掛載本地目錄作為配置文件或持久化存儲,便于調試和數據保留。

3、 Redis 配置文件定制

  • 在從節點配置中添加 replicaof 指令,指定其主節點地址。
  • 可設置只讀模式(slave-read-only yes)、連接超時時間、密碼認證等安全策略。

4、 驗證主從狀態

  • 進入 Redis 容器執行 redis-cli info replication 查看主從狀態信息。
  • 主節點顯示連接的從節點數量,從節點顯示其所屬主節點的信息。

5、 自動化部署與維護

  • 利用 Docker 的健康檢查功能(healthcheck)監控 Redis 狀態。
  • 通過 shell 腳本或 CI/CD 工具實現一鍵部署與擴容。

環境準備

  • 安裝 docker
  • 安裝 docker compose

實戰演示

本地演示使用windows11 docker desktop 環境,有條件的可以使用Linux自動安裝docker環境。

創建redis目錄及配置

1、創建redis目錄

主從集群目錄結構如下所示:

  • master-slave
    • redis-master
      • data
      • conf
        • redis.conf
    • redis-slave1
      • data
      • conf
        • redis.conf
    • redis-slave2
      • data
      • conf
        • redis.conf
    • docker-compose.yaml
2、創建redis配置文件
  • master 主節點: redis.conf
# 主節點配置
# 綁定的主機地址
bind 0.0.0.0
# 允許外網訪問
protected-mode no
# 啟用守護進程后,Redis會把pid寫到一個pidfile中,在/var/run/redis.pid
daemonize no
# 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
pidfile /var/run/redis.pid
# 指定Redis監聽端口,默認端口為6379
# 如果指定0端口,表示Redis不監聽TCP連接
port 6379
# 當客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能
timeout 0
# 指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose
# debug (很多信息, 對開發/測試比較有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose
# 日志記錄方式,默認為標準輸出,如果配置為redis為守護進程方式運行,而這里又配置為標準輸出,則日志將會發送給/dev/null
logfile redis.log################################ SNAPSHOTTING  #################################
# RDB存儲配置
# 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   滿足以下條件將會同步數據:
#   900秒(15分鐘)內有1個更改
#   300秒(5分鐘)內有10個更改
#   60秒內有10000個更改
#   Note: 可以把所有“save”行注釋掉,這樣就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
rdbcompression yes
# 指定本地數據庫文件名,默認值為dump.rdb
dbfilename dump.rdb
# 指定本地數據庫存放目錄,文件名由上一個dbfilename配置項指定
dir /data################################# REPLICATION ################################################################### SECURITY ###################################
# 設置密碼
requirepass 123456789############################## APPEND ONLY MODE ###############################
# 開啟aof配置
appendonly yes
# 指定更新日志條件,共有3個可選值:
# no:表示等操作系統進行數據緩存同步到磁盤(快)
# always:表示每次更新操作后手動調用fsync()將數據寫到磁盤(慢,安全)
# everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
# 指定更新日志文件名,默認為appendonly.aof
appendfilename "appendonly.aof"
  • slave1 從節點1 : redis.conf
# 從節點配置
# 綁定的主機地址
bind 0.0.0.0
# 允許外網訪問
protected-mode no
# 啟用守護進程后,Redis會把pid寫到一個pidfile中,在/var/run/redis.pid
daemonize no
# 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
pidfile /var/run/redis.pid
# 指定Redis監聽端口,默認端口為6379
# 如果指定0端口,表示Redis不監聽TCP連接
port 6379
# 當客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能
timeout 0
# 指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose
# debug (很多信息, 對開發/測試比較有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose
# 日志記錄方式,默認為標準輸出,如果配置為redis為守護進程方式運行,而這里又配置為標準輸出,則日志將會發送給/dev/null
logfile redis.log################################ SNAPSHOTTING  #################################
# RDB存儲配置
# 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   滿足以下條件將會同步數據:
#   900秒(15分鐘)內有1個更改
#   300秒(5分鐘)內有10個更改
#   60秒內有10000個更改
#   Note: 可以把所有“save”行注釋掉,這樣就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
rdbcompression yes
# 指定本地數據庫文件名,默認值為dump.rdb
dbfilename dump.rdb
# 指定本地數據庫存放目錄,文件名由上一個dbfilename配置項指定
dir /data################################# REPLICATION #################################
# 設置當本機為slav服務時,設置master服務的ip地址及端口,在Redis啟動時,它會自動從master進行數據同步
replicaof redis-master 6379
# 開啟只讀模式
replica-read-only yes
# 當master服務設置了密碼保護時,slav服務連接master的密碼
masterauth 123456789repl-diskless-load on-empty-db################################## SECURITY ###################################
# 設置密碼
requirepass 123456789############################## APPEND ONLY MODE ###############################
# 開啟aof配置
appendonly yes
# 指定更新日志條件,共有3個可選值:
# no:表示等操作系統進行數據緩存同步到磁盤(快)
# always:表示每次更新操作后手動調用fsync()將數據寫到磁盤(慢,安全)
# everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
# 指定更新日志文件名,默認為appendonly.aof
appendfilename "appendonly.aof"
  • slave2 從節點2: redis.conf和 slave1 從節點1 配置一致,復制一份即可。

啟動redis集群服務

1、創建docker-compose編排文件
  • 創建 docker-compose.yaml
version: '3.8'services:redis-master:image: redis:6-alpinecontainer_name: redis-masterenvironment:- "TZ=Asia/Shanghai"ports:- "6377:6379"volumes:- ./redis-master/conf/redis.conf:/usr/local/etc/redis/redis.conf- ./redis-master/data:/datacommand: redis-server /usr/local/etc/redis/redis.confnetworks:- redis-master-slaveredis-slave1:image: redis:6-alpinecontainer_name: redis-slave1environment:- "TZ=Asia/Shanghai"ports:- "6380:6379"volumes:- ./redis-slave1/conf/redis.conf:/usr/local/etc/redis/redis.conf- ./redis-slave1/data:/datacommand: redis-server /usr/local/etc/redis/redis.confdepends_on:- redis-masternetworks:- redis-master-slaveredis-slave2:image: redis:6-alpinecontainer_name: redis-slave2environment:- "TZ=Asia/Shanghai"ports:- "6381:6379"volumes:- ./redis-slave2/conf/redis.conf:/usr/local/etc/redis/redis.conf- ./redis-slave2/data:/datacommand: redis-server /usr/local/etc/redis/redis.confdepends_on:- redis-masternetworks:- redis-master-slavenetworks:redis-master-slave:driver: bridge
2、編排docker-compose
  • 運行 docker-compose.yaml
docker-compose -f docker-compose.yaml up -d
  • 查看redis集群容器
docker ps -a

在這里插入圖片描述

驗證Redis集群主從復制

  • 檢查主節點信息
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a 123456789 info replication

執行上述命令,得到以下輸出:role表示角色,connected_slaves表示副本數

# Replication
role:master
connected_slaves:2
slave0:ip=172.20.0.3,port=6379,state=online,offset=603741,lag=0
slave1:ip=172.20.0.4,port=6379,state=online,offset=603741,lag=0
master_failover_state:no-failover
master_replid:149762551ed827fe20934a1917ba22acffdd96f2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:603741
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:603741

在這里插入圖片描述

  • 檢查從節點1信息
docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 info replication

執行上述命令,得到以下輸出:role表示角色,master_link_status表示是否連接成功,up表示成功,down表示失敗

# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:603811
slave_repl_offset:603811
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:149762551ed827fe20934a1917ba22acffdd96f2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:603811
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:603811

在這里插入圖片描述

  • 檢查從節點2信息
docker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 info replication

執行上述命令,得到以下輸出:role表示角色,master_link_status表示是否連接成功,up表示成功,down表示失敗

# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:603853
slave_repl_offset:603853
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:149762551ed827fe20934a1917ba22acffdd96f2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:603853
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:603853

在這里插入圖片描述

Redis集群數據持久化驗證

  • 寫入數據到主節點
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a 123456789 SET name "test_senfel_data"
  • 主節點讀取數據查看是否設置成功
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
  • 從節點1讀取數據,查看是否同步
docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
  • 從節點2讀取數據,查看是否同步
docker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
PS C:\Users\user> docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a 123456789 SET name "test_senfel_data"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
PS C:\Users\user> docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_senfel_data"
PS C:\Users\user> docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_senfel_data"
PS C:\Users\user> docker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_senfel_data"

在這里插入圖片描述

總結

本次實戰成功利用 Docker Compose 搭建了一個 Redis 主從復制環境,可以掌握Redis 主從復制的基本原理與配置方法,Docker Compose 多服務容器編排的能力,以及Redis 服務的容器化部署與管理。但是普通主從復制雖然可以提升讀性能和數據冗余功能,卻不能實現高可用的,因為它并沒有實現自動故障轉移。故下一期我們將繼續實戰可自動故障轉移的哨兵模式,敬請鑒賞。

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

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

相關文章

【學習筆記】RTSP-Ovnif-GB28181

【學習筆記】RTSP-Ovnif-GB28181 一、RTSP_RTP_RTCP RTSP&#xff08;Real Time Streaming Protocol&#xff09;&#xff0c;RFC2326&#xff0c;實時流傳輸協議&#xff0c;是TCP/IP協議體系中的一個應用層協議。 RTP協議詳細說明了在互聯網上傳遞音頻和視頻的標準數據包格…

stm32-c8t6實現語音識別(LD3320)

目錄 LD3320介紹&#xff1a; 功能引腳 主要特色功能 通信協議 端口信息 開發流程 stm32c8t6代碼 LD3320驅動代碼&#xff1a; LD3320介紹&#xff1a; 內置單聲道mono 16-bit A/D 模數轉換內置雙聲道stereo 16-bit D/A 數模轉換內置 20mW 雙聲道耳機放大器輸出內置 5…

RAG技術全解析:從概念到實踐,構建高效語義檢索系統——嵌入模型與向量數據庫搭建指南

一、RAG技術概述&#xff1a;為什么需要RAG&#xff1f; 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一種結合檢索與生成能力的AI架構。其核心思想是通過外部知識庫動態增強大語言模型&#xff08;LLM&#xff09;的生成能力&…

【資源分享】手機玩轉經典游戲!小雞模擬器1.9.0:PSP/NDS/GBA完美運行!

阿燦今天給大家推薦一款小雞模擬器&#xff0c;這是一個老款PC和掌上游戲機模擬器。完美模擬街機&#xff08;fbamamemameplus).PS、PSP、FC(NES)SFC(SNES)、GBA、GBC、MD、NDS、DC、NGP、WS (WSC) PCE、ONS 等18款經典掌機游戲機。小雞模擬器同時也提供海量熱門的漢化版游戲免…

matlab脈沖信號并繪制波形2025.6.11

以下是一個使用MATLAB生成5V、10MHz脈沖信號并繪制波形的示例代碼: % 5V 10MHz脈沖信號仿真 clc; clear; close all; % 參數設置 voltage = 5; % 信號幅度(V) frequency = 10e6; % 脈沖頻率(10MHz) duty_cycle =

ElasticJob初探

依賴版本 JDK版本是&#xff1a;jdk17 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>zookeeper elasticjo…

【Vue3】(三)vue3中的pinia狀態管理、組件通信方式及總結、插槽

目錄 一、vue3的pinia 1、什么是pinia&#xff1f; 2、為什么Vue3選擇pinia&#xff1f; 3、使用pinia的好處 4、安裝pinia 2、項目配置 3、存儲/讀取pinia中的數據 4、修改pinia中的數據 5、storeToRefs&#xff08;保持store中數據的響應式&#xff09; 6、getters 7、…

WEB3全棧開發——面試專業技能點P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循環 Node.js 的事件循環&#xff08;Event Loop&#xff09;是其異步編程的核心機制&#xff0c;它使得 Node.js 可以在單線程中實現非阻塞 I/O 操作。 &#x1f501; 簡要原理 Node.js 是基于 libuv 實現的&#xff0c;它使用事件循環來處理非阻塞操作。事件…

大數據學習棧記——Neo4j的安裝與使用

本文介紹圖數據庫Neofj的安裝與使用&#xff0c;操作系統&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安裝 Neofj可以進行官網安裝&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我這里安裝是添加軟件源的方法 最新版…

web架構4------(nginx常用變量,nginx中英文自動匹配,lnmp網站架構,正向代理,反向代理,負載均衡)

一.前言 本期來介紹nginx最后幾個知識點&#xff0c;看著要說的內容很多&#xff0c;其實一點也不多&#xff0c;都是所見即所得的東西。 二.nginx常用變量 2.1 常用變量 $args 請求中的參數&#xff0c;也叫查詢參數&#xff0c;如www.123.com/1.php?a1&b2的$args就是…

openeuler系統(CentOs)圖形化桌面黑屏/丟失(開啟VNC服務沖突)

1. VNC服務開啟如下&#xff1a; https://zhuanlan.zhihu.com/p/5049263261 在centos8系統上使用tigervnc-server搭建VNC_centos8 tigervnc-server-CSDN博客 2. 上述操作完成后&#xff0c;連接VNC仍會出現黑屏&#xff0c;則需要編輯/root/.vnc/xstartup&#xff1a; [運維…

MySQL:Prepared Statement 預處理語句

預處理語句&#xff08;Prepared Statements&#xff09;是 MySQL 中一種用于執行 SQL 查詢的高效、安全的方法。通過使用預處理語句&#xff0c;可以顯著提升查詢性能&#xff0c;并防止 SQL 注入攻擊。本文將詳細介紹 MySQL 預處理語句的概念、使用方法及其優勢。 一、預處理…

EPPLUS——CAD c#讀寫EXCEL的第三方庫

EPPLUS(可支持NET35) 在 CAD 的 C# 二次開發中&#xff0c;使用 EPPLUS 庫處理 Excel 文件具有以下顯著優點&#xff0c;尤其在兼容性、便捷性和性能等方面契合 CAD 項目的需求&#xff1a; 1. 跨.NET 版本兼容性強&#xff0c;適配 CAD 多環境部署 多框架支持&#xff1a;EP…

Linux知識回顧總結----進程狀態

本章將會介紹進程的一些概念&#xff1a;馮諾伊曼體系結構、進程是什么&#xff0c;怎么用、怎么表現得、進程空間地址、物理地址、虛擬地址、為什么存在進程空間地址、如何感性得去理解進程空間地址、環境變量是如何使用的。 目錄 1. 馮諾伊曼體系結構 1.1 是什么 1.2 結論 …

微信小程序之bind和catch

這兩個呢&#xff0c;都是綁定事件用的&#xff0c;具體使用有些小區別。 官方文檔&#xff1a; 事件冒泡處理不同 bind&#xff1a;綁定的事件會向上冒泡&#xff0c;即觸發當前組件的事件后&#xff0c;還會繼續觸發父組件的相同事件。例如&#xff0c;有一個子視圖綁定了b…

Android Test3 獲取的ANDROID_ID值不同

Android Test3 獲取的ANDROID_ID值不同 這篇文章來說明上一篇文章中說到的一個現象&#xff1a;在同一個項目中&#xff0c;創建不同的 app module&#xff0c;運行同一段測試代碼&#xff0c;獲取到的 ANDROID_ID 的值不同。 我也是第一次認真研究這個現象&#xff0c;這個還…

JSON 和 LabVIEW Data Types 互相轉換

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本對應關系怎么看?

docker和docker-compose的版本對應關系怎么看&#xff1f;最近在安裝這兩個工具&#xff0c;像知道他們的版本對應關系&#xff0c;查了不少資料才找到。 雖然 Docker 和 Docker Compose 的版本并不嚴格綁定&#xff0c;但是在某些情況下&#xff0c;新版本的 Docker Compose …

郵科ODM攝像頭:多維度護航高鐵安全系統方案解析

?高鐵作為現代交通的重要支柱&#xff0c;其安全穩定運行依賴于高效的監控體系。攝像頭系統作為高鐵安全管理的“視覺感知中樞”&#xff0c;憑借多場景覆蓋、智能分析以及環境適應性設計&#xff0c;在行車安全、設備維護、乘客服務等方面發揮著不可或缺的作用。本文將從技術…

盒模型小全

CSS盒子模型詳解 1. 定義 CSS盒子模型是用于描述HTML元素在頁面中布局和表現的核心概念之一。在CSS中&#xff0c;所有HTML元素都被視為一個矩形的盒子&#xff0c;這些盒子封裝了周圍的HTML元素&#xff0c;并允許在其他元素和周圍元素邊框之間的空間放置內容。 2. 組成部分…