快速搭建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的从节点

 

 

 

 

 

学无止境,让学习成为一种习惯。

本人水平有限,有不对的地方请指教,谢谢。

posted @   霞宝的油腻大叔  阅读(409)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示