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查看一下容器狀態


docker ps

主從模式驗證

查看狀態

客戶端連接上master服務器,使用info replication命令查看其從服務器連接


info replication

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

從服務器是只讀的嗎

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

set b 200

在主服務器上設置一個值,從服務器能否同步

master:


set a 100

slave1:


get a

slave2:


get a

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

參考文章

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容