Redis的哨兵和主从实践
一、redis的主从搭建和哨兵集群搭建
redis的主从可以实现数据的冗余备份和独写分离;
redis的哨兵集群通过监控redis的master自动实现主机失效转移,提升新的slave为master;
1、下载windows的redis地址:https://github.com/microsoftarchive/redis/releases
2、redis的主从配置:
主:127.0.0.1 6301 配置文件redis.conf如下:
requirepass 123456
port 6301
#bind 127.0.0.1
从1:127.0.0.1 6302 配置如下:
requirepass 123456 port 6302 slaveof 127.0.0.1 6301 masterauth 123456
#bind 127.0.0.1
从2:127.0.0.1 6303 配置如下:
requirepass 123456 port 6303 slaveof 127.0.0.1 6301 masterauth 123456
#bind 127.0.0.1
依次启动3个redis服务,启动命令为 redis-server.exe redis.conf
注意这里要加上:#bind 127.0.0.1,虽然都是
依次启动后master效果如下:

可以看到6302、6303依次加入从机
这样就搭建好了一个一主多从;
3、redis的哨兵集群一般配置为3个节点:
哨兵node1:127.0.0.1 6001配置文件sentinel.conf如下:
#sentinel监听端口,默认是26379,可以修改。 port 6001 #sentinel monitor <master-name> <ip> <redis-port> <quorum> #master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效 sentinel monitor my-redis 127.0.0.1 6301 2 #sentinel auth-pass <master-name> <password> #设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。 sentinel auth-pass my-redis 123456 #sentinel down-after-milliseconds <master-name> <milliseconds> #这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒 sentinel down-after-milliseconds my-redis 30000 #sentinel parallel-syncs <master-name> <numslaves> #这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。 sentinel parallel-syncs my-redis 1 #sentinel failover-timeout <master-name> <milliseconds> #failover-timeout 可以用在以下这些方面: #1. 同一个sentinel对同一个master两次failover之间的间隔时间。 #2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。 #3.当想要取消一个正在进行的failover所需要的时间。 #4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。 sentinel failover-timeout my-redis 20000
哨兵node2:127.0.0.1 6002配置端口为6002;
哨兵node3:127.0.0.1 6003配置端口为6003;
依次启动3个redis服务,启动命令为 redis-server.exe sentinel.conf --sentinel
启动后的效果如下:

这样就搭建好了一个哨兵集群。
4、现在我们停掉6301这台redis主服务,几十秒之后可以看到sentinel命令窗口出现如下信息:

这就是redis-sentinel监控到master失效后提升6302这台从服务为master,这就完成了redis的失效转移。
然后当我们的运维工程师发现master死掉后然后想重启6301这台服务让他重新加入到6302这个集群,出现效果如下:

通过上面的提示我们知道6301这台服务一直想要加入6302这个集群,但是提示认证失败,我们现在打开我们6301这台服务的redis.conf;
requirepass "123456" port 6301 # Generated by CONFIG REWRITE dir "C:\\soft\\Redis-x64-3.2.100\\cluster-master" slaveof 127.0.0.1 6302
我们发现6301的配置已经被修改了,而已是一个slave的配置,那我们在这里加上如下配置:
masterauth 123456
然后重启6301这个服务,就顺利的加入了新的6302集群。
二、java配置redis的哨兵集群
1、这里为了简单我创建了一个springboot项目
application.properties配置如下:
spring.redis.sentinel.master=my-redis #之前在sentinel中定义的集群名称 spring.redis.sentinel.nodes[0]=127.0.0.1:6001 #sentinel节点地址和端口 spring.redis.sentinel.nodes[1]=127.0.0.1:6002 spring.redis.sentinel.nodes[2]=127.0.0.1:6003 spring.redis.password=123456 #redis的密码
2、代码如下:
package com.simpleboot; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.redis.core.StringRedisTemplate; @SpringBootApplication public class SimplebootApplication { public static void main(String[] args) { ConfigurableApplicationContext context= SpringApplication.run(SimplebootApplication.class, args); StringRedisTemplate redisTemplate = context.getBean(StringRedisTemplate.class); redisTemplate.opsForValue().set("hello", "你好"); String val = redisTemplate.opsForValue().get("hello"); System.out.println(val); } }
然后我们可以成功的操作redis。
3、现在我们停掉6302这台master,重新运行程序出现如下错误:

但是过几十秒之后,redis-sentinel重新选出master之后又能成功运行,这个就是redis哨兵的作用,由redis-sentinel告诉我们应用端当前的master。

浙公网安备 33010602011771号