我们在项目中使用redis时经常需要使用redis缓存,为了保证redis的稳定及高可用,至少要做到一个master节点、两个slave节点以及三个哨兵(sentinel)节点。
拓扑结构
其中
6379:master节点
6380:slave节点
6381:slave节点
26379:sentinel节点
26380:sentinel节点
26381:sentinel节点
具体步骤
1、拉取redis
镜像
docker pull redis # 默认已安装docker,未安装自行查阅安装方法
2、配置master
节点
我们拉取的镜像如果不进行配置文件的指定,会默认按照自己的配置文件进行设置
所以我们首先需要配置好master
节点的配置文件
# 下载官方redis配置文件
wget http://download.redis.io/redis-stable/redis.conf
由于redis.conf文件的行数较多,就不一一展示了
其中最重要的是一下几项
port 6379
dir "/data"
dbfilename "dump_6379.rdb"
logfile "6379.log"
其中:
-
port
:监听的端口号 -
dir
:redis的默认文件路径,dbfilename
及logfile
都会在这个路径下创建 -
dbfilename
:redis进行持久化时的文件名,在dir
下创建 -
logfile
:redis的日志文件,在dir
下创建
如果觉得上面下载文件的方法比较麻烦,那么也可以直接创建一个redis.conf
的文件,只在文件中写上这几个参数
由于我们使用docker部署redis集群,那么我们就需要将log
及dbfile
进行目录挂载,并且对端口进行映射
此时我们就可以启动我们的容器了
docker run -d
-p 6379:6379 # 端口映射
--name redis_master # 容器名称
-v /data/redis/redis_master_6379.conf:/redis/redis.conf # 配置文件挂载
-v /data/redis/master/:/data # 数据卷挂载
redis:latest # 镜像
redis-server /redis/redis.conf # docker启动后执行的命令,配置文件在redis下
为了阅读方便我将启动命令进行了分行,实际中是没有换行符的
在这里不得不讲一个坑点
我在初次配置时是看的别的文档进行的,说可以先进行目录文件的挂载,不执行redis-server /redis/redis.conf
这个命令,然后进入容器后在执行命令,实际上这种方法是错误的,因为在启动容器时已经启动了默认的配置,再执行这个命令就会显示端口已被占用
至此,master节点就创建完毕了
3、配置slave
节点
配置slave
几点的方法与配置master
节点基本相同,我们先前下载的那个redis.conf
文件,我们复制一份用于配置slave
节点
cp ./reids.conf ./redis_slave_6380.conf
进行slave
节点的配置
port 6379 # 由于是docker部署,所以内部端口都是6379
daemonize no # 不设置为守护模式(后台运行)
dir "/data" # 工作目录
dbfilename "dump_6380.rdb" # 持久化文件名称
logfile "6380.log" # 日志文件名称
slaveof 172.18.0.5 6379 # 设置为某个主节点的slave节点
上方提到的这个主节点地址为master的docker容器的地址,可以通过以下命令查看
docker inspect redis_master # 用来查看容器的详细信息
启动slave
节点的redis容器
docker run -d
-p 6380:6379 # 端口映射
--name redis_slave_1 # 容器名称
-v /data/redis/redis_slave_6380.conf:/redis/redis.conf # 配置文件挂载
-v /data/redis/slave_6380/:/data # 数据卷挂载
redis:latest # 镜像
redis-server /redis/redis.conf # docker启动后执行的命令,配置文件在redis下
另一个redis的配置完全相同,只需要将端口进行更换即可
4、配置sentinel节点
上方配置好以后进行sentinel的配置就十分简单了
首先下载配置文件
wget http://download.redis.io/redis-stable/sentinel.conf # 下载sentinel配置文件
进行sentinel的配置
port 6379 # 由于要进行端口映射,内部端口为6379
daemonize no
logfile "26379.log"
dir "/data"
sentinel monitor mymaster 172.18.0.6 6379 2 # 主节点的ip及端口
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
-
sentinel monitor
:该命令的格式为sentinel monitor <master> <ip> <port> <quorum>
<master>
:参数为哨兵监控的master节点的别名
<ip>
:参数为监控的master
节点的ip
(在docker
中,容器间用--link命令通信,所以可以替换为目标容器的名字或别名)
<port>
:为监控的master
结点的端口
<quorum>
:代表要判定master
节点最终不可达所需要的票数。用于故障发现和判定。例如如果将quorum
配置为2
,代表至少要两个哨兵节点认为master
节点不可达,那么这个不可达的判定才是客观的,对于<quorum>
值设置的越小,那么达到下线的条件就越宽松,反之越严格。一般建议将其设置为哨兵节点的数量加1
。 -
sentinel down-after-milliseconds
命令格式为sentinel down-after-milliseconds <master-name> <times>
<master>
:参数为主节点的名称,这里为上面设置的mymaster
<times>
:sentinel
节点定期会想master
节点发送ping
命令,如果超过times
毫秒没有收到回复,则判定该节点不可达。down-after-milliseconds
虽然以<master-name>
为参数,但实际上对哨兵节点、主节点、从节点的判定同时有效,可以通过主节点来获取从节点和哨兵节点的信息。 -
sentinel parallel-syncs
格式为sentinel parallel-syncs <master-name> <nums>
当哨兵节点集合对主节点的故障判定达到一致时,哨兵领导节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs
参数就是限制从节点向新的主节点发起复制的个数。若发起复制的从节点过多,那么可能会造成主节点阻塞。若发起复制的从节点过少,可能会造成数据在复制期间不一致的情况。 -
sentinel failover-timeout
格式为sentinel failover-timeout <master-name> <times>
表示故障转移的超时时间。
启动docker
docker run -d
-p 26379:6379 # 端口映射
--name redis_sentinel_1 # 容器名称
-v /data/redis/redis_sentinel_26379.conf:/redis/redis.conf # 配置文件挂载
-v /data/redis/sentinel_26379/:/data # 数据卷挂载
redis:latest # 镜像
redis-sentinel /redis/redis.conf # docker启动后执行的命令,配置文件在redis下
至此一个sentinel节点就启动完成了,其余两个sentinel节点的启动完全相同,只是端口不同,同样监控的是master节点
查看现在的redis集群状态
# 进入到容器的内部的redis客户端,使用info命令进行查看
# master部分信息
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.7,port=6379,state=online,offset=15151774,lag=1
slave1:ip=172.18.0.5,port=6379,state=online,offset=15151774,lag=0
# slave部分信息
# Replication
role:slave
master_host:172.18.0.6
master_port:6379
master_link_status:up
# sentinel部分显示
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.18.0.6:6379,slaves=3,sentinels=3
5、验证failover故障转移
我们全部启动后使用docker ps
查看所有的容器是否启动完成,如果有容器没有启动成功,可以使用docker logs -f 容器id
查看容器的日志查找报错原因
此时我们将master容器删除掉,过几秒后进入到slave
容器查看是否有新的master产生
6、sentinel的常用命令
SENTINEL masters #查看主节点信息
SENTINEL slaves <MASTER_NAME> #查看对应集群的从节点信息
SENTINEL failover <MASTER_NAME> #进行故障转移
SENTINEL get-master-addr-by-name <MASTER_NAME> #查看当前的主节点地址
【注】:如果想看redis
的信息,可以进入容器后,执行redis-cli
进入redis
客户端,然后使用命令info
查看
【注】如果配置有问题,或启动有问题可以查看自己配置的log文件