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

我们在项目中使用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的默认文件路径,dbfilenamelogfile都会在这个路径下创建
  • dbfilename:redis进行持久化时的文件名,在dir下创建
  • logfile:redis的日志文件,在dir下创建

如果觉得上面下载文件的方法比较麻烦,那么也可以直接创建一个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
  • 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文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容