docker + redis 部署一主二从三哨兵

2020-01-07  本文已影响0人  Andy_1ee

我们在项目中使用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"

其中:

如果觉得上面下载文件的方法比较麻烦,那么也可以直接创建一个redis.conf的文件,只在文件中写上这几个参数
由于我们使用docker部署redis集群,那么我们就需要将logdbfile进行目录挂载,并且对端口进行映射
此时我们就可以启动我们的容器了

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

启动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文件

上一篇 下一篇

猜你喜欢

热点阅读