借助heartbeat构建redis的主备高可用集群示例

本文介绍如何配置Redis一主一备集群,实现高可用性。包括安装步骤、配置文件调整、Heartbeat安装配置及自动切换脚本编写等内容。
假设master的ip是192.168.193.240,slave的ip是192.168.193.239,虚拟ip是192.168.193.230
安装介质位置:/home/software/redis-2.6.6.tar.gz
要实现的机制是:redis一主一备,主机可读写,备机只读,客户端通过访问230这个虚拟IP来操作redis。
当备机宕机重启后,会自动恢复为redis备机,并同步主机数据。
当主机宕机重启后,原备机自动接管成为主机,原主机重启后成为备机30秒,从原备机同步数据,30秒后,原主机恢复为主机,原备机恢复为备机。
在redis使用频率很高的时候,主机宕机的一段时间内,可能有大量数据写入原备机,30秒同步时间未必足够,建议通过测试确定同步的时间。
下面出现的jeremiahxu.com是假设的密码。

1. 安装redis
# cd /home/software
# tar -zxvf redis-2.6.6.tar.gz
# mv /home/software/redis-2.6.6 /opt/redis
# cd /opt/redis
# make && make install

2. 修改配置文件
# vi /opt/redis/redis.conf
经常需要修改的参数包括:
daemonize yes
yes表示后台运行redis
loglevel debug
日志级别改成debug是用于开发和测试环境,生产环境建议还是换成notice或者warning级别。
logfile /var/log/redis.log
指定日志文件
databases 1
database的数量,默认是16,但是我只需要一个。
requirepass jeremiahxu.com
master的密码,slaver需要这个密码才能和master相连(客户端连接时也需要密码),主要是出于安全性考虑,如果你的网络环境比较“干净”,
那么就不需要设置密码了,因为redis多数情况是部署在内网的,外网无法访问。
masterauth jeremiahxu.com
slave连接master时用到的密码。
在备机上增加如下配置(主机不需要这句):
slaveof 192.168.193.240

3. 启动停止命令
启动:redis-server
指定配置文件的启动:/opt/redis/src/redis-server /opt/redis/redis.conf
停止:redis-cli shutdown
指定端口停止(没有使用默认端口启动时):redis-cli -p 6380 shutdown
如果使用了密码:redis-cli -a jeremiahxu.com shutdown
BTW:启动redis时要指定配置文件,不指定配置文件的话,redis并没有加载你安装好看到的那个默认的redis.conf,所以你修改了那个redis.conf而启动时不指定它的话,是没有用的。

4.配置成服务
vi /etc/init.d/redis
=======================================================
#!/bin/bash
#
# Startup script for the redis
#
# chkconfig: 345 80 15
# description: redis
# Source function library.p
. /etc/rc.d/init.d/functions
export REDIS_HOME=/opt/redis
case "$1" in
start)
$REDIS_HOME/src/redis-server $REDIS_HOME/redis.conf
;;
stop)
$REDIS_HOME/src/redis-cli -a jeremiahxu.com shutdown
;;
restart)
$REDIS_HOME/src/redis-cli -a jeremiahxu.com shutdown
$REDIS_HOME/src/redis-server $REDIS_HOME/redis.conf
;;
status)
$REDIS_HOME/src/redis-server -v
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
exit 0
=======================================================
别忘记增加执行权限:
chmod +x /etc/init.d/redis

5. 安装配置heartbeat
yum -y install heartbeat
heartbeat有三个配置文件:ha.cf、authkeys、haresources
vi /etc/ha.d/authkeys
===============================
auth 1
1 crc
===============================
authkeys这个文件必须设置只读权限
chmod 600 /etc/ha.d/authkeys

vi /etc/ha.d/ha.cf
================================================
logfile /var/log/ha-log
logfacility local0
keepalive 1
deadtime 10
warntime 4
initdead 120
udpport 6940
ucast eth0 192.168.193.239 6940
auto_failback on
node centos-a
node centos-b
================================================
ha.cf这个配置文件的ucast参数,后面的ip地址要写双机集群中对方的ip和端口。
udpport参数最好改掉,我这里改成了6940,默认的694端口很可能会被rcp占用。

vi /etc/ha.d/haresources
==================================================================
centos-a IPaddr::192.168.193.230/24 redis-cluster
==================================================================
这个配置文件主备是一样的,包括前面那个值:centos-a,这个是主服务器的名字。

