使用两台云服务器,在 Docker 下部署。
Redis版本为:7.2.4
下载并配置redis 配置文件
下载
wget -c http://download.redis.io/redis-stable/redis.conf
配置
master节点配置
bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑安全性
requirepass 123456 # 设置master连接密码,slave可省略
appendonly yes # 是否开启 AOF 持久化
这里需要开启AOF
,保证写命令及时同步到从节点。
slave节点配置
bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑安全性
replicaof 192.168.12.30 6379 # 主节点ip 端口
masterauth 123456 # slave连接master密码,master可省略
在 Redis 5.0 及之后的版本中,建议使用 replicaof
命令来设置主从复制关系,slaveof
命令已经被标记为废弃,但仍然可以使用。
slaveof
命令在 Redis 6.0 及之后的版本中将被完全删除。
启动
启动前创建目录进行文件挂载
# 配置文件存放目录,将redis.conf文件移动到该目录
mkdir -p /root/docker-data/redis/config
# 数据存放目录
mkdir -p /root/docker-data/redis/data
在两台服务器分别执行以下命令,启动 docker 容器。
docker run -d -p 6379:6379 -v /root/docker-data/redis/config/:/usr/local/etc/redis/ -v /root/docker-data/redis/data:/data -v /etc/localtime:/etc/localtime:ro redis redis-server /usr/local/etc/redis/redis.conf
-v /etc/localtime:/etc/localtime:ro
作用是将宿主机的 /etc/localtime
文件挂载到容器内的 /etc/localtime
文件,保证宿主机和容器时间一致。
验证
使用docker logs -f <container-id>
查看容器日志,若主从节点打印以下信息则表示部署成功。
主节点
从节点
踩坑记录
部署完成后发现通过客户端可以访问主节点,但无法访问从节点,折腾半天发现原来是从节点未修改redis.conf
中的bind
配置,默认只能接受来自其运行的同一主机的客户端连接,注释该配置或配置为bind 0.0.0.0
即可。
关于bind
配置参数说明如下(for ChatGPT):
在Redis的配置文件(redis.conf)中,
bind
指令用于指定Redis服务器绑定的网络接口地址或主机名。它控制Redis服务器监听来自哪个网络接口的连接请求。默认情况下,
bind
指令是注释掉的,这意味着Redis服务器会监听所有可用的网络接口,包括本地环回接口(127.0.0.1)和所有网络接口(0.0.0.0),以允许来自任何地址的连接请求(这里存在差异,最新版本默认开启)。如果您取消注释并设置了
bind
指令,Redis服务器将仅绑定到指定的网络接口地址或主机名上。这对于限制Redis服务器监听的网络接口是有用的,可以增加安全性并确保只有特定网络接口上的连接请求被接受。例如,如果您希望Redis仅监听本地环回接口(127.0.0.1),则可以将
bind
指令设置为:bashCopy code bind 127.0.0.1
这将使Redis服务器仅接受来自本地环回接口的连接请求。如果要允许来自特定网络接口的连接请求,请将
bind
指令设置为该网络接口的IP地址或主机名。需要注意的是,如果Redis服务器绑定到特定的网络接口,而不是监听所有可用的网络接口,可能会导致外部客户端无法连接到Redis服务器。因此,在设置
bind
指令时,请确保您了解并考虑了相关的网络配置和安全性需求。
注意:
- 在生产环境中,建议设置 bind 配置项,以限制 Redis 服务器的访问权限,提高安全性。
参考资料
Redis 主从复制原理及搭建部署
Redis主从模式部署