redis高可用-主从加哨兵篇

主从复制&哨兵模式搭建Redis

说明

这个就是根据Redis官方文档一步步来的,详情见Redis Sentinel Documentation

准备工作

首先创建文件夹:
mkdir -p /data/logs/redis #用来存放日志
mkdir -p /data/appData/redis #用来存放rdb持久化文件
mkdir -p /data/pid #用来存放Redis-server的PID文件

常用命令

./redis-server redis_6379.conf #启动Redis server,并指定配置文件
./redis-cli -p 6379 #启动Redis client,并指定端口
./bin/redis-cli -p 6379 -a 89757 #启动Redis client,并指定端口和密码
./redis-sentinel sentinel_5000.conf #启动sentinel,并指定配置文件;其实redis-sentinel就是一个特殊模式的redis-server
./redis-cli -p 6379 shutdown #关闭端口为6379的redis-server,相当于进入client然后执行shutdown命令
./bin/redis-cli -p 5000 sentinel master mymaster #查看群组名为mymaster的sentinel集群的状态,相当于进入client然后执行后面那串命令
pgrep -f redis|xargs kill #关闭所有跟redis有关的进程(sentinel,client也会被kill),这个用于一台机器上部署了多个Redis服务
auth password #如果启动时不指定密码,进入Redis后,输入密码,例如:auth 89757
info replication #查看主从信息

replica&sentinel模式

1.主从模式已从master-slave改名为master-replicas  
2.哨兵模式至少需要3个哨兵: sentinel在实现故障切换的时候,需要得到大多数sentinel的同意(还有有其他问题,没有刨根问底),故至少需要三个sentinel
3.结论
简单的结构为:1个master,1个replica,3个sentinel (C代表client)
+----+         +----+
| M1 |----+----| R1 |
| S1 |    |    | S2 |  
+----+    |    +----+
        +----+
        | C1 |
        | S3 |
        +----+

PS.如果master加了密码 requirepass xxx,replica和sentinel也需要添加对应的配置,不然连接不上的(我就浪费了很多时间):
  replica需要配置 masterauth xxx ,
  sentinel需要 sentinel auth-pass  

replica

在默认配置文件的最底下添加内容,启动Redis-server的时候,它会自动格式化.

master和replica共同的操作:复制一份默认的配置文件,然后把"bind"注释掉

在master的配置文件
最底下添加:

port 6379
protected-mode no
pidfile /data/pid/redis_6379.pid
daemonize yes
logfile "/data/logs/redis/redis_6379.log"
dbfilename dump_6379.rdb
dir /data/appData/redis
appendonly no
appendfilename "appendonly_6379.aof"
maxmemory 100mb

在replica的配置文件最底下添加:

port 6380
protected-mode no
pidfile /data/pid/redis_6380.pid
daemonize yes
logfile "/data/logs/redis/redis_6380.log"
dbfilename dump_6380.rdb
dir /data/appData/redis
appendonly no
appendfilename "appendonly_6380.aof"
maxmemory 100mb
replicaof 10.0.7.76 6379 #master的IP port  

配置好后依次启动两个Redis-server:

./bin/redis-server redis_6379.conf  
./bin/redis-server redis_6380.conf  

sentinel哨兵模式

https://redis.io/topics/sentinel

sentinel配置如下:(master和replica都是这样,如果部署在一台机器,端口和日志名要改一下,其他都不变)

daemonize yes
logfile "/data/logs/redis/sentinel_ 5000.log"

port 5000
sentinel monitor mymaster 10.0.7.76 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

配置好后依次启动三个sentinel:

./bin/redis-sentinel sentinel_5000.conf
./bin/redis-sentinel sentinel_5001.conf
./bin/redis-sentinel sentinel_5002.conf

然后查看mymaster的情况:
./bin/redis-cli -p 5000 sentinel master mymaster

kill掉master-redis-server(6379),过大概5秒,6380被选举为新的master;这时候再启动6379,它自动成为6380的replica了.

在springboot中使用

    1. pom文件中添加依赖:

    org.springframework.boot
    spring-boot-starter-data-redis

    1. application.yml中添加:
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 10.0.7.76:5000,10.0.7.76:5001,10.0.7.76:5002
    # 下面这些参数具体有没有生效呢?请见下回分解
    database: 0
    jedis:
      pool:
        max-active: 200
        max-idle: 10
        max-wait: -1ms
        min-idle: 0
    timeout: 10000ms
    1. 添加spring的配置类:
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setValueSerializer(stringRedisSerializer);
        template.setHashValueSerializer(stringRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}
    1. 调用redis:
@Resource
private RedisTemplate redisTemplate;
   
然后开启各种Redis方法,此处简单举例,详见RedisTemplate的用法:
 
删除: redisTemplate.delete(String key)
查询简单类型数据: redisTemplate.opsForValue().get(String key)
添加简单类型数据: edisTemplate.opsForValue().set(String key, String value);

你可能感兴趣的:(redis,Redis高可用,主从复制备份,哨兵,springboot)