导读 最近遇到部分系统因为redis服务挂掉,导致部分服务不可用。所以希望搭建一个redis集群镜像,把原先散落各处的redis服务器统一管理起来,并且保障高可用和故障自动迁移。

最近遇到部分系统因为redis服务挂掉,导致部分服务不可用。所以希望搭建一个redis集群镜像,把原先散落各处的redis服务器统一管理起来,并且保障高可用和故障自动迁移。

一 redis集群分类

大家都知道redis集群有两种,一种是redis sentinel,高可用集群,同时只有一个master,各实例数据保持一致;一种是redis cluster,分布式集群,同时有多个master,数据分片部署在各个master上。基于我们的需求和redis本身技术的成熟度,本次要搭建的是redis sentinel。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification : 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
二制作镜像

整个集群可以分为一个master,N个slave,M个sentinel,本次以2个slave和3个sentinel为例:

首先增加redis.conf

##redis.conf##redis-0,默认为master
port $redis_port##授权密码,请各个配置保持一致##暂且禁用指令重命名##rename-command##开启AOF,禁用snapshot
appendonly yes#slaveof redis-master $master_port
slave-read-only yes

默认为master,#slaveof注释去掉后变为slave,这里固化了master的域名redis-master。
增加sentinel.conf

 port $sentinel_port
dir  "hljs-string""/tmp"##sentinel监控的redis的名字、IP和端口,最后一个数字是sentinel做决策的时候需要投赞同票的最少的sentinel的数量。
sentinel "hljs-instruction" monitor mymaster redis-master $master_port 2##选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel current-epoch 1

增加启动脚本,根据入参判断启动master,slave,sentinel

  cd /data
redis_role= "hljs-variable"$1
echo  "hljs-variable"$redis_roleif [  "hljs-variable"$redis_role =  "hljs-string""master" ] ;  thenecho  "hljs-string""master" sed -i  "hljs-string""s/\$redis_port/ "hljs-variable"$redis_port/g" redis.confredis-server /data/redis.confelif [  "hljs-variable"$redis_role =  "hljs-string""slave" ] ;  then   echo  "hljs-string""slave" sed -i  "hljs-string""s/\$redis_port/ "hljs-variable"$redis_port/g" redis.confsed -i  "hljs-string""s/#slaveof/slaveof/g" redis.confsed -i  "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" redis.confredis-server /data/redis.confelif [  "hljs-variable"$redis_role =  "hljs-string""sentinel" ] ;  then echo  "hljs-string""sentinel" sed -i  "hljs-string""s/\$sentinel_port/ "hljs-variable"$sentinel_port/g" sentinel.confsed -i  "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" sentinel.confredis-sentinel /data/sentinel.confelse echo  "hljs-string""unknow role!" fi      #ifend

其中$redis_port和$master_port,$sentinel_port都是取自环境变量,通过Docker启动时候传入。
编写Dockerfile

  FROM redis:3-alpine
