redis高可用方案 redis-sentinel 简单的部署方式

248 阅读3分钟

简单介绍

redis-sentinel相比master-slave模式,好处在于当主redis不可用的时候,可以自动无感的切换到可以用的redis服务器,而master-slave去需要手动,或者通过脚本才能实现。redis-sentinel实现这个功能机制,可以粗略的描述为投票模式。
最简单的模型为一主两从三哨兵,哨兵检查主redis,当主redis挂了之后,三个哨兵通过通信来互相确认他们看到的主redis的状态,如果3个哨兵中有两个认为,主redis挂了,那么哨兵就会在从redis中选一个出来当老大,另外一个还继续当小弟,原来的老大即使恢复了,也会变成新上位的小弟,然后按照这种规则交替老大的位置。这个过程中完全不需要人工干预,仅需要写好配置文件,是一个非常实用的高可用方案,简单模型可以满足大部分redis使用内存不超过10G的中小项目需求。

使用docker部署redis

我使用的是redis:5.0.3版本,选好对应版本的配置文件很重要,不然会出现各种让你redis跑不起来,又难找到原因的问题,一般可以去官网下载对应配置文件,或者在redis安装包里去复制(这样最稳)。

使用6379,6380,6381端口运行三个redis服务(暂无条件部署在三台不同的服务器)
// docker 容器:指定版本
docker pull redis:5.0.3  
// docker -v 主机路径:容器路径 让主机和容器的文件夹映射(常用,进容器操作很不方便),挂载的主机路径要赋予写权限
// dockder --network=host 表示网络模式是和主机公用IP和端口;
// docker -p 主机端口:容器端口 容器使用自己的内网,通过这个设置把主机的端口和容器端口关联起来
// docker run redis-server 配置文件(是配置文件在容器的路径,而不是主机)
docker run -d --name redis-6379 \
-v /opt/soft/redis/6379/conf:/opt/soft/redis/conf \
-v /opt/soft/redis/6379/data:/opt/soft/redis/data \
--network host \
redis:5.0.3 /opt/soft/redis/conf/redis.conf

相同的方式

// 6380 redis-server 配置文件修改
// replicaof <主IP> <主端口>,例如 replicaof 172.16.7.72 6379
// port 6380
// 如果主redis配置中使用了requirepass,从redis配置还需要修改 masterauth <密码>
// 使用了鉴权在哨兵模式中就要保持一致
// 可以修改日志文件,持久化文件的保存路径,可以是被挂载的自定义路径,方便查看使用
docker run -d --name redis-6380 \
-v /opt/soft/redis/6380/conf:/opt/soft/redis/conf \
-v /opt/soft/redis/6380/data:/opt/soft/redis/data \
--network host \
redis:5.0.3 /opt/soft/redis/conf/redis.conf

// 6381 redis-server
// replicaof <主IP> <主端口>,例如 replicaof 172.16.7.72 6379
// port 6380
docker run -d --name redis-6381 \
-v /opt/soft/redis/6381/conf:/opt/soft/redis/conf \
-v /opt/soft/redis/6381/data:/opt/soft/redis/data \
--network host \
redis:5.0.3 /opt/soft/redis/conf/redis.conf
最好在关闭防火墙的情况启动,使用docker内网情况,会存在sentinel无法访问到容器的网络导致sentinel状态不对。

启动sentinel

sentinel为了避免平票,要部署奇数个sentinel
docker pull redis:alpine
// 配置文件
// port 26379
// sentinel monitor <主redis别名> <主IP> <主端口> <获选票数>;例如 sentinel monitor mymaster 172.16.7.72 6379 2
// 存在requirepass属性
// sentinel auth-pass <主redis别名> <密码>;例如 sentinel auth-pass mymaster 123456
docker run -d --name sentinel-6379 \
-v /opt/soft/redis/6379/conf:/opt/soft/redis/conf \
--network host \
redis:alpine redis-sentinel /opt/soft/redis/conf/sentinel.conf --sentinel

// port 26380
docker run -d --name sentinel-6380 \
-v /opt/soft/redis/6380/conf:/opt/soft/redis/conf \
--network host \
redis:alpine redis-sentinel /opt/soft/redis/conf/sentinel.conf --sentinel

// port 26381
docker run -d --name sentinel-6381 \
-v /opt/soft/redis/6381/conf:/opt/soft/redis/conf \
--network host \
redis:alpine redis-sentinel /opt/soft/redis/conf/sentinel.conf --sentinel