zoukankan      html  css  js  c++  java
  • 使用Haproxy代理rabbitmq集群,用keepalive保证haproxy高可用

    原文地址:https://www.jianshu.com/p/440b8e1d5339

    使用Haproxy代理rabbitmq集群

    上一篇文章教了rabbitmq集群搭建。但是这样搭建出来的集群是3个IP:port。客户端一般只会填写一个Ip端口,这个时候就需要有个服务器去代理3个rabbitmq服务。这个时候haproxy就派上用场了。
    架构图如下:
    架构图

    HaProxy搭建

    1、下载Haproxy tar包

    https://www.haproxy.org/download/1.7/src/

    下载haproxy-1.7.0.tar.gz

    2、安装Haproxy

    安装gcc包
    yum install -y gcc
    上传tar包
    tar -xvf haproxy-1.7.0.tar.gz
    安装
    cd haproxy-1.7.0
    sudo make TARGET=linux31 PREFIX=/usr/local/haproxy
    sudo make install PREFIX=/usr/local/haproxy
    cd /usr/local/haproxy
    sudo vi haproxy-rabbitmq.cfg
    填入如下配置

    global
        log 127.0.0.1 local1
        log-tag haproxy
        maxconn 4096
        #user haproxy
        #group haproxy
        daemon
        stats socket /var/run/haproxy.sock mode 600 level admin
        stats timeout 2m
    defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option dontlognull
        option http-server-close
    listen admin
        bind *:8008
        mode http
        stats uri /stats
    frontend rabbitmq
        mode tcp
        bind *:5679
        #把client的超时时间设置的长一点很重要,HAProxy默认是50秒,这样如果50秒还没有消息到来,HAProxy就会断开客户端,这是不合适的
        timeout client 168h
        default_backend rabbitmq_nodes
        log global
        option tcplog
        option logasap
    backend rabbitmq_nodes
        mode tcp
        balance roundrobin
        timeout server 168h
        server  rabbit1 rabbit1:5672 check inter 1000 fall 3 rise 3
        server  rabbit2 rabbit2:5672 check inter 1000 fall 3 rise 3
        server  rabbit3 rabbit1:5672 check inter 1000 fall 3 rise 3
    
    listen rabbitmq_admin 
        bind  0.0.0.0:15679
        mode http
        timeout server 168h
        balance roundrobin
        server rabbit1 rabbit1:15672 check inter 1000 fall 3 rise 3
        server rabbit2 rabbit2:15672 check inter 1000 fall 3 rise 3
        server rabbit3 rabbit3:15672 check inter 1000 fall 3 rise 3
    

    3、配置与启动

    ./sbin/haproxy -f haproxy-rabbitmq.cfg
    查看页面 ip:8008/stats查看haproxy的状态
    查看页面 ip:15679查看rabbitmq的管理后台
    客户端连接用ip:5672去连接
    ps:ip是安装haproxy的机器的ip

    使用Keepalived实现HAProxy高可用

    尽管HAProxy非常稳定,但仍然无法规避操作系统故障、主机硬件故障、网络故障甚至断电带来的风险。所以必须对HAProxy实施高可用方案。

    下文将介绍利用Keepalived实现的HAProxy热备方案。即两台主机上的两个HAProxy实例同时在线,其中权重较高的实例为MASTER,MASTER出现问题时,另一台实例自动接管所有流量。

    原理

    在两台HAProxy的主机上分别运行着一个Keepalived实例,这两个Keepalived争抢同一个虚IP地址,两个HAProxy也尝试去绑定这同一个虚IP地址上的端口。
    显然,同时只能有一个Keepalived抢到这个虚IP,抢到了这个虚IP的Keepalived主机上的HAProxy便是当前的MASTER。
    Keepalived内部维护一个权重值,权重值最高的Keepalived实例能够抢到虚IP。同时Keepalived会定期check本主机上的HAProxy状态,状态OK时权重值增加。

    安装keepalived后结构图如下
    架构图

    安装keepalived

    yum -y install openssl-devel
    wget --no-check-certificate http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
    tar -xzf keepalived-1.2.19.tar.gz
    cd keepalived-1.2.19
    ./configure --prefix=/usr/local/keepalived
    make &make install
    
    

    注册为系统服务:

    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
    chmod +x /etc/init.d/keepalived
    

    配置Keepalived

    为了使用killall命令

    yum install psmisc
    
    mkdir -p /etc/keepalived/
    vi /etc/keepalived/keepalived.conf
    

    主机文件配置

    global_defs {
        router_id LVS_DEVEL  #虚拟路由名称
    }
    
    #HAProxy健康检查配置
    vrrp_script chk_haproxy {
        script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
        interval 2   #脚本运行周期
        weight 2   #每次检查的加权权重值
    }
    
    #虚拟路由配置
    vrrp_instance VI_1 {
        state MASTER           #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
        interface ens33      #本机网卡名称,使用ifconfig命令查看
        virtual_router_id 51   #虚拟路由编号,主备机保持一致
        priority 101           #本机初始权重,备机请填写小于主机的值(例如100)
        advert_int 1           #争抢虚地址的周期,秒
        virtual_ipaddress {
            192.168.2.200      #虚地址IP,主备机保持一致
        }
        track_script {
            chk_haproxy        #对应的健康检查配置
        }
    }
    

    副机文件配置

    global_defs {
        router_id LVS_DEVEL  #虚拟路由名称
    }
    
    #HAProxy健康检查配置
    vrrp_script chk_haproxy {
        script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
        interval 2   #脚本运行周期
        weight 2   #每次检查的加权权重值
    }
    
    #虚拟路由配置
    vrrp_instance VI_1 {
        state BACKUP           #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
        interface ens33      #本机网卡名称,使用ifconfig命令查看
        virtual_router_id 51   #虚拟路由编号,主备机保持一致
        priority 100           #本机初始权重,备机请填写小于主机的值(例如100)
        advert_int 1           #争抢虚地址的周期,秒
        virtual_ipaddress {
            192.168.2.200      #虚地址IP,主备机保持一致
        }
        track_script {
            chk_haproxy        #对应的健康检查配置
        }
    }
    

    启动

    service keepalived start
    

    验证

    启动后,先分别在两台主机查看虚IP 192.168.8.201由谁持有,执行命令:

    ip addr sh ens33   (将ens33替换成主机的网卡名)
    

    访问192.168.2.200:8008/stats(自己配置的虚拟IP),192.168.2.200:15679(rabbitmq管理台)。
    如果能访问,则可以使用192.168.2.200:5679作为rabbitmq的入口来使用。

  • 相关阅读:
    推送消息为什么使用RocketMQ,而不使用Kafka?
    com.google.common.collect.Lists.addAll()空指针原因分析
    AQS原理
    ReentrantLock-加锁
    ReentrantLock-自旋
    Reentrantlock-的核心内容
    java中,BigDecimal的add方法避坑指南
    Reentrantlock-实现原理
    Reentrantlock-适用场景
    JAVA foreach和普通for循环是否需要判断为null
  • 原文地址:https://www.cnblogs.com/yeyongjian/p/13234360.html
Copyright © 2011-2022 走看看