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