小编在我的其它博客文章中讲解了 Redis 主从复制,Redis哨兵模式,其实 Redis 主从复制有一个很大的缺点就是没有办法对 master 进行动态选举(当 master 挂掉后,会通过一定的机制,从 slave 中选举出一个新的 master)。然而Redis哨兵模式完美解决了这个缺点,实现集群高可用。
1、通过发送命令,让Redis服务器返回其监控的运行状态,包括主服务器和从服务器。
2、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们自动选举切换为主服务器。
小编这里配置了三台Redis,其中具体配置过程,请移步至小编的这两篇文章:
Redis主从复制配置(原理剖析)
Redis哨兵模式(原理剖析)
注明:最近小编,因为公司需要Redis配置哨兵集群,所以呢,我就回头看了之前的笔记,就是上面这两篇文章,其中,第一篇主从复制集群搭建,只要你仔细看,按照步骤搭建是完全没问题,有一些遗漏的问题,在这篇文章,我也会把详细的配置再配置一遍,包括第二篇哨兵配置需要注意的地方,下面也会再配置一遍。
下面是小编搭建好的三台服务器:
IP | 类型 | 端口 |
---|---|---|
192.168.31.6 | 主节点 | 6381 |
192.168.31.6 | 从节点 | 6382 |
192.168.31.6 | 从节点 | 6383 |
下面小编就以我目前搭建好的Redis为列子,再配置一次:
在redis的安装目录bin目录下:(默认是 /usr/local/bin/目录下)创建dtconfig:
将默认的配置redis.conf 拷贝在这个目录下,分别备份三份:
cp redis.cnf redis81.conf
cp redis.cnf redis82.conf
cp redis.cnf redis83.conf
主要配置:
#修改端口号
port 6381
#修改后台运行进程文件
pidfile "/var/run/redis_6381.pid"
#修改日志文件
logfile "6381.log"
#修改RDB持久化二进制文件名称
dbfilename "dump6381.rdb"
#设置默认后台启动
rdbchecksum yes
#修改Redis服务保护模式
protected-mode no
#设置IP(如果不设置,SpringBoot客户端哨兵模式无法连接,需要手动修改哨兵配置文件里面的主节点IP)
bind 192.168.31.6
注意: 最好设置IP,如果不设置,SpringBoot客户端哨兵模式无法连接,需要手动修改哨兵配置文件里面的主节点IP,如果服务宕机,主节点ip会自动切换为127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。在之前小编配置,直接把bind 127.0.0.1注释了,导致SpringBoot配置哨兵模式,无法连接到主节点,也就是无法连接到127.0.0.1:主节点端口 这个地址,手动把主节点一个个改了回来。
另外其余两台也是一样的配置,这里小编就不多说了。
redis-server dtconfig/redis81.conf
redis-server dtconfig/redis82.conf
redis-server dtconfig/redis83.conf
分别在6382和6383上面执行手动选举,我们先先选举一个Leader.
SLAVEOF 192.168.31.6 6381
也是在dtconfig新建sentinel.conf文件如下:
# 默认端口
port 26379
# sentinel monitor 被监控的名称 host port 1
sentinel monitor mymaster 192.168.31.6 6381 1
// 当前Sentinel节点监控 192.168.31.6:6381 这个主节点
// 1代表判断主节点失败至少需要1个Sentinel节点节点同意
// mymaster是主节点的别名
这里小编就只配置一台哨兵,作为开发测试。
cd 到Redis的安装目录bin目录下执行如下命令:
redis-sentinel dtconfig/sentinel.conf
手动使得6381主节点宕机:
redis-cli -p 6381
SHUTDOWN
exit
INFO replication
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
spring:
redis:
###################以下为redis单机模式配置###########################
#host: 192.168.31.6 # Redis服务器地址
#port: 6382 # Redis服务器连接端口
database: 0 # Redis数据库索引(默认为0)
password: # Redis服务器连接密码(默认为空)
timeout: 3000 # 连接超时时间(毫秒)
###################以下为redis哨兵增加的配置###########################
sentinel:
nodes: 192.168.31.6:26379
master: mymaster
lettuce: # Redis的Java驱动包,使用lettuce连接池
pool:
max-active: 200 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接 (默认为8)
min-idle: 0 # 连接池中的最小空闲连接
注意:sentinel.nodes: 192.168.31.6:26379 这里小编只要一个哨兵,如果是多个哨兵,后面配置以逗号分隔即可。
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* set值测试
*/
@Test
public void testSetKey(){
stringRedisTemplate.opsForValue().set("dt1","1");
System.out.println(redisUtil.get("dt1"));
}
当我们把主节点宕机之后,哨兵会自动选举,超过一定的投票数量,会选举出新的Leader。所以我们使用SpringBoot操作Redis哨兵模式,只需要Redis Sentinel 的基本参数配置:
sentinel:
nodes: 192.168.31.6:26379
master: mymaster
即可自动切换主节点,进行信息写入,这个过程,用户是无感知的。这里抛出一个面试题。
在使用SpringBoot集成Redis哨兵模式,是怎么识别主节点ip,进行数据写入的?
后面的篇章我们会仔细讲解(欢迎小伙伴们下方评论)。
另外:比如一个从节点宕机了,此时主节点正在写数据,下次从节点上线之后,还能收到之前主节点的写入的信息吗?
答案:是的,当从节点复活以后,主节点会把信息同步给它。
主节点master可读可写,从节点slave只能读;主节点将读的操作交给了从节点,变向的提高了自己写的能力。哨兵模式提高了Redis的高可用,还有很多很多的实现值得我们去深究,基于哨兵模式,后面小编将会写关于Redission分布式锁的实现,以及消息发布订阅,分布式事务实现等等,期待!!!
完结!!!
喜欢的小伙伴点个赞,另外需要讨论,交流,学习技术,希望加入群一起学习,QQ:176251012。