使用redis的分片可以满足redis内存的扩容,但是一旦有服务器宕机,那么整个redis都将无法使用
redis可以利用哨兵模式来实现redis的高可用
首先配置主从结构,一台主机下面可以挂载多台从机,主机的数据同步到从机,但是从机只能读不能写
哨兵进行监听,利用心跳检测机制检查当前主机是否存货,如果超过3次没有回应则表示主机宕机
当主机宕机后,会从当前的从机中选举一个主机,其余机器都是从机,以前的主机在从新启动以后也会挂载到当前主机上
检查是否有启动的redis
ps -ef|grep redis
关闭redis
kill -9 kid
复制分片文件夹更名为sentinel
cp shards sentinel
进入sentinel
cd sentinel
启动多台 redis
redis-server redis-6379.conf & redis-server redis-6380.conf & redsi-server redis-6381.conf
主机:6379
从机6380,6381
连接从机
redis-server redis-6380.conf
挂载到主机
slaveof 主机ip 端口
检查挂载情况
info replication
在redis目录下有一个哨兵的配置文件复制到sentinel目录下
cp sentine.conf sentine
使用vim打开sentine.conf配置文件
vim sentine.conf
如下修改
关闭保护模式 protected-mode no #去点注释 开启后台启动 daemonize yes 修改哨兵监听端口 sentinel monitor mymaster 127.0.0.1 6379 1
启动哨兵
redis-sentinel sentinel.conf
配置文件 redis.properties
redis.sentinel.masterName=mymaster
redis.sentinels=39.101.165.86:26379
redisConfig.java
@PropertySource(value = "classpath:/properties/redis.properties")
@Configuration
public class RedisConfig {
@Value("${redis.sentinel.masterName}")
private String masterName;
@Value("${redis.sentinels}")
private String sentinels;
@Bean(name = "jedisSentinelPool")
public JedisSentinelPool jedisSentinelPool(){
Set<String> sentinel = new HashSet<>();
sentinel.add(sentinels);
JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinel);
return pool;
}
@Bean
@Scope("prototype")
public Jedis jedis(@Qualifier("jedisSentinelPool")JedisSentinelPool pool){
Jedis jedis = pool.getResource();
return jedis;
}
}