三台服务器使用Docker搭建Redis一主二从三哨兵,概念-搭建-整合Springboot

一、前言

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

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

第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行​​故障转移​​!
第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能!

哨兵最低配是三哨兵,以奇数递增。
分片集群最低配是三主三从。

二、准备

首先我们要准备:
三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈!

三台机器的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 实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如在不同可用区上执行的不同物理服务器或虚拟机。

详细介绍和使用:请见官网 —>官网详细文档:https://redis.io/docs/management/sentinel/

四、一主二从搭建

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

1、创建挂载目录

三台机器上新建目录:
首先我们开启三个xshell窗口,然后同时操作三个窗口创建。

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

cd/
mkdirmydata
cd/mydata
mkdirredis
cdredis
mkdirdata
mkdirconf
cdconf

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、创建挂载目录

还是三个虚拟机一起创建。

mkdirsentinel
cdsentinel
vimsentinel.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

4、运行`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

5、待解决问题

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

六、测试主从和故障转移

1、测试主从复制

master节点创建一个键值对:

set a b

从查看key是否存在:

get a

主从没有问题哈!

2、测试故障转移

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

dockerstopredis-master
dockerlogs-fredis-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
publicclassRedisConfig {

@Bean
@SuppressWarnings(value= { "unchecked", "rawtypes" })
publicRedisTemplate<Object, Object>redisTemplate(RedisConnectionFactoryconnectionFactory)
{
RedisTemplate<Object, Object>template=newRedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializerserializer=newJackson2JsonRedisSerializer(Object.class);

// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(newStringRedisSerializer());
template.setValueSerializer(serializer);

// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(newStringRedisSerializer());
template.setHashValueSerializer(serializer);

template.afterPropertiesSet();
returntemplate;
}
}

4、新建controller测试

/**
* @author wangzhenjun
* @date 2022/11/24 10:37
*/
@RestController
publicclassTestController {

@Autowired
privateRedisTemplateredisTemplate;

@GetMapping("/redis")
publicvoidsaveRedis(){
redisTemplate.opsForValue().set("test","看到我就成功了");
}
}

5、测试

http://localhost:8087/test/redis

6、查看redis

八、总结

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

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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/261593.html<

(0)
管理的头像管理
上一篇2025-05-03 17:15
下一篇 2025-05-03 17:17

相关推荐

  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0
  • BGP线路到底是什么意思呢,有什么优势?

    BGP线路是一种通过边界网关协议实现多运营商网络互联的接入方式,能自动选择最优路径,极大提升跨网访问速度和稳定性,是解决国内南北网络瓶颈的核心方案,什么是BGP线路BGP,全称Border Gateway Protocol,边界网关协议,是互联网核心路由协议之一,它负责在自治系统之间交换网络可达性信息,BGP线……

    2026-07-26
    0
  • 增值电信业务经营许可证对IDC有多重要,如何办理?

    增值电信业务经营许可证是IDC服务商合法运营的核心凭证,它直接决定了机房能否接入骨干网、客户能否放心托管业务,以及服务商自身能否长期稳定发展,许可证是IDC进入市场的硬门槛互联网数据中心业务属于增值电信业务中的B1类,依据工信部《电信业务经营许可管理办法》,任何从事服务器托管、虚拟主机、云服务等业务的企业,必须……

    2026-07-26
    0
  • 站群服务器一个IP放几个网站合适?,怎么选

    站群服务器一个IP放3-5个网站是大多数情况下的最佳平衡点,但具体数量需根据网站权重、内容质量及IP资源成本灵活调整,这个结论基于搜索引擎对同IP站点的关联判定逻辑,以及站群运营的长期实践,如果你刚接触站群,可能会纠结于IP分配,但核心原则是:不要让搜索引擎轻易识别出这些网站属于同一实体,站群IP分配的底层逻辑……

    2026-07-26
    0
  • DDoS攻击和CC攻击有什么区别,怎么防御?

    DDoS攻击和CC攻击最核心的区别在于攻击目标不同:DDoS攻击主要消耗网络带宽和基础设施资源,而CC攻击专门针对应用层逻辑,耗尽服务器CPU和数据库连接数,两者从原理到防御手段完全不同,攻防视角下的本质差异攻击目标:一个砸门,一个撬锁DDoS攻击(分布式拒绝服务)瞄准的是网络层和传输层,通过大量伪造数据包或畸……

    2026-07-26
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注