一、前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。 redis有两种高可用的方案:HighavailabilitywithRedisSentinel(哨兵)ScalingwithRedisCluster(分片集群) 第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行故障转移! 第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能! 哨兵最低配是三哨兵,以奇数递增。 分片集群最低配是三主三从。 小编之前写过一篇在一台机器上搭建的文章,大家有兴趣可以先去体验一下,实际生产上不会让你一台机器上;也没有任何意义,服务器挂了,再多的集群也全部挂掉了!! dockercompose搭建redis7。0。4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】二、准备 首先我们要准备: 三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈! 三台机器的ip和名称在表格里整理一下! ip redis节点名称 sentinel节点名称 192。168。239。131 redismaster redissentinel1 192。168。239。130 redisslave1 redissentinel2 192。168。239。128 redisslave2 redissentinel3三、Sentinel概念 RedisSentinel在不使用RedisCluster时为Redis提供高可用性。 Sentinel功能的完整列表:监控:Sentinel不断检查您的主实例和副本实例是否按预期工作。通知:Sentinel可以通过API通知系统管理员或其他计算机程序,其中一个受监控的Redis实例出现问题。自动故障转移:如果master没有按预期工作,Sentinel可以启动一个故障转移过程,其中一个副本被提升为master,其他额外的副本被重新配置为使用新的master,并且使用Redis服务器的应用程序被告知要使用的新地址连接时。自动更新配置:Sentinel充当客户端服务发现的权威来源:客户端连接到Sentinels以询问负责给定服务的当前Redismaster的地址。如果发生故障转移,Sentinels将报告新地址。 官方哨兵搭建条件:您至少需要三个Sentinel实例才能进行可靠的部署。三个Sentinel实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如在不同可用区上执行的不同物理服务器或虚拟机。 详细介绍和使用:请见官网官网详细文档:https:redis。iodocsmanagementsentinel四、一主二从搭建 话不多说,咱们直接开始搭建哈!1。创建挂载目录 三台机器上新建目录: 首先我们开启三个xshell窗口,然后同时操作三个窗口创建 在这里插入图片描述 然后再左下角选择发送到全部窗口!cdmkdirmydatacdmydatamkdirrediscdredismkdirdatamkdirconfcdconf2。在192。168。239。131机器上编辑文件vimredis。conf 输入以下内容:任何都可以连接redisbind0。0。0。0配置master密码requirepass123456宕机后成为从要连接master的密码masterauth123456开启持久化appendonlyyes 在这里插入图片描述3。在192。168。239。130机器上编辑文件vimredis。conf 输入以下内容:配置master的ip和端口号replicaof192。168。239。1316379任何都可以连接redisbind0。0。0。0成为master后的密码requirepass123456连接master密码masterauth123456开启持久化appendonlyyes 在这里插入图片描述4。在192。168。239。128机器上编辑文件vimredis。conf 输入以下内容:配置master的ip和端口号replicaof192。168。239。1316379任何都可以连接redisbind0。0。0。0成为master后的密码requirepass123456连接master密码masterauth123456开启持久化appendonlyyes5。192。168。239。131启动redisdockerrunp6379:6379nameredismastervmydataredisdata:usrlocaletcredisdatavmydataredisconfredis。conf:usrlocaletcredisredis。confdredisredisserverusrlocaletcredisredis。conf 查看启动日志:dockerlogsfredismaster 在这里插入图片描述6。192。168。239。130启动redisdockerrunp6379:6379nameredisslave1vmydataredisdata:usrlocaletcredisdatavmydataredisconfredis。conf:usrlocaletcredisredis。confdredisredisserverusrlocaletcredisredis。conf 可以看到已经连接到master节点了! 在这里插入图片描述 7。192。168。239。128启动redis dockerrunp6379:6379nameredisslave2vmydataredisdata:usrlocaletcredisdatavmydataredisconfredis。conf:usrlocaletcredisredis。confdredisredisserverusrlocaletcredisredis。conf 在这里插入图片描述8。进入192。168。239。130容器查看 我们查看master日志,可以看到两个从节点已经加入进来了! 在这里插入图片描述 我们进入容器进行在次查看:dockerexecitredismasterbinbash 连接redis:rediscli 登录redisauth123456 在这里插入图片描述 查看从节点:info 也是可以看到有两个从节点! 在这里插入图片描述五、搭建三哨兵sentinel1。创建挂载目录 还是三个虚拟机一起创建mkdirsentinelcdsentinelvimsentinel。conf 输入下面内容:port26379sentinelmonitorredismaster192。168。239。13163792sentinelauthpassredismaster123456sentineldownaftermillisecondsredismaster6000sentinelparallelsyncsredismaster1sentinelfailovertimeoutredismaster6000 第二行:Redis监控一个名为redismaster的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!! 第三行:配置master的密码 第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。 第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。 第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。 在这里插入图片描述2。运行192。168。239。131哨兵dockerrunp26379:26379nameredissentinel1vmydataredissentinelsentinel。conf:usrlocaletcredissentinel。confdredisredissentinelusrlocaletcredissentinel。conf3。运行192。168。239。130哨兵dockerrunp26379:26379nameredissentinel2vmydataredissentinelsentinel。conf:usrlocaletcredissentinel。confdredisredissentinelusrlocaletcredissentinel。conf3。运行192。168。239。128哨兵dockerrunp26379:26379nameredissentinel3vmydataredissentinelsentinel。conf:usrlocaletcredissentinel。confdredisredissentinelusrlocaletcredissentinel。conf4。待解决问题 这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!! 在这里插入图片描述六、测试主从和故障转移1。测试主从复制 master节点创建一个键值对:setab 在这里插入图片描述 从查看key是否存在:geta 在这里插入图片描述 主从没有问题哈!2。测试故障转移 我们把master停掉,查看一个哨兵的日志:dockerstopredismasterdockerlogsfredissentinel1 我们看到192。168。239。130成为master! 在这里插入图片描述 重新启动原来的master: dockerrestartredismaster 在这里插入图片描述 故障转移成功!!七、整合springboot1。导入依赖 小编的springboot版本为:2。7。4dependencygroupIdorg。springframework。bootgroupIdspringbootstarterdataredisartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependency2。yml配置 password密码和sentinel同级,不然找不到密码,验证失败server:port:8087spring:redis:密码和sentinel同级,不然找不到密码,验证失败password:123456sentinel:sentinel。conf里的集群名称master:mymaster我们只需要连哨兵即可,哨兵内部会帮我们找到redisnodes:192。168。239。131:26379192。168。239。130:26379192。168。239。128:263793。json序列化配置authorwangzhenjundate2022112410:37ConfigurationpublicclassRedisConfig{BeanSuppressWarnings(value{unchecked,rawtypes})publicRedisTemplateObject,ObjectredisTemplate(RedisConnectionFactoryconnectionFactory){RedisTemplateObject,ObjecttemplatenewRedisTemplate();template。setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializerserializernewJackson2JsonRedisSerializer(Object。class);使用StringRedisSerializer来序列化和反序列化redis的key值template。setKeySerializer(newStringRedisSerializer());template。setValueSerializer(serializer);Hash的key也采用StringRedisSerializer的序列化方式template。setHashKeySerializer(newStringRedisSerializer());template。setHashValueSerializer(serializer);template。afterPropertiesSet();returntemplate;}}4。新建controller测试authorwangzhenjundate2022112410:37RestControllerpublicclassTestController{AutowiredprivateRedisTemplateredisTemplate;GetMapping(redis)publicvoidsaveRedis(){redisTemplate。opsForValue()。set(test,看到我就成功了);}}5。测试 http:localhost:8087testredis 在这里插入图片描述 6。查看redis 在这里插入图片描述八、总结 经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制! 唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个! 如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!! 可以看下小编的微信公众号,和网站文章首发看,欢迎关注,一起交流哈!!