当前位置: 首页 > 科技观察

三台服务器使用Docker搭建Redis,一主二从三哨兵,概念-搭建-集成Springboot

时间:2023-03-14 16:29:48 科技观察

1.前言Redis在我们企业级开发中很常见,但是单一的redis并不能保证我们的稳定使用,所以我们要搭建一个集群。Redis有两种高可用方案:HighavailabilitywithRedisSentinel(哨兵)ScalingwithRedisCluster(分片集群)第一个就是我们这次要搭建的,也就是高可用sentinel,主要是redis挂了,sentinel将投票进行故障转移!第二个是分片集群。Sentinel的缺点之一就是只能有一个master节点,写入效率太低。分片集群是为了解决sentry的问题,可以水平扩展,提高redis的性能!最少的哨兵匹配是三个哨兵,以奇数增加。分片集群的最低配置是三主三从。2.准备首先我们需要准备:三台服务器(没有条件的话三个虚拟机),巧的是,小编是一台虚拟机!整理表中三台机器的ip和名称!ipredis节点名sentinel节点名192.168.239.131redis-masterredis-sentinel-1192.168.239.130redis-slave-1redis-sentinel-2192.168.239.128redis-slave-2redis-sentinel-3三、哨兵概念RedisSentinel不使用RedisCluster时提供Redis的高可用性。Sentinel功能的完整列表:监控:Sentinel不断检查您的主实例和副本实例是否按预期工作。通知:Sentinel可以通过API通知系统管理员或其他计算机程序,其中一个受监控的Redis实例出现问题。自动故障转移:如果master没有按预期工作,Sentinel可以启动一个故障转移过程,其中一个副本被提升为master,其他额外的副本被重新配置为使用新的master,并且使用Redis服务器的应用程序被告知新地址到连接时使用。自动更新配置:Sentinel充当客户端服务发现的权威来源:客户端连接到Sentinels以询问负责给定服务的当前Redismaster的地址。如果发生故障转移,Sentinels将报告新地址。官方Sentinel构建要求:您至少需要三个Sentinel实例才能进行可靠部署。应该将三个Sentinel实例放置在被认为以独立方式发生故障的计算机或虚拟机上。因此,例如在不同可用区上执行的不同物理服务器或虚拟机。详细介绍及使用:请参考官网--->官网详细文档:https://redis.io/docs/management/sentinel/4.搭建一主二从话不多说,先说吧直接开始搭建!1、创建挂载目录在三台机器上新建目录:首先我们打开三个xshell窗口,然后操作三个窗口同时创建。然后选择左下角的SendtoAllWindow!cd/mkdirmydatacd/mydatamkdirrediscdredismkdirdatamkdirconfcdconf2,在`192.168.239.131`机器上编辑vimredis.conf文件,输入以下内容:#Anythingcanconnecttoredisbind0.0.0.0#Configurethemasterpasswordrequirepass123456#After关机变成从密码连接到mastermasterauth123456#Enablepersistentappendonlyyes3,在`192.168.239.130`机器上编辑文件vimredis.conf,输入以下内容:#配置master的ip和端口号replicaof192.168。239.1316379#一切正常connectredisbind0.0.0.0#passwordafterbecomemasterrequirepass123456#connectmasterpasswordmasterauth123456#enablepersistentappendonlyyes4,在`192.168.239.128`机器上编辑vimredis.conf文件,输入以下内容:#配置192.168.239.131replica的ip和端口号6379#任何人都可以连接到redisbind0.0.0.0#成为master后密码requirepass123456#连接master密码masterrauth123456#Enablepersistentappendonlyyes5,`192.168.239.131`startredisdockerrun9:63797--nameredis-master\-v/mydata/redis/data:/usr/local/etc/redis/data\-v/mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf\-dredisredis-server/usr/local/etc/redis/redis.conf查看启动日志:dockerlogs-fredis-master6,`192.168.239.130`启动redisdockerrun-p6379:6379--nameredis-slave-1\-v/mydata/redis/data:/usr/local/etc/redis/data\-v/mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf\-dredisredis-server/usr/local/etc/redis/redis.conf可以看到已经连上master节点了!7.`192.168.239.128`启动redisdockerrun-p6379:6379--nameredis-slave-2\-v/mydata/redis/data:/usr/local/etc/redis/data\-v/mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf\-dredisredis-server/usr/local/etc/redis/redis.conf8,进入`192.168.239.130`容器查看我们查看masterLog,可以看到有两个slave节点加入了!我们进入容器进行第二次查看:dockerexec-itredis-master/bin/bash连接redis:redis-cli登录redis:auth123456查看从节点:info也可以看到有两个从节点!五、搭建三个sentinelsentinel1,创建挂载目录或者三个虚拟机一起创建mkdirsentinelcdsentinelvimsentinel.conf输入以下内容:port26379sentinelmonitorredis-master192.168.239.13163792sentinelauth-passredis-master123456sentineldown-after-millisecondsredis-master6000sentinelffsentinel-oversenil-sail-masterredis-master1redis6000第二行:redis监控一个名为redis-master的redis集群,我们可以随意写;其次是ip,我们宿主机的ip就够了,端口是主要的redis端口;2是哨兵投票的票数,当主redis宕机时,三个哨兵的redis必须投票给两个哨兵成为master!!第三行:配置master的密码。第四行:Sentinel主观判断实例下线所需时间,单位毫秒。第5行:限制故障转移后同时向新主节点发起复制操作的节点数量,效率越大,速度越慢。第6行:如果故障转移故障转移未能在指定时间内完成,则任务故障转移失败。2.运行`192.168.239.131`Sentineldockerrun-p26379:26379--nameredis-sentinel-1\-v/mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf\-dredisredis-sentinel/usr/local/etc/redis/sentinel.conf3,run`192.168.239.130`sentineldockerrun-p26379:26379--nameredis-sentinel-2\-v/mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf\-dredisredis-sentinel/usr/local/etc/redis/sentinel.conf4、运行`192.168.239.128`sentineldockerrun-p26379:26379--nameredis-sentinel-3\-v/mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf\-dredisredis-sentinel/usr/local/etc/redis/sentinel.conf5.待解决的问题。这里创建了三个sentinel,但是检查之后是四个。我不知道问题出在哪里。换了虚拟机还是不行!有知道的可以分享一下!!六、测试master-slave和failover1.测试master-slavereplication。创建键值对:setabslave检查key是否存在:得到一个master-slave是没问题的!2.为了测试故障转移,我们停止master并检查一个sentinel的日志:dockerstopredis-masterdockerlogs-fredis-sentinel-1我们看到192.168.239.130已经成为master!重启原来的master:dockerrestartredis-masterfailover成功!!7、集成springboot1,导入依赖小编的springboot版本:2.7.4。<依赖>org.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-web2、yml配置密码与sentinel同级,否则找不到密码,验证失败。server:port:8087spring:redis:#密码和sentinel同级,否则找不到密码,验证失败password:123456sentinel:#sentinel.conf中的集群名master:my-master#我们只需要连接sentinel,Sentinel里面会帮我们找到redis节点:-192.168.239.131:26379-192.168.239.130:26379-192.168.239.128:263793,json序列化配置/***@authorwangzhenjun*@date2022/11/2410:37*/@ConfigurationpublicclassRedisConfig{@Bean@SuppressWarnings(value={"unchecked","rawtypes"})publicRedisTemplateredisTemplate(RedisConnectionFactoryconnectionFactory){RedisTemplatetemplate=新的RedisTemplate<>();template.setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializer序列化器=newJackson2JsonRedisSerializer(Object.class);//使用StringRedisSerializer序列化和反序列化redis键值template.setKeySerializer(newStringRedisSerializer());template.setValueSerializer(序列化器零);//Hashkey也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(newStringRedisSerializer());template.setHashValueSerializer(序列化器);模板.afterPropertiesSet();返回模板;}}4.新控制器测试/***@authorwangzhenjun*@date2022/11/2410:37*/@RestControllerpublicclassTestController{@AutowiredprivateRedisTemplateredisTemplate;@GetMapping("/redis")publicvoidsaveRedis(){redisTemplate.opsForValue().set("test","一看就成功了");}}5.测试http://localhost:8087/test/redis6.查看redis8.总结经过一天的搭建,总算是完成了,虽然还不完善,但是总体功能是没问题的!但是不影响故障转移和主从复制!唯一的遗憾:三个哨兵,四次检查!从三号哨兵到四号哨兵!