0

0

了解RabbitMQ+haProxy+keepalived的使用

coldplay.xixi

coldplay.xixi

发布时间:2020-09-01 17:49:16

|

2800人浏览过

|

来源于learnku

转载

了解RabbitMQ+haProxy+keepalived的使用

前言

如有错误,随时斧正,非常感谢!

为什么要使用haProxy+keepalived呢?

为了AMQP服务的稳定性

首先先说下为什么要使用haProxy。

我在两台服务器上建了AMQP集群,分别是10.71.13.24和10.71.13.25,以后简称为24、25服务器。假设AMQP客户端直接连接24或25。如果24|25服务器宕机了,那么连接24|25的AMQP客户端就无法工作,消费者也无法进行正常消费(以下以24举例代表24|25单机的情况)。再者单机连接可能造成单机负载过高,而其他服务器空闲的状态。此时则可以通过haProxy实现负载均衡。

在本地的配置如:

global
    #log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
    log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]      
    daemon #以后台形式运行harpoxy
    nbproc 2 #设置进程数量
    maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
    #user haproxy #运行haproxy的用户
    pidfile /var/run/haproxy.pid #haproxy 进程PID文件
    #group www #运行haproxy的用户所在的组
    #ulimit-n 65535 #ulimit 的数量限制
    #chroot /usr/share/haproxy #chroot运行路径
    #debug #haproxy 调试级别,建议只在开启单进程的时候调试
    #quiet

########默认配置############
defaults
    log global
    log 127.0.0.1 local0 info
    mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    option httplog #日志类别,采用httplog
    option dontlognull #不记录健康检查日志信息
    retries 3 #两次连接失败就认为是服务器不可用,也可以通过后面设置
    option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
    option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
    option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
    option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
    maxconn 4096 #默认的最大连接数
    #timeout http-keep-alive10s #默认持久连接超时时间
    #timeout http-request 10s #默认http请求超时时间
    #timeout queue 1m #默认队列超时时间
    balance roundrobin #设置默认负载均衡方式,轮询方式
    #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
    #balnace leastconn #设置默认负载均衡方式,最小连接数
    timeout connect 5s #连接超时
    timeout client 120s # 客户端超时
    timeout server 120s #服务端超时
    timeout check 2000 #心跳检测超时ms
#绑定配置
listen rabbitmq_cluster
    bind 0.0.0.0:5678
    mode http #配置TCP模式
    balance roundrobin
    #RabbitMQ集群节点配置
    server rmq_node_13_24 10.71.13.24:5672 check inter 5000 rise 2 fall 3 weight 1
    server rmq_node_13_25 10.71.13.25:5672 check inter 5000 rise 2 fall 3 weight 1
    # server <name> <ip>:<port> check inter <value> rise <value> fall <value> weight <value>
    # check inter <value>:每隔5000ms检测AMQP服务是否可用
    # rise <value>:检测到2次可用则可被确认再次可用。
    # fall <value>:检测到3次无法连接则认为服务不可用
    # weight <value>:权重

配置完haProxy.cfg之后,启动haProxy:sudo /etc/init.d/haproxy start。(haproxy启动脚本见最后)
配置解析:之前连接的socket是10.71.13.24:5672,现在连接的socket是10.71.13.24:5678。在25也可以按24的配置COPY一份,因此无论连接的是哪个服务器的5678端口最终都能实现负载均衡。然后还是有一个问题没有解决,如果某个服务器宕机了怎么办?这就是为什么要引入keepalived了。

再谈keepalived的使用

关于keepalived的原理我不熟,也就不过多的去解读。目前我只是想要解决我碰到的问题。为了解决AMQP最终能够稳定服务,于是申请了一个虚拟IP-VIP:10.71.13.254。通过这个VIP则可以开始配置keepalived.conf了。

! Configuration File for keepalived

global_defs {
   router_id Node_Master  # 路由ID,主备的不能相同}vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 5
    weight 2}vrrp_instance VI_1 {
    state MASTER  #keepalived的角色。Master表示主服务器,从服务器设置为BACKUP
    interface eth1 #指定检测网卡,配置成eth0之后我无法连接到AMQP服务
    virtual_router_id 1
    priority 100 #优先级,BACKUP机器上的优先级至少小于50
    advert_int 1 #设置主备之间的检测时间,单位为s
    authentication {
        auth_type PASS
        auth_pass root123    }

    track_script {
        chk_haproxy    }

    virtual_ipaddress { #VIP地址,可以设置多个        10.71.13.254
    }}virtual_server 10.71.13.254 5672 { # 设置虚拟服务器
    delay_loop 6 #设置运行情况检查时间,单位s
    lb_algo wrr #设置负载调度算法,共有rr、wrr、lc、wlc、lblc、lblcr、dh、sh 这8种
    lb_kind DR #设置LVS实现的负载均衡机制方式 VS/DR
    persistence_timeout 50 #指定在一定时间内来自同一IP的连接将会被转发到同一RealServer中
    protocol TCP

    # 这个real_server 即LVS的三大部分之一的RealServer,这里特指RabbitMQ服务
    real_server 10.71.13.24 5678 { #配置服务节点
        weight 1  #配置权重        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 5672
        }
    }

    real_server 10.71.13.25 5678 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 5672
        }
    }
  }virtual_server 10.71.13.254 15672 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 10.71.13.24 15672 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 15672
        }
    }
    real_server 10.71.13.25 15672 {
        weight 1
        TCP_CHECK {
            nb_get retry 3
            connect_timeout 3
            delay_before_retry 3
            connect_port 15672
        }
    }}