MAINTAINER voidman voidmanCOPY  "bash"Shanghai /etc/localtime
COPY  "bash"redis.conf /data/redis.conf
COPY  "bash"sentinel.conf /data/sentinel.conf
COPY  "bash"start.sh /data/start.sh
RUN  "bash"chmod +x /data/start.sh
RUN  "bash"chown redis:redis /data/*
ENTRYPOINT  "bash"[ "hljs-string""sh", "hljs-string""/data/start.sh"]
CMD  "bash"[ "hljs-string""master"]

选取redis-alpine镜像作为基础镜像,因为它非常小,只有9M,修改时区和把一些配置拷贝进去后,变更下权限和用户组,因为基础镜像是redis用户组。ENTRYPOINT和CMD组合,默认以master方式启动。
build完成后,镜像只有15M。

三 启动

采用docker-compose格式:

redis-master-host:environment:redis_port:  "hljs-string"'16379'labels:io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaystty: trueimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-ha:1.0stdin_open: truenet: host
redis-slaves:environment:master_port:  "hljs-string"'16379'redis_port:  "hljs-string"'16380'labels:io "hljs-class".rancher "hljs-class".scheduler "hljs-class".affinity:container_label_soft_ne: name=slavesio "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaysname: slavestty: truecommand:- slaveimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0stdin_open: truenet: host
redis-sentinels:environment:master_port:  "hljs-string"'16379'sentinel_port:  "hljs-string"'16381'labels:io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaysname: sentinelsio "hljs-class".rancher "hljs-class".scheduler "hljs-class".affinity:container_label_ne: name=sentinelstty: truecommand:- sentinelimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0stdin_open: truenet: host

首先启动master,传入端口16379,host模式,在启动slave,成为16379 master 的slave,并且设置调度策略为尽可能分散的方式,sentinels也类似。

五 总结

总的来说,只要集群中有一台redis实例存活,集群就能对外提供服务,而sentinel只会在master或slave挂掉才会有实际的作用。
这次的镜像大小只有15M,非常小。采用启动时配置角色和端口,包括master,slave,和sentinel3个角色,通过服务编排启动一个redis集群。

本文地址: http://www.linuxprobe.com/docker-redis.html

打不死的redis集群相关推荐

  1. Redis集群:哨兵(Sentinel)

    Redis Sentinel机制与用法说明(哨兵模式) 1.主Redis与各个从Redis之间能够实现高可用(监控.自动故障迁移等),这个委托给redis-sentinel来实现.  2.业务代码中为 ...

  2. 一次redis集群连接数占满问题的排查

    现象 某系统的tomcat,收不到上游系统请求,日志停止不滚动,进程还存活(俗称的tomcat假死). 分析排查 应用排查 1.登录应用jstack -l pid > jstack.txt,查看 ...

  3. php redis主从自动切换,Redis 集群的主从切换

    Redis 集群的主从切换不再使用 Sentinel 作为外置监控, 而是集群内部在主节点挂掉之后选举出一个从节点取代主节点, 处理相应的分片的数据请求. 当然前提条件是对应的主节点有至少一个可连通的 ...

  4. redis 集群 实操 (史上最全、5w字长文)

    文章很长,建议收藏起来慢慢读! 总目录 博客园版 为大家准备了更多的好文章!!!! 推荐:尼恩Java面试宝典(持续更新 + 史上最全 + 面试必备)具体详情,请点击此链接 尼恩Java面试宝典,34 ...

  5. 【15W字长文】主从复制高可用Redis集群,完整包含Redis所有知识点

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [7W字长文]使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx 主从复制高可用Redis集群 分布式架 ...

  6. 通过cluster reshard实现Redis集群缩减节点实战【详细步骤】

    今年由于新冠疫情的影响,可能很多同学都被公司要求压缩服务器成本.这两天,公司领导把小眼睛瞟到笔者开发环境里那个可怜的redis集群上.好吧,那么我们就来操作一下缩减redis集群. 查看cluster ...

  7. redis集群数据迁移方式、宕机

    数据迁移方式 转载:https://blog.csdn.net/tianpeng341204/article/details/78963850 Redis Cluster数据分片机制 基础概念 集群: ...

  8. 5 数据库缓存机制 redis集群 --SoringBoot整合redis--及redis命令集

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 1 上传安装包 2 解压Redis tar -xvf redis-5.0.4.tar.gz 3 安 ...

  9. SpringBoot多redis集群配置

    在一个SpringBoot应用中配置多个redis集群 文章目录 1) 禁用自动配置 2)配置application.properties 3)增加java配置类 4)使用 1) 禁用自动配置 禁用 ...

最新文章

  1. poj1679(次小生成树)
  2. js基础到精通全面教程--JS教程(转载)--推荐
  3. Android中发送和接收短信
  4. pthread相关介绍
  5. Oracle Events事件
  6. C++标准模板库(STL)的概念
  7. mac 下launchpad超级慢的问题
  8. 【SIP协议】学习初学笔记
  9. hdu-1877(大数+进制转换)
  10. Leetcode--91. 解码方法
  11. (计算机组成原理)第二章数据的表示和运算-第三节1:浮点数的表示
  12. Windows平台下go编译器LiteIDE的安装和使用
  13. tensorflow学习之tf.assign
  14. 物联网VSWiFi 两强争霸还是携手并进?
  15. jsoup 网页抓取简介详解
  16. Hyperf JSON RPC 服务 Demo
  17. LC振荡器的工作原理
  18. 大工计算机英语考试,大工15春《专业英语(计算机英语)》在线测试123
  19. HTML+CSS+JS——仿京东(7页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  20. HbuilderX连接Nox(夜神模拟器)

热门文章

  1. oracle中ocr和asm的关系,迁移OCR和VotingDisk并删除原ASM磁盘组
  2. 用 UrlRewriteFilter 实现 URL 重写
  3. Oracle数据库的数据统计(Analyze)
  4. Oracle查询慢的原因总结
  5. SQL中cross join,left join,right join ,full join,inner join 的区别
  6. [py2neo]Ubuntu14 安装py2neo失败问题解决
  7. iOS常见问题(5)
  8. IOS线程学习(一)
  9. 阿里云ECS部署node.js及防火墙80端口开启
  10. leetcode - Balanced Binary Tree