使用docker搭建redis主从复制、哨兵机制

1. 拓扑结构

本文搭建如下图所示的redis拓扑结构,拓扑中共有3个哨兵,1和mater结点和2个slave结点。


redis拓扑结构

拓扑信息:

角色 ip port
redis-master redis-master或者master或者master-sentinel或者master-sentinel2或者master-sentinel3或自动分配的ip 6379
redis-slave1 容器启动时自动分配的ip 6380
redis-slave2 容器启动时自动分配的ip 6381
redis-master-sentinel 容器启动时自动分配的ip 26379
redis-master-sentinel2 容器启动时自动分配的ip 26380
redis-master-sentinel3 容器启动时自动分配的ip 26381

注:master或者master-sentinel或者master-sentinel2或者master-sentinel3都是主节点容器的别名。与之相关联的容器可以通过别称来代替ip访问容器。

2. 搭建主从复制结构

2.1 master节点配置

2.1.1 master节点配置文件

master节点配置文件

2.1.2 master节点配置文件详解

  • port: 端口号
  • daemonize:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
  • logfile: 日志文件的名字,在工作目录下自动创建,会记录redis的运行日志。
  • dbfilename: dump文件的名字,在工作目录下自动创建。
  • dir: 工作目录的路径。

其他配置请参考redis中文官网:www.redis.cn

2.1.3 在docker中运行redis master节点服务

master节点docker命令

命令说明:

  • --name: 命名容器为redis-master,一定不要忽略容器命名,为后面--link命令命名更容易记住名字。
  • -v:将本地的配置文件~/redis/redis-6379.conf挂载到容器中的/redis/redis-6379.conf

容器启动后,进入容器挂载的目录,执行redis-server redis-6379.conf命令,使用redis-6379.conf配置启动redis服务。具体操作如下图所示:

启动master节点

执行上述命令之后,如果没有消息,那么就是最好的消息,说明redis-server已经成功启动了。可以通过redis-6379.conf中配置的日志文件来查看启动情况。具体操作如下图所示:
查看日志文件

日志说明:

上述警告对于demo来说可以忽略,但是对于生产环境,需要重新对系统进行相关配置之后,再重新启动容器。
至此,master节点已经成功启动了。

2.2 slave节点配置

2.2.1 slave节点配置文件

两个slave节点的配置一模一样,除了端口号之外。slave1的端口为6380,slave2的端口号为6381。


slave1节点的配置文件

2.2.2 slave节点配置文件详解

  • 前5项配置和master节点类似,请参考master节点配置说明。
  • 这里重点说一下 slaveof命令,此命令用来给当前redis server节点指定一个master节点,自身作为master节点的slave节点。
    slaveof命令的格式为slaveof <ip> <port>,很明显,当前节点通过ip和port来定位将哪一个节点作为master节点,但是对于配置slaveof redis-master 6379来说,redis-master参数并不是一个ip。这里是因为在docker环境下,容器启动是ip是不定的,所以容器的通信可以通过--link选项来实现,而这里的redis-master就是master节点容器的名字,用容器名可以代替ip。具体参看下文。

2.2.3 在docker中运行redis slave节点服务

启动slave节点容器

命令说明:

  • --name: 容器名为redis-slave1
  • -v: 将本地~/redis/redis-6380.conf挂载到容器目录/redis/redis-6380.conf
  • --link: 建立与master节点之间的容器间的通信,redis-master为master节点的容器名,masterredis-master的别名。因此,slave的配置文件redis-6380.conf中最后一项配置也可以配置为slaveof master 6379

容器启动后使用redis-server redis-6380.conf命令启动redis server服务。如下图所示:

启动redis server服务

redis-server redis-6380.conf命令执行后,如果没有任何消息,那么就是最好的消息,说明redis server已经成功启动。
下面可以通过查看日志文件来查看启动情况。如下图所示:
查看17slave2的日志

日志分析:

  • 从第二行可以看出redis-server已经启动成功了。
  • Connecting to MASTER redis-master:6379说明已经连接到master节点,并且开始了数据的同步,从master节点复制到slave节点。
  • 从最后6行可以看出,因为是新增的slave结点,所以master到slave的复制时全量复制(倒数第五行),部分复制不可用(倒数第六行)。复制一共经历了四个步骤(最后四行):1. 从master接收数据 2.清理掉旧的数据 3.在内存中接在db 4.复制成功。

2.3 配置redis哨兵

2.3.1 redis哨兵配置文件

redis-sentinel1配置文件

配置说明:

  • port daemonize logfile dir配置和普通redis server节点相同。
  • 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 parallel-syncs示意图
  • sentinel failover-timeout 格式为sentinel failover-timeout <master-name> <times>
    表示故障转移的超时时间。

其他配置请参加redis中文官网:www.redis.cn

2.3.3 在docker容器中启动redis哨兵服务

使用下图命令在容器中启动redis哨兵服务。

docker启动redis哨兵命令

其他两个哨兵服务只需要修改:
--name参数(比如 redis-master-sentinel2)
-v挂载相应的配置文件(比如~/redis/redis-26380.conf:/redis/redis-62380.conf),--link参数给主节点去不同的别名(比如redis-master:master-sentinel2)。

在容器中启动redis-sentinel服务:


在容器中启动redis-sentinel服务

运行上述命令后没有消息,就是最好的消息。
下面可以查看工作目录下的日志文件来查看启动情况。如下图所示:


查看哨兵节点的日志

日志说明:
  • 从第四行可以看出,节点启动成功,以sentinel模式运行,端口为26379。
  • 倒数第二行为sentinel的id信息
  • 最后一行说明新加了一个哨兵节点监控到master节点,名字为mymaster,ip为172.17.0.2,quorum为2。

至此,redis-sentinel节点配置完毕,其余两个sentinel节点请读者根据上面配置自行配置完成(很容易)。

3 总结

本文从配置角度描述了怎么使用Docker搭建redis主从复制,并且添加了哨兵机制,但是并没有对redis进行详细剖析,这里强烈建议读者阅读相关书籍或是到redis官网了解redis运行机制。
若有问题,欢迎在评论区留言。
本文会定期更新,以便使用跟新版本的redis和docker。

`

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

推荐阅读更多精彩内容

  • 前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器。楼主是...
    liangzzz阅读 4,245评论 9 152
  • 这段时间没好好看书,业余的、技术的、个人喜欢的都没好好看。总把时间浪费在各种帖子、群、公众号、朋友圈里,看别人嚼烂...
    鸿都百炼生阅读 132评论 0 0
  • Mysql-基础语法 导语 本博文主要是简述选择数据库和对表内容的增、删、改和查的一些基本语法 USE 语法: U...
    SolaTyolo阅读 742评论 0 0
  • 说《诗经》应该都是吟唱出来的,谁来给谱个小曲儿?唱出来的话,也许更能体会它们的美妙吧。 1. 蒹葭(jiān ji...
    柳小妍阅读 559评论 5 9