一、前言

redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。

redis有两种高可用的方案:

  • High availability with Redis Sentinel(哨兵)
  • Scaling with Redis Cluster(分片集群)

第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行故障转移

第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能!

哨兵最低配是三哨兵,以奇数递增。

分片集群最低配是三主三从。

小编之前写过一篇在一台机器上搭建的文章,大家有兴趣可以先去体验一下,实际生产上不会让你一台机器上;也没有任何意义,服务器挂了,再多的集群也全部挂掉了!!

docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot

二、准备

首先我们要准备:

三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈!

三台机器的ip和名称在表格里整理一下!

ip redis节点名称 sentinel节点名称
192.168.239.131 redis-master redis-sentinel-1
192.168.239.130 redis-slave-1 redis-sentinel-2
192.168.239.128 redis-slave-2 redis-sentinel-3

三、Sentinel概念

Redis Sentinel 在不使用Redis Cluster时为 Redis 提供高可用性

Sentinel功能的完整列表:

  • 监控:Sentinel 不断检查您的主实例和副本实例是否按预期工作。
  • 通知:Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。
  • 自动故障转移:如果 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个副本被提升为 master,其他额外的副本被重新配置为使用新的 master,并且使用 Redis 服务器的应用程序被告知要使用的新地址连接时。
  • 自动更新配置:Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinels 以询问负责给定服务的当前 Redis master 的地址。如果发生故障转移,Sentinels 将报告新地址。

官方哨兵搭建条件:

  • 您至少需要三个 Sentinel 实例才能进行可靠的部署。
  • 三个 Sentinel 实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如在不同可用区上执行的不同物理服务器或虚拟机

详细介绍和使用:请见官网 --->官网详细文档

四、一主二从搭建

话不多说,咱们直接开始搭建哈!

1. 创建挂载目录

三台机器上新建目录:

首先我们开启三个xshell窗口,然后同时操作三个窗口创建



然后再左下角选择发送到全部窗口!

cd /
mkdir mydata
cd /mydata
mkdir redis
cd redis
mkdir data
mkdir conf
cd conf

2. 在192.168.239.131机器上编辑文件

vim redis.conf

输入以下内容:

# 任何都可以连接redis
bind 0.0.0.0
# 配置master密码
requirepass 123456
# 宕机后成为从要连接master的密码
masterauth 123456
# 开启持久化
appendonly yes

3. 在192.168.239.130机器上编辑文件

vim redis.conf

输入以下内容:

# 配置master的ip和端口号
replicaof 192.168.239.131 6379
# 任何都可以连接redis
bind 0.0.0.0
# 成为master后的密码
requirepass 123456
# 连接master密码
masterauth 123456
# 开启持久化
appendonly yes

4. 在192.168.239.128机器上编辑文件

vim redis.conf

输入以下内容:

# 配置master的ip和端口号
replicaof 192.168.239.131 6379
# 任何都可以连接redis
bind 0.0.0.0
# 成为master后的密码
requirepass 123456
# 连接master密码
masterauth 123456
# 开启持久化
appendonly yes

5. 192.168.239.131启动redis

docker run -p 6379:6379 --name redis-master \
-v /mydata/redis/data:/usr/local/etc/redis/data \
-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-d redis redis-server /usr/local/etc/redis/redis.conf

查看启动日志:

docker logs -f redis-master

6. 192.168.239.130启动redis

docker run -p 6379:6379 --name redis-slave-1 \
-v /mydata/redis/data:/usr/local/etc/redis/data \
-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-d redis redis-server /usr/local/etc/redis/redis.conf

可以看到已经连接到master节点了!

7. 192.168.239.128启动redis

docker run -p 6379:6379 --name redis-slave-2 \
-v /mydata/redis/data:/usr/local/etc/redis/data \
-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-d redis redis-server /usr/local/etc/redis/redis.conf

8. 进入192.168.239.130容器查看

我们查看master日志,可以看到两个从节点已经加入进来了!

我们进入容器进行在次查看:

docker exec -it redis-master /bin/bash

连接redis:

redis-cli

登录redis

auth 123456

查看从节点:

info

也是可以看到有两个从节点!

五、搭建三哨兵sentinel

1. 创建挂载目录

还是三个虚拟机一起创建

mkdir sentinel
cd sentinel
vim sentinel.conf

输入下面内容:

port 26379
sentinel monitor redis-master 192.168.239.131 6379 2
sentinel auth-pass redis-master 123456
sentinel down-after-milliseconds redis-master 6000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 6000

第二行:Redis 监控一个名为redis-master的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!!

第三行:配置master的密码

第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。

第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。

第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。

2. 运行192.168.239.131哨兵

docker run -p 26379:26379 --name redis-sentinel-1 \
-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf

3. 运行192.168.239.130哨兵

docker run -p 26379:26379 --name redis-sentinel-2 \
-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf

3. 运行192.168.239.128哨兵

docker run -p 26379:26379 --name redis-sentinel-3 \
-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf

4. 待解决问题

这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!!

六、测试主从和故障转移

1. 测试主从复制

master节点创建一个键值对:

set a b

从查看key是否存在:

get a



主从没有问题哈!

2. 测试故障转移

我们把master停掉,查看一个哨兵的日志:

docker stop redis-master
docker logs -f redis-sentinel-1

我们看到192.168.239.130成为master!



重新启动原来的master:

docker restart redis-master

故障转移成功!!

七、整合springboot

1. 导入依赖

小编的springboot版本为:2.7.4

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. yml配置

password密码和sentinel同级,不然找不到密码,验证失败

