这个就是根据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 #查看主从信息
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
在默认配置文件的最底下添加内容,启动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
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了.
org.springframework.boot
spring-boot-starter-data-redis
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
@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;
}
}
@Resource
private RedisTemplate redisTemplate;
然后开启各种Redis方法,此处简单举例,详见RedisTemplate的用法:
删除: redisTemplate.delete(String key)
查询简单类型数据: redisTemplate.opsForValue().get(String key)
添加简单类型数据: edisTemplate.opsForValue().set(String key, String value);