check_haproxy.sh脚本的目的是为了防止haProxy服务已经不可用而keepalived可用的情况,该脚本会尝试重新启动haProxy,如果启动不成功则关闭keepalived。这样keepalived的VIP就会漂移到BACKUP备份机,从而继续保证服务。脚本的配置如下:

Face++旷视
Face++旷视

Face⁺⁺ AI开放平台

下载
#! /bin/bashif [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
    sudo service haproxy restartfisleep 2if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
    sudo service keepalived stopfi

在25服务器上的配置和24的服务器基本一致,注意修改属性:route_id、state、priority。
然后启动keepalived:sudo /etc/init.d/keepalived start。(启动脚本见最后)

启动完keepalived之后,我们再次连接AMQP服务就变成了:10.71.13.254:5762,因为master是24服务器,所以实际真实响应的服务是10.71.13.24:567810.71.13.25:5678。因为采用的是加权轮询且权重都是1,24和25会轮流响应VIP的请求。在haProxy中监听了5678端口,并且采用了轮询机制分发到24和25的5672端口。会发现keepalived的和haProxy都使用了轮询机制,能不能把其中的某一处去掉呢?增加了VIP之后如果master宕机之后,就会选举一个从机成为主机,接管原主机的服务。当人工修复好了原主机之后,从机会把服务重新还给主机去接管,自己还原成原来的状态。

haProxy和keepalived的启动脚本

haProxy的启动脚本

#! /bin/shset -ePATH=/sbin:/bin:/usr/sbin:/usr/binPROGDIR=/opt/haproxy-1.7.11PROGNAME=haproxyDAEMON=$PROGDIR/$PROGNAMECONFIG=$PROGDIR/conf/$PROGNAME.cfg
# PIDFILE=$PROGDIR/conf/$PROGNAME.pidPIDFILE=/var/run/haproxy.pidDESC="HAProxy daemon"SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the package has been removed.test -x $DAEMON || exit 0start(){
       echo -e "Starting $DESC: $PROGNAME\n"
       $DAEMON -f $CONFIG
       echo "."}stop(){
       echo -e "Stopping $DESC: $PROGNAME\n"
       haproxy_pid="$(cat $PIDFILE)"
       kill $haproxy_pid
       echo "."}restart(){
       echo -e "Restarting $DESC: $PROGNAME\n"
       $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
       echo "."}case "$1" in
 start)
       start       ;;
 stop)
       stop       ;;
 restart)
       restart       ;;
 *)
       echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
       exit 1
       ;;esac

exit 0

keepalived启动脚本:

#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79# description: Start and stop Keepalived

# Source function library. /etc/rc.d/init.d/functions

# Source configuration file (we set KEEPALIVED_OPTIONS there). /etc/sysconfig/keepalivedRETVAL=0prog="keepalived"start() {
    echo -n $"Starting $prog: "
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog}stop() {
    echo -n $"Stopping $prog: "
    killproc keepalived    RETVAL=$?
    echo    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog}reload() {
    echo -n $"Reloading $prog: "
    killproc keepalived -1
    RETVAL=$?
    echo}# See how we were called.case "$1" in
    start)
        start        ;;
    stop)
        stop        ;;
    reload)
        reload        ;;
    restart)
        stop
        start        ;;
    condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
        fi        ;;
    status)
        status keepalived        RETVAL=$?
        ;;
    *)
        echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
        RETVAL=1esac

exit $RETVAL
相关学习推荐:php编程(视频)

相关文章

keep
keep

Keep是一款健身安排,无论是想减肥塑形或增肌,还是寻找健身跑步瑜伽计步等训练计划,你可以随时随地选择课程进行训练!权威教练视频教学,健身干货自由分享!有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

89

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

276

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

619

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

173

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP入门到实战消息队列RabbitMQ
PHP入门到实战消息队列RabbitMQ

共22课时 | 1.4万人学习

Linux负载均衡视频教程
Linux负载均衡视频教程

共7课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号