Redis部署
Redis部署
Redis部署主要是单机、主从、哨兵、集群四种模式,其中哨兵、集群模式适用于生产环境。
前提:部署好docker、docker-compose基础服务。
1.集群模式
集群模式部署,兼顾扩展能力、高可用需求。生产环境建议采用三主三从6节点,至少需要3台服务器。
以下用于测试环境选择将6节点部署在同一台服务器上模拟集群环境。
1.1 创建配置文件及目录
安装目录:/home/redis-cluster
# 创建目录
mkdir -p /home/redis-cluster
# 切换至指定目录
cd /home/redis-cluster/
# 在当前目录下创建7001文件夹,在文件夹下面创建conf和data目录
mkdir -p 7001/data 7001/conf
进入配置文件夹目录,并在目录下创建redis.conf文件:
cd 7001/conf
vi redis.conf
port 6371
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.40.6
cluster-announce-port 6371
cluster-announce-bus-port 16371
参数解释:
- port:节点端口;
- protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
- daemonize:是否以守护线程的方式启动(后台启动),默认 no;
- appendonly:是否开启 AOF 持久化模式,默认 no;
- cluster-enabled:是否开启集群模式,默认 no;
- cluster-config-file:集群节点信息文件;
- cluster-node-timeout:集群节点连接超时时间;
- cluster-announce-ip:集群节点 IP,填写宿主机的 IP;
- cluster-announce-port:集群节点映射端口;
- cluster-announce-bus-port:集群节点总线端口。
# 回到项目跟目录
cd /usr/local/docker-redis/redis-cluster/
# 复制文件夹,并修改将6371修改为对应的端口,如6372文件夹里面redis.conf文件里面的所有的6371都要修改为6372,包括16731也要修改为16372
cp -r 6371/ 6372
cp -r 6371/ 6373
cp -r 6371/ 6374
cp -r 6371/ 6375
cp -r 6371/ 6376
# 自行修改文件夹里面的内容
# 此时这个目录下已经存在6371、6372、6373、6374、6375、6376这几个目录,并且这些目录下所有的配置文件都已经修改为和文件名对应的端口
1.2 容器配置文件
进入安装根目录:cd /home/redis-cluster
vim docker-compose.yaml,创建docker-compose配置文件,输入以下内容并保存:
version: '3.7'
services:
redis7001:
image: redis:6
container_name: redis7001
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7001/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7001/data:/data
ports:
- "7001:7001"
- "17001:17001"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
redis7002:
image: redis:6
container_name: redis7002
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7002/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7002/data:/data
ports:
- "7002:7002"
- "17002:17002"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
redis7003:
image: redis:6
container_name: redis7003
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7003/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7003/data:/data
ports:
- "7003:7003"
- "17003:17003"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
redis7004:
image: redis:6
container_name: redis7004
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7004/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7004/data:/data
ports:
- "7004:7004"
- "17004:17004"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
redis7005:
image: redis:6
container_name: redis7005
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7005/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7005/data:/data
ports:
- "7005:7005"
- "17005:17005"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
redis7006:
image: redis:6
container_name: redis7006
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- ./7006/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7006/data:/data
ports:
- "7006:7006"
- "17006:17006"
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
logging:
options:
max-size: '100m'
max-file: '10'
restart: always
1.3 启动服务
在mysql根目录启动服务:
cd /home/redis-cluster
docker-compose up -d
# 查看启动结果:
docker-compose ps
2.哨兵模式
Redis哨兵模式(Sentinel)引入了轻量级的监控与自动故障转移机制,它具备以下核心能力:
- 自动监控主从节点运行状态
- 主节点故障时自动执行故障转移
- 多哨兵节点协作决策,避免单点误判
哨兵模式的基础架构由两部分组成:
- 哨兵节点(Sentinel Node):
- 特殊的Redis节点,不存储数据
- 独立进程,通常部署多个(建议至少3个)
- 负责监控和决策
- 数据节点(Data Node):
- 包括主节点(Master)和从节点(Slave)
- 存储实际Redis数据
- 主节点提供写服务,从节点提供读服务
核心工作原理
哨兵节点通过三大定时任务实现监控:
- 每10秒:向主从节点发送INFO命令,获取从节点列表和状态
- 每2秒:向主从节点和其他哨兵发送自身信息,实现哨兵发现
- 每1秒:向所有节点发送PING命令,检测节点存活状态
故障判定流程:
- 主观下线(SDOWN):单个哨兵发现节点超时未响应PING,认为其"主观下线"
- 客观下线(ODOWN):当超过quorum个哨兵都认为主节点主观下线时,判定为"客观下线"(从节点和哨兵只有主观下线)
故障转移流程:
- 哨兵节点通过Raft算法选举领导者哨兵
- 领导者哨兵从从节点中挑选新主:
- 过滤不健康的从节点
- 选择优先级最高的从节点(replica-priority配置)
- 优先级相同则选复制偏移量最大的(数据最新)
- 仍相同则选runID最小的
- 执行主从关系重配置:
- 新主执行SLAVEOF NO ONE
- 其他从节点指向新主
- 旧主恢复后自动成为新主的从节点
示例在同一服务器上使用docker-compose部署3个数据节点(1主2从)、3个哨兵节点。
2.1 准备数据节点配置文件
创建目录存放所有配置文件和compose文件:
mkdir /hos/redis-sentinel
cd /hos/redis-sentinel
准备3个数据节点的配置文件,其中redis1作为初始主节点:
#redis1
vim redis1.conf #输入以下内容并保存
requirepass 3GQVesdf5dfU
masterauth 3GQVesdf5dfU
appendonly yes
replica-announce-ip 172.18.18.233
replica-announce-port 8379
#redis2
vim redis2.conf #输入以下内容并保存
requirepass 3GQVesdf5dfU
masterauth 3GQVesdf5dfU
appendonly yes
replica-announce-ip 172.18.18.233
replica-announce-port 8380
slaveof 172.18.18.233 8379
#redis3
vim redis3.conf #输入以下内容并保存
requirepass 3GQVesdf5dfU
masterauth 3GQVesdf5dfU
appendonly yes
replica-announce-ip 172.18.18.233
replica-announce-port 8381
slaveof 172.18.18.233 8379
其中部分参数需要根据实际修改:
- requirepass:本节点的访问密码,建议所有节点保持一致;
- masterauth:从节点连接主节点时的验证密码,和requirepass保持一致;
- replica-announce-ip:应用访问数据节点的IP地址,对于区分内外网、容器部署、NAT等情况需要填写实际访问本节点的IP;
- replica-announce-port:类似replica-announce-ip,实际访问本节点的端口;
- slaveof:从节点需要配置,配置为主节点的ip和端口。
2.2 准备哨兵节点配置文件
创建配置文件目录(哨兵服务会将数据节点信息回写到配置文件中,所以必须将哨兵配置文件放在目录中,启动容器时挂载目录,而不是直接挂载配置文件):
mkdir sentinel1 sentinel2 sentinel3
创建配置文件并保存:
#哨兵节点1
vim sentinel1/sentinel.conf #输入以下内容并保存
sentinel monitor mymaster 172.18.18.233 8381 2
sentinel auth-pass mymaster 3GQVesdf5dfU
sentinel announce-ip "172.18.18.233"
sentinel announce-port 28379
#哨兵节点2
vim sentinel2/sentinel.conf #输入以下内容并保存
sentinel monitor mymaster 172.18.18.233 8381 2
sentinel auth-pass mymaster 3GQVesdf5dfU
sentinel announce-ip "172.18.18.233"
sentinel announce-port 28380
#哨兵节点3
vim sentinel3/sentinel.conf #输入以下内容并保存
sentinel monitor mymaster 172.18.18.233 8381 2
sentinel auth-pass mymaster 3GQVesdf5dfU
sentinel announce-ip "172.18.18.233"
sentinel announce-port 28381
其中需要根据实际环境修改的配置:
sentinel monitor mymaster 172.18.18.233 8381 2
:mymaster
:主节点名称,默认即可;172.18.18.233 8381
:修改为数据主节点的ip端口;2
:最小投票数,3个哨兵节点,所以这里设置为2。
sentinel auth-pass mymaster 3GQVesdf5dfU
:主节点的密码;sentinel announce-ip "172.18.18.233"
:本哨兵节点的ip,即服务器ip;sentinel announce-port 28379
:本哨兵节点的端口,容器映射的服务器的端口。
2.3 容器配置文件
创建docker-compose.yml,保存以下内容:
services:
redis1:
image: redis:6.0
restart: always
command: redis-server /usr/local/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=65535
ports:
- 8379:6379
volumes:
- ./redis1.conf:/usr/local/etc/redis/redis.conf
- ./data1:/data
redis2:
image: redis:6.0
restart: always
command: redis-server /usr/local/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=65535
ports:
- 8380:6379
volumes:
- ./redis2.conf:/usr/local/etc/redis/redis.conf
- ./data2:/data
redis3:
image: redis:6.0
restart: always
command: redis-server /usr/local/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=65535
ports:
- 8381:6379
volumes:
- ./redis3.conf:/usr/local/etc/redis/redis.conf
- ./data3:/data
sentinel1:
image: redis:6.0
restart: always
ports:
- 28379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
sysctls:
- net.core.somaxconn=65535
volumes:
- ./sentinel1:/usr/local/etc/redis
sentinel2:
image: redis:6.0
restart: always
ports:
- 28380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
sysctls:
- net.core.somaxconn=65535
volumes:
- ./sentinel2:/usr/local/etc/redis
sentinel3:
image: redis:6.0
ports:
- 28381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
sysctls:
- net.core.somaxconn=65535
volumes:
- ./sentinel3:/usr/local/etc/redis
2.4 启动服务
#启动容器
docker-compose up -d
#查看容器状态
docker-compose ps
#查看各节点日志
docker-compose logs redis1/redis2/redis3/sentinel1/sentinel2/sentinel3
查看sentinel配置文件,看是否写入了数据节点配置,类似如下,可以看到各节点信息:
sentinel myid 9b3d51ba7923217b4761b10633913811c8f1e796
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.18.233 8381 2
sentinel auth-pass mymaster 3GQVesdf5dfU
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 2
sentinel known-replica mymaster 172.18.18.233 8379
sentinel known-replica mymaster 172.18.18.233 8380
# Generated by CONFIG REWRITE
user default on nopass ~* +@all
sentinel known-sentinel mymaster 172.18.18.233 28381 69f24d64e1bfb7586edf4c4b8636a8e10357903b
sentinel known-sentinel mymaster 172.18.18.233 28380 d060aee2e7c903c0764d692c03ea6e227c2fbc71
sentinel current-epoch 2
sentinel announce-ip "172.18.18.233"
sentinel announce-port 28379