SpringBoot结合Redis哨兵模式的实现示例

网友投稿 233 2022-12-08


SpringBoot结合Redis哨兵模式的实现示例

Redis哨兵模式

Redis Sentinel介绍

Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。

Redis Sentinel主要功能

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

提醒(Notification):当被监控的某个 Redis 服务器出现问题时, SentinelaqVpmBK 可以通过 API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel部署

Redis集群配置

Redis集群启动

复制3个reids.conf配置文件

cp redis.conf /home/redis/redis6379.conf

cp redis.conf /home/redis/redis6380.conf

cp redis.conf /home/redaqVpmBKis/redis6381.conf

修改reids.conf配置文件,以6379配置为例

vim redis6379.conf

#启用后台启动

daemonize yes

#pidfile位置

pidfile "/home/redis/6379/redis6379.pid"

#端口

port 6379

#日志文件位置

logfile "/home/redis/6379/log6379.log"

#rdb备份文件名称

dbfilename "dump6379.rdb"

#rdb备份文件路径

dir "/home/redis/rdb/"

修改redis-slave配置文件,修改和master如上配置,6380、6381配置文件,新增如下

slaveof 192.168.126.200 6379

先启动master服务,在启动slave服务

master节点服务

./redis-cli -p 6379

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.126.200,port=6380,state=online,offset=975350,lag=1

slave1:ip=192.168.126.200,port=6381,state=online,offset=975350,lag=1

master_repl_offset:975495

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:975494

slave节点服务

./redis-cli -p 6380

# Replication

role:slave

master_host:192.168.126.200

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:989499

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

sentinel集群配置

编写sentinel配置文件,master配置

touch sentinel1.conf

vim sentinel1.conf

#Sentinel节点的端口

port 26379

dir "/home/redis/sentinel"

daemonize yes

logfile "sentinel-26379.log"

#当前Sentinel节点监控 127.0.0.1:6379 这个主节点

#代表判断主节点失败至少需要2个Sentinel节点节点同意

#mymaster是主节点的别名

sentinel monitor mymaster 192.168.126.200 6380 2

#每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达

sentinel down-after-milliseconds mymaster 30000

#当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向>新的主节点发起复制操作的从节点个数为1

sentinel leader-epoch mymaster 1

#故障转移超时时间为180000毫秒

sentinel failover-timeout mymaster 180000

#同理创建修改sentinel2.conf、sentinel3.conf配置文件

启动3台sentinel服务

./redis-sentinel /home/redis/sentinel1.conf

./redis-sentinel /home/redis/sentinel2.conf

./redis-sentinel /home/redis/sentinel3.conf

SpringBoot结合Redis哨兵模式

创建SpringBoot项目,添加依赖

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

org.projectlombok

lombok

org.apache.commons

commons-pool2&http://lt;/artifactId>

核心配置文件application.yml

server:

port: 80

spring:

redis:

lettuce:

pool:

# 连接池最大连接数(使用负值表示没有限制) 默认为8

max-active: 8

# 连接池中的最大空闲连接 默认为8

max-idle: 8

# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认为-1

max-wait: -1ms

# 连接池中的最小空闲连接 默认为 0

min-idle: 0

sentinel:

# 主节点的别名

master: mymaster

# sentinel服务的ip和端口

nodes: 192.168.126.200:26379,192.168.126.200:26380,192.168.126.200:26381

程序调用

@RestController

@RequestMapping("/redis")

public class RedisController {

// 使用SpringBoot封装的RestTemplate对象

@Autowired

RedisTemplate redisTemplate;

@RequestMapping("/get")

public String get(String key) {

String value = redisTemplate.opsForValue().get(key);

return value;

}

@RequestMapping("/set")

public String set(String key, String value) {

redisTemplate.opsForValue().set(key, value);

return "success";

}

}

模拟故障

手动shutdown redis的master服务后,后台会尝试重连,当超过最大等待时间,无法连接后,sentinel会重新选举出一个新的master,程序获取到新的master节点,提供读写服务


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现斗地主发牌系统
下一篇:使用java对一副扑克牌建模
相关文章

 发表评论

暂时没有评论,来抢沙发吧~