server:
port: 8087 spring:
redis:
# 密码和sentinel同级,不然找不到密码,验证失败
password: 123456
sentinel:
# sentinel.conf里的集群名称
master: my-master
# 我们只需要连哨兵即可,哨兵内部会帮我们找到redis
nodes:
- 192.168.239.131:26379
- 192.168.239.130:26379
- 192.168.239.128:26379

3. json序列化配置

/**
* @author wangzhenjun
* @date 2022/11/24 10:37
*/
@Configuration
public class RedisConfig { @Bean
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); // 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer); // Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer); template.afterPropertiesSet();
return template;
}
}

4. 新建controller测试

/**
* @author wangzhenjun
* @date 2022/11/24 10:37
*/
@RestController
public class TestController { @Autowired
private RedisTemplate redisTemplate; @GetMapping("/redis")
public void saveRedis(){
redisTemplate.opsForValue().set("test","看到我就成功了");
}
}

5. 测试

http://localhost:8087/test/redis

6. 查看redis

八、总结

经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制!

唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个!

如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!


可以看下一小编的微信公众号,文章首发看,欢迎关注,一起交流哈!!

三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot的更多相关文章

  1. Docker Compose搭建Redis一主二从三哨兵高可用集群

    一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...

  2. springboot 集成Redis一主二从三哨兵

    1.Centos7 Redis一主二从三哨兵配置 Redis一主二从三哨兵环境搭建 2.接入过程 与集成redis单机不同的是jedis相关的配置做了修改,JedisPool换成了JedisSenti ...

  3. redis环境搭建及一主二从三哨兵模式配置

    一.单机redis环境搭建 1.安装: OS:linux redhat6.5 下载redis 官网下载链接:https://redis.io/download 把安装包上传到服务器,进行解压 [roo ...

  4. 实践 - 搭建Redis一主两从三哨兵

    实践 - 搭建Redis一主两从三哨兵 原因: 最近在复习Redis的时候,学习到了为了提高Redis集群的高可用性,有一个模式为哨兵模式.哨兵模式的作用是为了在主节点出现阻塞或者错误,无法接收数据的 ...

  5. docker-compose一键部署redis一主二从三哨兵模式(含密码,数据持久化)

    本篇基于centos7服务器进行部署开发 一.拉取redis镜像,使用如下命令 docker pull redis 1.查看镜像是否拉取成功,使用如下命令 docker images 显示如下则证明拉 ...

  6. redis一主二从三哨兵

    redis做集群的时候有很多种配置方法,一主二从三哨兵这种模式是官网推荐的.,写配置文件链接的时候,写的是哨兵地址,不是IP,用户名,密码之类的. 一主二从很好理解,一个主的redis,实时备份到两个 ...

  7. redis 一主二从三哨兵

    总体部署 一主二从三哨兵 ip地址分配分别为 主 127.0.0.1:6379 从 127.0.0.1:6389 从 127.0.0.1:6399 哨兵 127.0.0.1:26379 哨兵 127. ...

  8. Docker搭建Redis一主两从三哨兵

    作者:oscarwin juejin.im/post/5d26b03de51d454fa33b1960 这次实验准备了三台云主机,系统为Debian,ip分别为:35.236.172.131 ,35. ...

  9. 【运维技术】redis(一主两从三哨兵模式搭建)记录

    redis(一主两从三哨兵模式搭建)记录 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也包含我自己,能够节省对应的时间. 软件架构: 生产环境使用三台 ...

  10. docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】

    一.前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群. redis有两种高可用的方案: High availability with Re ...

随机推荐

  1. Docker Private Registry

    Docker Private Registry 目录 Docker Private Registry Docker Registry Docker Private Registry 使用docker- ...

  2. C语言------循环结构II

    仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4 .小结 1 .实训名称 实训6: ...

  3. Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)

    上一个章节实现数据在组件之间的传递 .这一章主要是完成添加任务到任务栏.删除任务栏.统计任务完成情况.主要还是参数在各个组件之间的传递. 上一章节的链接地址:https://blog.csdn.net ...

  4. 齐博x1模板中常用的TP标签数据处理

    上图是比较常用的, 而下图是比较特殊的场合,比如幻灯片可能会用到 下图使用了TP的循环标签. 上图只使用了条件判断标签 上图不存在 val="xxx" 这个参数,所以会自动循环输出 ...

  5. 制作一个windows垃圾清理小程序

    制作一个windows垃圾清理小程序: 把下列代码保存为.bat文件(如垃圾清理.bat) 双击它就能很快地清理垃圾文件,大约一分钟不到. 就是下面的文字(这行不用复制)=============== ...

  6. 二、Django下载与运行

    二.Django下载与运行 2.1.Django的下载 目前我们学习和使用的版本是3.2LTS版本 目前开源软件发布一般会有2个不同的分支版本: 1. 普通发行版本: 经常用于一些新功能,新特性,但是 ...

  7. 八、Django的组件

    8.1.中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...

  8. Spring Boot:自定义 Whitelabel 错误页面

    一.概述在本文中,我们将研究如何禁用和自定义 Spring Boot 应用程序的默认错误页面,因为正确的错误处理描述了专业性和质量工作. 2.禁用白标错误页面 首先,让我们看看如何通过将server. ...

  9. onps栈移植说明(1)——onps栈的配置及裁剪

    onps栈的移植涉及几个部分:1)系统配置及裁剪:2)基础数据类型定义:3)RTOS适配层实现:4)编写网卡驱动并注册网卡.本文作为onps栈移植的指导性文件将给出一般性的移植说明及建议,具体的移植样 ...

  10. 京东云开发者|mysql基于binlake同步ES积压解决方案

    1 背景与目标 1.1 背景 国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与My ...