1. 程式人生 > 實用技巧 >Docker部署Redis主從複製模式

Docker部署Redis主從複製模式

Redis主從複製

Redis主從複製模式,是將一個redis伺服器作為master,其餘多個作為slave,從伺服器只讀不可寫,主伺服器可讀可寫,以此來讓從伺服器分擔大部分的只讀請求。主從複製模式的核心工作模式是主伺服器和從伺服器成為彼此的客戶端,這樣才能接收來自彼此的資訊進行資料同步(從伺服器也是會向主伺服器傳送資訊的,比比如偏移量,同步指令等等)。

準備環境和工具

系統環境

使用cat /etc/redhat-release檢視

CentOS Linux release 7.8.2003 (Core)

安裝docker

這個就不介紹了,網上教程太多

安裝pip3

yum -y install python3-pip

安裝docker-compose

pip3 install docker-compose

Redis配置

我的配置檔案存放路徑

/usr/local/etc/redis/master-slave

配置master

新建redis-master.conf檔案

# bind 127.0.0.1

# 啟用保護模式
# 即在沒有使用bind指令繫結具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連線
# protected-mode yes

# 監聽埠
port 6379

# 啟動時不列印logo
# 這個不重要,想看logo就開啟它
always-show-logo no

# 設定密碼認證
requirepass 123456

# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的鍵,會影響資料安全
# 另一方面 KEYS 命令會阻塞資料庫,在資料庫中儲存了大量資料時,該命令會消耗很長時間
# 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求湧入Redis,會造成Redis直接崩潰
rename-command KEYS ""

# 此外還應禁止 FLUSHALL 和 FLUSHDB 命令
# 這兩個命令會清空資料,並且不會失敗

配置slave1

新建redis-slave1.conf檔案

# bind 127.0.0.1

# 啟用保護模式
# 即在沒有使用bind指令繫結具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連線
# protected-mode yes

# 監聽埠
port 6380

# 啟動時不列印logo
# 這個不重要,想看logo就開啟它
always-show-logo no

# 設定密碼認證
requirepass 123456

# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的鍵,會影響資料安全
# 另一方面 KEYS 命令會阻塞資料庫,在資料庫中儲存了大量資料時,該命令會消耗很長時間
# 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求湧入Redis,會造成Redis直接崩潰
rename-command KEYS ""

# 此外還應禁止 FLUSHALL 和 FLUSHDB 命令
# 這兩個命令會清空資料,並且不會失敗

# 配置master節點資訊
# 格式:
#slaveof <masterip> <masterport>
# 此處masterip所指定的redis-server-master是執行master節點的容器名
# Docker容器間可以使用容器名代替實際的IP地址來通訊
slaveof 127.0.0.1 6379

# 設定連線主節點所使用的密碼
masterauth "123456"

配置slave2

新建redis-slave2.conf檔案

# bind 127.0.0.1

# 啟用保護模式
# 即在沒有使用bind指令繫結具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連線
# protected-mode yes

# 監聽埠
port 6381

# 啟動時不列印logo
# 這個不重要,想看logo就開啟它
always-show-logo no

# 設定密碼認證
requirepass 123456

# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的鍵,會影響資料安全
# 另一方面 KEYS 命令會阻塞資料庫,在資料庫中儲存了大量資料時,該命令會消耗很長時間
# 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求湧入Redis,會造成Redis直接崩潰
rename-command KEYS ""

# 此外還應禁止 FLUSHALL 和 FLUSHDB 命令
# 這兩個命令會清空資料,並且不會失敗

# 配置master節點資訊
# 格式:
#slaveof <masterip> <masterport>
# 此處masterip所指定的redis-server-master是執行master節點的容器名
# Docker容器間可以使用容器名代替實際的IP地址來通訊
slaveof 127.0.0.1 6379

# 設定連線主節點所使用的密碼
masterauth "123456"

Docker-compose配置

我的配置檔案存放路徑

/usr/local/etc/redis/master-slave

docker-compose配置檔案

新建docker-compose.yml檔案

---

version: '3'

services:
  # 主節點的容器
  redis-server-master:
    image: redis
    container_name: redis-server-master
    restart: always
    # 為了規避Docker中埠對映可能帶來的問題
    # 這裡選擇使用host網路
    network_mode: host
    # 指定時區,保證容器內時間正確
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      # 對映配置檔案和資料目錄
      - ./redis-master.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-master:/data
    sysctls:
      # 必要的核心引數
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 從節點1的容器
  redis-server-slave-1:
    image: redis
    container_name: redis-server-slave-1
    restart: always
    network_mode: host
    depends_on:
      - redis-server-master
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-1:/data
    sysctls:
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # 從節點2的容器
  redis-server-slave-2:
    image: redis
    container_name: redis-server-slave-2
    restart: always
    network_mode: host
    depends_on:
      - redis-server-master
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-2:/data
    sysctls:
      net.core.somaxconn: '511'
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

啟動容器

在docker-compose.yml這個配置檔案的目錄下執行docker-compose up命令

啟動成功以後使用docker ps檢視一下容器狀態

主從模式驗證

檢視狀態

客戶端連線上master伺服器,使用info replication命令檢視其從伺服器連線

connnected_slave:2 表示現在有兩個從伺服器正常連線
slave0和slave1分別顯示兩個從伺服器的ip和port,以及偏移量等等

從伺服器是隻讀的嗎

直接在從伺服器上驗證一下即可

在主伺服器上設定一個值,從伺服器能否同步

master:

slave1:

slave2:

可以看到從伺服器是同步成功的。

參考文章

使用 Docker 配置 Redis 主從複製
Redis持久化之RDB持久化
Redis主從複製新舊複製功能變化
docker-compose安裝---pip3