快速搭建redis高可用架构实战---哨兵模式
之前做过一次docker搭建redis主从架构,说到主从架构一旦主机挂掉,需要手动将从机切换成主机,这样的话是很难做到及时的,也比较low,所以做点升级就有了哨兵模式。搭建哨兵架构步骤如下。
一 准备linux服务器
我这里用的是自己电脑上的三台虚拟机,centOS7版本。
二 下载redis安装包
下载地址:http://download.redis.io/releases/
这里各种版本都有,但是选哪一个版本开始支持哨兵呢?关于这个问题,网上有人说是2.4开始支持的,也有人说是2.6开始支持的,在强迫症的驱使下去官网看了一下
简单翻译一下:
当前的sentinel版本称为sentinel2版本,它使用更强更简单的预测算法重写了Sentinel的初始化实现(这个文档有解释)。
redis sentinel的稳定发布版是从redis2.8版本开始的。
新版本的开发在不稳定的分支进行,一旦新特性确认为是稳定的,就会合并到最新的稳定分支版本。
和Redis 2.6一起的Redis Sentinel1版本已经过时了,我们不要再用了。
我们就以官网为准,选2.8以上的版本,我这里用的是5.0.3版本。
下载方式两种
方式一,直接点击我们选的版本浏览器下载,这样的话就多个流程,用linux客户端传到服务器上去。
方法二,鼠标右键获取选定版本的链接地址,直接在服务器上下载。wget http://download.redis.io/releases/redis-5.0.3.tar.gz
我用方法二
三 解压到自己的目录
我这里分别下载到三台机器的目录:/usr/local
解压到当前位置:tar -zxvf redis-5.0.3.tar.gz
四 进入解压目录,编译安装
如果没有装过gcc需要提前把gcc安装好(yum install gcc)
cd redis‐5.0.3
make
五 复制配置文件redis.conf
我这里分别命名为redis-6379.conf,redis-6380.conf,redis-6381.conf
六 修改redis配置文件
port 6379
pidfile /var/run/redis_6379.pid # 把pid进程号写入pidfile配置的文件
logfile "6379.log"
dir /usr/local/redis‐5.0.3/data/6379 # 指定数据存放目录
daemonize yes #yes表示后台启动
protected‐mode no #no表示关闭保护模式,开启的话,只有本机才可以访问redis
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户
端通过机器的哪些网卡ip去访问,不限制ip注释掉即可)
port 6380
pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件
logfile "6380.log"
dir /usr/local/redis‐5.0.3/data/6380 # 指定数据存放目录
daemonize yes #yes表示后台启动
protected‐mode no #no表示关闭保护模式,开启的话,只有本机才可以访问redis
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户
端通过机器的哪些网卡ip去访问,不限制ip注释掉即可)
replicaof 192.168.74.132 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读
port 6381
pidfile /var/run/redis_6381.pid # 把pid进程号写入pidfile配置的文件
logfile "6381.log"
dir /usr/local/redis‐5.0.3/data/6381 # 指定数据存放目录
daemonize yes #yes表示后台启动
protected‐mode no #no表示关闭保护模式,开启的话,只有本机才可以访问redis
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户
端通过机器的哪些网卡ip去访问,不限制ip注释掉即可)
replicaof 192.168.74.132 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读
七 复制配置文件sentinel.conf
我这里命名为sentinel-26379.conf,sentinel-26380.conf,sentinel-26381.conf
八 修改sentinel配置文件
port 26379
daemonize yes
pidfile "/var/run/redis‐sentinel‐26379.pid"
logfile "26379.log"
dir "/usr/local/redis‐5.0.3/data"
sentinel monitor mymaster 192.168.74.132 6379 2 # mymaster这个名字随便取,客户端访问时会用到。2指明当有2个sentinel认为一个master失效时,master才算真正失效
port 26380
daemonize yes
pidfile "/var/run/redis‐sentinel‐26380.pid"
logfile "26380.log"
dir "/usr/local/redis‐5.0.3/data"
sentinel monitor redis-master 192.168.74.132 6379 2 # mymaster这个名字随便取,客户端访问时会用到。2指明当有2个sentinel认为一个master失效时,master才算真正失效
port 26381
daemonize yes
pidfile "/var/run/redis‐sentinel‐26381.pid"
logfile "26381.log"
dir "/usr/local/redis‐5.0.3/data"
sentinel monitor redis-master 192.168.74.132 6379 2 # mymaster这个名字随便取,客户端访问时会用到。2指明当有2个sentinel认为一个master失效时,master才算真正失效
九 启动服务
src/redis-server redis-6379.conf
src/redis-server redis-6380.conf
src/redis-server redis-6381.conf
src/redis‐sentinel sentinel‐26379.conf
src/redis‐sentinel sentinel‐26380.conf
src/redis‐sentinel sentinel‐26381.conf
十 查看进程及集群信息
ps -ef | grep redis,可以看到redis及哨兵都正常启动
十一 哨兵集群验证
操作之前查看三台redis
建一个springboot项目,一个controller方法,启动后访问测试接口地址:http://localhost:8080/test_sentinel,程序每隔一秒钟往redis集群写入一个数据
package com.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到
*
* @throws InterruptedException
*/
@RequestMapping("/test_sentinel")
public void testSentinel() throws InterruptedException {
int i = 1;
while (true){
try {
stringRedisTemplate.opsForValue().set("test"+i, i+""); //jedis.set(key,value);
System.out.println("设置key:"+ "test" + i);
i++;
Thread.sleep(1000);
}catch (Exception e){
logger.error("错误:", e);
}
}
}
}
pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
yml配置文件:
server:
port: 8080
spring:
redis:
database: 0
timeout: 3000
sentinel: #哨兵模式
master: mymaster #主服务器所在集群名称
nodes: 192.168.74.132:26379,192.168.74.129:26380,192.168.74.130:26381
lettuce:
pool:
max-idle: 50
min-idle: 10
max-active: 100
max-wait: 1000
查看redis
把主节点6379停掉,可以看到程序异常
大概29秒之后恢复正常
再查看redis各节点集群信息,6380成了新的主节点
重新启动6379,成了6380的从节点
学无止境,让学习成为一种习惯。
本人水平有限,有不对的地方请指教,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)