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。

 

posted @ 2019-08-22 13:16  myTang  阅读(156)  评论(0)    收藏  举报