接着配置自动切换脚本:
vi /etc/ha.d/resource.d/redis-cluster
在主机上:
==================================================================
#!/bin/bash
#
# Startup script for the redis cluster
#
# chkconfig: 345 80 15
# description: redis cluster
# Source function library.p
. /etc/rc.d/init.d/functions
export REDIS_HOME=/opt/redis
case "$1" in
start)
$REDIS_HOME/src/redis-cli -a jeremiahxu.com slaveof 192.168.193.239 6379
sleep 30
$REDIS_HOME/src/redis-cli -a jeremiahxu.com slaveof NO ONE
;;
stop)
$REDIS_HOME/src/redis-cli -a jeremiahxu.com slaveof 192.168.193.239 6379
;;
esac
exit 0
==================================================================
在备机上:
==================================================================
#!/bin/bash
#
# Startup script for the redis cluster
#
# chkconfig: 345 80 15
# description: redis cluster
# Source function library.p
. /etc/rc.d/init.d/functions
export REDIS_HOME=/opt/redis
case "$1" in
start)
$REDIS_HOME/src/redis-cli -a jeremiahxu.com slaveof NO ONE
;;
stop)
sleep 30 && $REDIS_HOME/src/redis-cli -a jeremiahxu.com slaveof 192.168.193.240 6379 &
;;
esac
exit 0
==================================================================
redis-cluster是我自定义的切换脚本,名字其实是可以随便起的,但必须放到/etc/ha.d/resource.d/目录下或者/etc/init.d/目录,并且要赋予执行权限。
<think>好的,我现在需要帮助用户解决在Spring Boot 3.0中整合Redis集群以及处理RabbitMQ连接相关的问题,特别是涉及org.springframework.amqp.rabbit.connection的异常。首先,我得理清楚用户的具体需求,以及可能遇到的问题。 首先,用户提到了Redis集群的整合。Spring Boot 3.0可能对依赖库的版本有新的要求,比如Spring Data Redis和Lettuce客户端的版本。我需要确认最新的依赖配置,确保用户使用的是兼容的版本。同时,配置Redis集群需要在application.properties中正确设置节点信息,比如spring.redis.cluster.nodes,并且可能需要调整一些连接池的参数,比如超时时间和重试策略。 接下来是RabbitMQ的连接问题。用户提到的org.springframework.amqp.rabbit.connection异常可能涉及连接配置错误,比如机、端口、用户名或密码不正确,或者网络问题导致无法连接到RabbitMQ服务器。此外,可能还涉及到连接工厂的配置,比如心跳设置、虚拟机等。Spring Boot 3.0可能对AMQP的依赖版本有变化,需要检查spring-boot-starter-amqp的版本是否兼容。 然后,我需要考虑如何同时整合Redis集群和RabbitMQ,确保两者的配置不会互相冲突。用户可能在配置文件中同时设置Redis和RabbitMQ的相关属性,需要分别正确配置各自的host、port等参数。例如,引用[1]中的配置示例展示了如何分别设置Redis和RabbitMQ的基本连接信息,但集群配置可能需要更多的节点信息。 另外,用户提到的异常可能涉及到资源不足或配置错误。比如,引用[4]中的问题是由于PublisherCallbackChannel关闭导致的重复消费,这可能与连接池的配置或资源管理有关。需要建议用户检查连接池配置,确保足够的连接资源,并正确处理异常情况,比如网络中断后的重试机制。 我还需要考虑如何编写示例代码,比如配置类和异常处理机制。例如,使用@Bean注解配置RedisConnectionFactory和RabbitConnectionFactory,设置集群节点和连接参数。同时,通过@ExceptionHandler捕获AmqpException,并记录日志或进行重试。 最后,生成相关问题时要围绕整合过程中可能遇到的其他问题,比如版本兼容性、安全配置、性能优化等,确保覆盖用户可能关心的其他方面。</think>在Spring Boot 3.0中整合Redis集群并解决RabbitMQ连接问题,需分三步操作: ### 一、Redis集群整合 1. **依赖配置**:需使用Spring Data Redis 3.0+与Lettuce 6.2+ ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. **集群配置**(application.yml): ```yaml spring: data: redis: cluster: nodes: 192.168.1.101:7000,192.168.1.102:7001,192.168.1.103:7002 max-redirects: 3 lettuce: pool: max-active: 16 max-wait: 2000ms ``` 3. **验证连接**: ```java @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisClusterConfiguration( Arrays.asList("192.168.1.101:7000", "192.168.1.102:7001", "192.168.1.103:7002")) ); } ``` ### 二、RabbitMQ连接优化 1. **基础配置**(与引用[1]类似但需扩展): ```yaml spring: rabbitmq: host: rabbitmq-cluster.example.com port: 5672 username: admin password: securepass connection-timeout: 5000 virtual-host: /prod cache: channel.size: 64 connection.mode: CONNECTION ``` 2. **异常处理**(针对引用[4]的通道关闭问题): ```java @Bean public CachingConnectionFactory connectionFactory() { CachingConnectionFactory factory = new CachingConnectionFactory(); factory.setAddresses("host1:5672,host2:5672"); factory.setRequestedHeartBeat(60); factory.setChannelCacheSize(25); factory.setChannelCheckoutTimeout(1000); return factory; } ``` ### 三、关键问题解决方案 | 问题类型 | 解决方案 | |-----------------------|-------------------------------------------------------------------------| | 节点不可达 | 配置用节点列表,设置spring.redis.cluster.nodes多个节点 | | AMQP连接中断 | 增加心跳检测:spring.rabbitmq.requested-heartbeat=60 | | 通道资源不足 | 调整缓存设置:spring.rabbitmq.cache.channel.size=128 | | 认证失败 | 检查SASL机制,设置spring.rabbitmq.ssl.enabled=true(如启用SSL) | ### 异常处理示例代码 ```java @ExceptionHandler(AmqpException.class) public void handleAmqpException(AmqpException ex) { if (ex.getMessage().contains("PublisherCallbackChannel is closed")) { logger.warn("检测到通道关闭异常,尝试重置连接..."); connectionFactory.resetConnection(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值