哨兵模式:自动主从同步、自动选举主节点;基本可以满足大部分业务场景;
在针对大规模数据和高并发请求的场景、数据不能丢失,才需要用到集群模式。
本文教程基于redis3 , centos 8 stream操作系统,理论上来说 redis3也好 redis6也罢 ,centos和类centos系统都通用。
文章目录
- 安装redis
- 配置redis
- 配置redis.conf
- 配置sentinel.conf
- 启动redis和哨兵
- springboot项目整合
- maven依赖
- yml配置
- 验证
安装redis
-
下载redis包、解压
如果没有c++环境 需要先安装
yum -y install gcc gcc-c++ make
下载redis:
wget http://download.redis.io/releases/redis-3.2.6.tar.gz
解压redis:
tar -zxvf redis-3.2.6.tar.gz
进入redis的解压目录
(假设当前在在 /app/redis/ 目录下)cd redis-3.2.6/
编译redis
make
进入src目录
cd src
编译成功src目录下会有 redis-server 以及 redis-sentinel文件
配置redis
配置redis.conf
进入目录:
cd /app/redis/redis-3.2.6/
编辑配置文件:
vim redis.conf
核心修改地方:
主节点
# 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
# 设置redis日志存放路径 需要先手动touch创建该文件
logfile "/app/redis/log/redis_6379.log"
# 设置为no,允许外部网络访问
protected-mode no
# redis端口
port 6379
# 设置redis密码
requirepass 123456
# 主从同步master的密码
masterauth 123456
# appendonly 一般保持默认的no就可以 , 取决业务是否需要开启AOF
appendonly no
从节点1
(核心区别在于配置文件最后一行需要指定主节点)
tips:由于博主在同一台机器部署,所以port和logfile也有变动;
同一机器部署时,需要复制一个redis.tar包 解压,将改好的从节点配置文件复制过去,并编译
# 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
# 设置redis日志存放路径 需要先手动touch创建该文件
logfile "/app/redis/log/redis_6389.log"
# 设置为no,允许外部网络访问
protected-mode no
# redis端口 博主在同一台机器模拟部署,所以改了端口
port 6389
# 设置redis密码
requirepass 123456
# 主从同步master的密码
masterauth 123456
# appendonly 一般保持默认的no就可以 , 取决业务是否需要开启AOF
appendonly no
# 从节点核心配置:指定主节点地址 redis5以上为replicaof
slaveof 192.168.0.1 6379
从节点2:
与从节点1相似,改了个port
# 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
# 设置redis日志存放路径 需要先手动touch创建该文件
logfile "/app/redis/log/redis_6399.log"
# 设置为no,允许外部网络访问
protected-mode no
# redis端口 博主在同一台机器模拟部署,所以改了端口
port 6399
# 设置redis密码
requirepass 123456
# 主从同步master的密码
masterauth 123456
# appendonly 一般保持默认的no就可以 , 取决业务是否需要开启AOF
appendonly no
# 从节点核心配置:指定主节点地址 redis5以上为replicaof
slaveof 192.168.0.1 6379
注意: 哨兵模式不需要开启 cluster-enable!
配置sentinel.conf
主节点:
# 修改Sentinel监听端口
port 26379
# 设置为no,允许外部网络访问 (不能漏了)
protected-mode no
# 允许Sentinel后台运行
daemonize yes
# 设置Sentinel日志存放路径 同样需要手动touch创建
logfile "/app/redis/log/redis_6379_sentinel.log"
# mymaster:master名称可自定义,127.0.0.1 6379 :redis主节点IP和端口,2 :表示多少个Sentinel认为redis主节点失效时,才算真正失效
sentinel monitor mymaster 127.0.0.1 6379 2
# 配置失效时间,master会被这个sentinel主观地认为是不可用的,单位毫秒
sentinel down-after-milliseconds mymaster 10000
# 若sentinel在该配置值内未能完成master/slave自动切换,则认为本次failover失败。
sentinel failover-timeout mymaster 60000
# 在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步。
sentinel parallel-syncs mymaster 2
# 设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同
sentinel auth-pass mymaster 123456
两个从节点配置都是和主节点一样的,由于博主是同机器模拟部署,所以改了个port
从节点1修改部分:
# 修改Sentinel监听端口
port 26389
从节点2修改部分:
# 修改Sentinel监听端口
port 26399
启动redis和哨兵
cd /app/redis/
先启动redis主节点
./redis-3.2.6/src/redis-server ./redis-3.2.6/redis.conf
再启动redis两个从节点 (注意将路径和配置文件名 改成自己的)
./redis_s1/src/redis-server ./redis_s1/redis_s1.conf
./redis_s2/src/redis-server ./redis_s2/redis_s2.conf
先启动sentinel哨兵主节点
./redis-3.2.6/src/redis-sentinel ./redis-3.2.6/sentinel.conf
再启动sentinel哨兵两个从节点 (注意将路径和配置文件名 改成自己的)
./redis_s1/src/redis-sentinel ./redis_s1/sentinel_s1.conf
./redis_s2/src/redis-sentinel ./redis_s2/sentinel_s2.conf
springboot项目整合
maven依赖
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lettuce Core, 用于Redis客户端连接 -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
yml配置
特别注意:nodes配置的是哨兵的端口,所以这也是为什么我们在sentinel.conf里面也要关闭protected mode的原因
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.0.1:26379,192.168.0.1:26380,192.168.0.1:26381
##redis 单机环境配置
# port: 6379
# host: 192.168.0.1
# password: 123456
password: 123456
database: 1
验证
- 我们可以通过可视化图形界面来验证, 在主节点增加一个key,我们打开从节点 发现key自动同步过去了,说明自动同步成功; 回到服务器将主节点kill -9 杀掉,在从节点1新增一个key, 从节点2能自动同步 ; 重新启动主节点 主节点也能拉取到从节点新增的数据 ,则表明集群正常运转。
- 可以通过redis自带的cli 检验:
cd /app/redis/redis-3.2.6/src
./redis-cli
输入密码
auth 123456
查看集群
info replication
按照教程步骤 6379端口对应的redis 本来是主节点,博主将主节点kill -9,并重启6379。
如下图:成功选举了6389为主节点,6379变成了slave