当前位置: 首页 > Web前端 > HTML

dockercompose搭建redis7.0.4高可用一主二从三哨兵集群并集成SpringBoot【完整版带图】

时间:2023-03-28 19:28:00 HTML

1.前言Redis在我们企业级开发中很常见,但是单机redis不能保证我们的稳定使用,所以我们准备搭建一个集群。Redis有两种高可用方案:HighavailabilitywithRedisSentinelScalingwithRedisCluster第一个就是我们这次要搭建的,就是高可用sentinel。如果主redis挂了,sentinel会投票进行failover!第二个是分片集群。Sentinel的缺点之一就是只能有一个master节点,写入效率太低。分片集群是为了解决sentry的问题,可以水平扩展,提高redis的性能!最少的哨兵匹配是三个哨兵,以奇数增加。分片集群的最低配置是三主三从。这次我是用虚拟机搭建的。小编也搭建了一个星期。master和slave没有问题,但是failover不行。根本原因是docker网络的问题。Redis和Sentinel不在同一个网段。很多教学用host,不知道现在不能启动成功,所以还是要在网络中!2、docker和dockercompose安装3、启动redismaster-slave1、创建redis-sentinel-test文件夹mkdirredis-sentinel-test2。创建两个文件夹cdredis-sentinel-test/mkdirredismkdirsentinel3。在redis创建的compose文件必须命名为docker-compose.yml。在本次测试中,redis不会将目录挂载到宿主机上。如果需要,您可以使用卷挂载到主机!vimdocker-compose.yml4.编辑compose文件这里为了测试方便,没有设置密码!protected-modeno:关闭它,可以连接到其他地方。slave-announce-ip:使用主机的ipversion:"4.1"services:master:image:redis:7.0.4container_name:redis-mastercommand:bash-c"redis-server--protected-modeno--slave-announce-ip192.168.84.143--slave-announce-port6379"端口:-6379:6379slave1:图像:redis:7.0.4container_name:redis-slave-1端口:-6380:6379命令:bash-c"redis-server--protected-modeno--slaveofredis-master6379--slave-announce-ip192.168.84.143--slave-announce-port6380"slave2:image:redis:7.0.4container_name:redis-slave-2ports:-6381:6379命令:bash-c"redis-server--protected-modeno--slaveofredis-master6379--slave-announce-ip192.168.84.143--slave-announce-port6381"5.启动redis主从compose更新,从原来的-开始到一个空间dockercomposeup-d6。提醒我们,启动后dockercompose会自动创建一个网络,就是以文件夹的名字+_default命名!我们在写sentinel的compose文件的时候,需要使用这个默认网络,否则不在同一个网段,无法切换failover!!码头网络ls7。查看主从状态输入masterredis:e77iscontaineriddockerexec-ite77/bin/bashredis-cli查看状态信息:info8。测试主从4.启动三个sentinel1.切换到sentinel文件夹cd。.cd哨兵/2。创建sentinel.conf文件。我们去官网找一个最低配置的文件:因为这是两个实例,我们只需要一个,只需要前四行:protected-modenosentinelmonitormymaster192.168。84.14363792sentineldown-after-millisecondsmymaster60000sentinelfailover-timeoutmymaster180000sentinelparallel-syncsmymaster1第一行:Redis监控一个名为mymaster的redis集群,我们可以随意写;后者是ip,我们宿主机的ip,port是redis的主端口;2是哨兵投出的票数。当主redis宕机时,三个哨兵必须投票让两个哨兵的redis成为主!!第二行:Sentinel主观判断实例下线所需时间,单位毫秒第三行:如果failover故障转移未能在指定时间内完成,则任务故障转移失败。第四行:限制故障转移后同时向新主节点发起复制操作的节点数量,效率越大越慢。新建一个sentinel1.conf文件,粘贴上面四行!vimsentinel1.conf复制两份,不作任何修改:cpsentinel1.confsentinel2.confcpsentinel1.confsentinel3.conf3.写入conpose文件version:"4.2"services:sentinel1:image:redis:7.0.4container_name:redis-sentinel-1ports:-26379:26379command:redis-sentinel/usr/local/etc/redis/sentinel.confvolumes:-/mydata/redis-sentinel-test/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.confsentinel2:image:redis:7.0.4container_name:redis-sentinel-2ports:-26380:26379命令:redis-sentinel/usr/local/etc/redis/sentinel.confvolumes:-/mydata/redis-sentinel-test/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.confsentinel3:image:redis:7.0.4container_name:redis-sentinel-3ports:-26381:26379命令:redis-sentinel/usr/local/etc/redis/sentinel.confvolumes:-/mydata/redis-sentinel-test/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.confnetworks:default:name:redis_defaultexternal:truenetworks:yes上面提到的sentinel要和redis在同一个网络,这样才能完成failover!4、查看文件树tree如果没有可以安装:yum-yinstalltr??ee5.启动Sentineldockercomposeup-d6.查看Sentinel信息进入Sentinel容器:dockerexec-itc8/bin/bash连接Sentinel:redis-cli-p26379info1个master,2个slave,3个sentinel完成7.故障转移测试我们停止了master:dockerstope778.故障转移日志dockercomposelogs-f9.查看哨兵状态此时master节点已经自动切换到6381端口10、重启6379服务dockerrestarte77我们发现新添加的6379会作为从节点加入主节点!!五、集成SpringBoot1、导入小编依赖的springboot版本:2.3.7.RELEASEorg.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-web2。yml配置server:port:8084spring:redis:sentinel:#sentinel.conf中的集群名称master:mymaster#我们只需要连接到Sentinel,Sentinel会在内部帮我们找到redis节点:-192.168.84.143:26379-192.168.84.143:26380-192.168.84.143:263813.JSON序列化配置/**@authorwangzhenjun@date2022/8/1816:37*/@Configuration公共类RedisConfig{@Bean@SuppressWarnings(value={"unchecked","rawtypes"})publicRedisTemplateredisTemplate(RedisConnectionFactoryconnectionFactory){RedisTemplatetemplate=newRedisTemplate<>();template.setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializer序列化器=newJackson2JsonRedisSerializer(Object.class);//使用StringRedisSerializer来序列化和反序列化redis的键值template.setKeySerializer(newStringRedisSerializer());template.setValueSerializer(序列化器);//Hash的键也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(newStringRedisSerializer());template.setHashValueSerializer(序列化器);模板.afterPropertiesSet();返回模板;}}4.新建controller测试/**@authorwangzhenjun@date2022/8/1817:48*/@RestControllerpublicclassTestController{@AutowiredprivateRedisTemplateredisTemplate;@GetMapping("/test")publicvoidsaveRedis(){redisTemplate.opsForValue().set("name","一看就成功了");}5.项目结构6.测试7.查看redis是否有值6.总结经过一周的搭建,小编终于完成了。最大的问题是网络问题,终于解决了!!看了很多视频和教程,有些太笼统了,所以花了一整天的时间做了一个没有坑的完整版,希望对大家有帮助!!看到这里,我们一键走一排吧!!谢谢你们!!有缘人看得见!!!对文章内容感兴趣的朋友可以微信搜索公众号:打码的老贾,接收相应信息