主从复制
配置
修改配置文件
Master
protected-mode no
Worker
# 从服务器添加(527行): replicaof <masterip> <masterport>
replicaof 103.36.222.30 36379
# 任意地址访问 ==> 这个主节点也要配置
protected-mode no
# 从服务器添加 主服务器密码(536行)
masterauth PySuper
# 从服务器添加 主服务器用户名(536行)
# masteruser pingpong
# 这里不修改,docker映射不进来
port 16379
校验
# 在一台redis服务器上执行查看: -a后面跟的是密码
redis-cli -h 103.36.222.30 -p 63079 -a PySuper info replication
redis-cli -h 156.238.247.211 -p 16379 -a PySuper info replication
Sentinel
这里要修改这个文件,直接映射文件会报错:Device or resource busy
解决方法:
修改sentinel.conf的权限: chmod 666 sentinel.conf
不能直接映射文件,需要先创建文件夹,然后再映射
建议用 docker-compose 来创建,更方便
sentinel.conf
# 哨兵实例的端口
port 26379
# 绑定地址,确保哨兵可以监听所有网络接口
bind 0.0.0.0
# 监控的主节点名称、IP 和端口,最后一个参数是法定人数
sentinel monitor mymaster 103.36.222.30 63079 2
# 主节点被认为失效的时间(毫秒)
sentinel down-after-milliseconds mymaster 5000
# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 10000
# 在故障转移时,最多可以同时对多少个从节点进行同步
sentinel parallel-syncs mymaster 1
# 设置哨兵的日志文件
logfile "/var/log/redis/sentinel.log"
# 设置哨兵的持久化文件
dir "/var/lib/redis"
# 设置哨兵的配置文件路径
sentinel config-epoch mymaster 0
# 为主节点设置密码
sentinel auth-pass mymaster PySuper
# 设置哨兵的通知脚本(可选)
# sentinel notification-script mymaster /path/to/notification-script.sh
# 设置哨兵的客户端重配置脚本(可选)
# sentinel client-reconfig-script mymaster /path/to/reconfig-script.sh
docker run
# 创建相关文件
mkdir sentinel && cd sentinel && mkdir redis && touch sentinel.conf && touch sentinel.log
docker run -dit \
--name sentinel \
-h sentinel \
-p 26379:26379 \
-v $PWD/redis:/var/lib/redis \
-v $PWD/sentinel.conf:/etc/redis/sentinel.conf \
-v $PWD/sentinel.log:/var/log/redis/sentinel.log \
--restart=on-failure \
redis:7.4.1 \
redis-sentinel /etc/redis/sentinel.conf
docker-compose.yaml
使用docker-compose会便于管理,但是这样三个哨兵就都在同一节点上了
其实使用Kubernetes的话更好一些,可以在服务器集群上管理各个哨兵
services:
sentinel1:
image: 'redis:7.4.1'
container_name: sentinel-1
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- $PWD/conf-1:/etc/redis
ports:
- 26379:26379
sentinel2:
image: 'redis:7.4.1'
container_name: sentinel-2
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- $PWD/conf-2:/etc/redis
ports:
- 26380:26379
sentinel3:
image: 'redis:7.4.1'
container_name: sentinel-3
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- $PWD/conf-3:/etc/redis
ports:
- 26381:26379
# 启动
docker-compose up -d
# 查看日志
docker-compose logs
# 重启
docker-compose restart
# 停止
docekr-compose stop
# 删除
docker-compose rm
校验
# 进入redis-sentinel容器
docker exec -it sentinel bash
# 执行命令
redis-cli -p 26379 sentinel masters
# 连接到 Sentinel 实例
redis-cli -h 103.36.222.30 -p 26379
# 查看主节点信息
SENTINEL masters
# 查看从节点信息
SENTINEL slaves mymaster
# 查看 Sentinel 实例信息
SENTINEL sentinels mymaster
其他命令
# 在一台redis服务器上执行查看: -a后面跟的是密码
redis-cli -h 103.36.222.30 -p 63079 -a PySuper info replication
redis-cli -h 156.238.247.211 -p 16379 -a PySuper info replication
redis-cli -h 156.238.247.211 -p 16379 -a PySuper SLAVEOF NO ONE
redis-cli -h 156.238.247.211 -p 16379 -a PySuper SLAVEOF 103.36.222.30 63079
redis-cli -h 156.238.247.211 -p 16379 -a PySuper CONFIG GET slave-priority
# 通过redis-sentinel命令查看集群信息
# 进入redis-sentinel容器
docker exec -it sentinel-1 bash
# 执行命令
redis-cli -p 26379 sentinel masters
# 连接到 Sentinel 实例
redis-cli -h 103.36.222.30 -p 26379 SENTINEL masters
redis-cli -h 103.36.222.30 -p 26379 SENTINEL slaves mymaster
redis-cli -h 103.36.222.30 -p 26379 SENTINEL RESET mymaster
# 查看主节点信息
SENTINEL masters
# 查看从节点信息
SENTINEL slaves mymaster
# 查看 Sentinel 实例信息
SENTINEL sentinels mymaster
Python连接
import time
from redis import Sentinel
# 创建 Sentinel 实例,连接到 Redis 哨兵集群
# 第一个参数为 Redis 哨兵集群的地址和端口,可以有多个哨兵地址,格式为:(ip, port)
# 第二个参数为 socket_timeout 超时时间
sentinel = Sentinel(
[
("103.36.222.30", 26379),
("103.36.222.30", 26380),
("156.238.247.211", 26381),
],
socket_timeout=1,
)
def get_master_address(sentinel, master_name):
try:
master = sentinel.discover_master(master_name)
return master
except Exception as e:
print(f"Error: {e}")
return None
while True:
master = get_master_address(sentinel, "Master")
if master:
print(master)
time.sleep(5)
评论区