当前位置:   article > 正文

RabbitMQ消息中间件(七) RabbitMQ集群构建及高可用组件介绍_rabbitmq mnesia

rabbitmq mnesia

构建高可靠的RabbitMQ集群

    镜像模式集群构建

RabbitMQ集群环境节点表
服务器IPhostname节点说明端口管控台地址
192.168.128.01Bhz01rabbitmq master5672http://192.168.128.01:15672
192.168.128.02Bhz02rabbitmq slave5672http://192.168.128.02:15672
192.168.128.03Bhz03rabbitmq salve5672http://192.168.128.03:15672
192.168.128.04Bhz04haproxy+keepalived8100http://192.168.128.04:8100/rabbitmq-stats
192.168.128.05Bhz05haproxy+keepaliced8100http://192.168.128.05:8100/rabbitmq-stats

 

    文件同步步骤

        选择01,02,03任意一个节点为Master,也就是说需要把01的Cookie文件同步到02,03节点上去,进入/var/lib/rabbitmq目录下,把/var/lib/rabbitmq/.erlang.cookie文件(ls -ia显示隐藏文件)的权限修改为777,原来是400,然后把.erlang.cookie文件copy到各个节点下,最后把所有cookie文件权限还原400。

        注意:在复制前,3个节点主机名称一定要设置好(查看主机名称: vim /etc/hostname)

/etc/init.d/rabbitmq-server stop

//进入01的目录修改权限:远程copy02,03节点

cd /var/lib/rabbitmq

scp /var/lib/rabbitmq/.erlang.cookie 192.168.128.02:/var/lib/rabbitmq/

scp /var/lib/rabbitmq/.erlang.cookie 192.168.128.03:/var/lib/rabbitmq/

    组成集群步骤

        1.停止RabbitMQ服务

            rabbitmqctl stop  //3个节点停止服务,检查是否停止:lsof -i:5672

        2.组成集群操作

             rabbitmq-server -detached  (接下来使用集群命令,配置01,02,03为集群模式并启动,检查是否启动:lsof -i:5672)

        3.slave加入集群操作(重新加入集群也是如此,以最开始的主节点为加入节点)

             注意这步:需要配置/etc/hosts 必须相互能都寻址到

             bhz02:rabbitmqctl stop_app(只需要停止需要的节点,检查是否停止:lsof -i:5672)

             bhz02:rabbitmqctl join_cluster rabbit@bhz01

             bhz02:rabbitmqctl start_app

             bhz03:rabbitmqctl stop_app

             bhz03:rabbitmqctl join_cluster rabbit@bhz01

             bhz03:rabbitmqctl start_app

             在另外其他节点上操作要移除的集群节点: rabbitmqctl forget_cluster_node rabbit@bhz02

        4.修改集群名称

             rabbitmqctl set cluster_name rabbitmq_cluster1(任意一个节点都可)

        5.查看集群状态

             rabbitmqctl cluster_satatus

        6.查看管控台界面

             任意节点访问:http://192.168.128.01:15672

    配置镜像队列

        rabbitmqctl set policy ha-all "`" '{"ha-mode":"all"}'

        将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致,RabbitMQ高可用集群就已经搭建好了

   Ha-Proxy

        1.HaProxy简介:

    集群负载均衡Haproxy技术

2.HaProxy安装

    04,05节点(要做keppalive高可用)同时安装HaProxy

//下载依赖包

yum install gcc vim wget

//下载haproxy

wget http://wwwhaproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz

//解压

tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local

//进入目录,进行编译,安装

cd /usr/local/haproxy-1.6.5

make TARGET=linux31 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

mkdir /etc/haproxy

//赋权

groupadd -r -g 149 haproxy

useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy

//创建haproxy配置文件

touch /etc/haproxy/haproxy.cfg

3.Haproxy配置

vim /etc/haproxy/haproxy.cfg

#logging options

global

        log 127.0.0.1 local10 info

        maxconn 5120

        chroot /usr/local/haproxy

        uid 99

        gid 99

        daemon

        quiet

        nbproc 20

        pidfile /var/run/haproxy.pid

 

defaults

        log global

        #使用4层代理模式,”mode http“为7层代理模式

        mode tcp

        #id you set mode to tcp,then you must change tcplog into httplog

        option tcplog

        option dontlognull

        retries 3

        option redispatch

        maxconn 2000

        contimeout 5s

        ##客户端空闲超时时间为60秒 则HA发起重连机制

        clitimeout 60s

        ##服务器端连接超时时间为15秒 则HA发起重连机制

        srvtimeout 15s

 

listener rabbitmq_cluster

        bind 0.0.0.0:5672

        #配置TCP模式

        mode tcp

        #balance url_param userid

        #balance url_param session_id check_post 64

        #balance hdr(User-Agent)

        #balance hdr(host)

        #balance hdr(Host) use_domian_only

        #balance rdp-cookie

        #balance leastconn

        #balance source //ip

        #简单的轮询

        balance roundrobin

        #rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查,2次正确证明服务器可用,3次失败不可用,并配置主备机制

            server bhz01 192.167.128.01:5672 check inter 5000 rise 2 fall 2

            server bhz02 192.167.128.02:5672 check inter 5000 rise 2 fall 2

            server bhz03 192.167.128.03:5672 check inter 5000 rise 2 fall 2

        #配置haproxy web监控,查看统计信息

listen stats

        bind 192.168.128.04:8100

        mode http

        option httplog

        stats enable

        #设置haproxy监控地址为http://lcoalhost:8100/rabbitmq-stats

        stats uri /rabbitmq-stats

        stats refresh 5s

4.启动haproxy

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

//查看haproxy进程状态

ps -ef | grep haproxy

5.访问haproxy

    http://192.167.128.04:8100/rabbitmq-stats

    http://192.167.128.05:8100/rabbitmq-stats

    KeepAlive软件

        KeepAlived软件主要是通过VRRP协议实现高可用功能的。VRRP是虚拟路由器冗余协议的缩写,VRRP吹西安的目的就是为了解决静态路由单点故障问题的,他能保证当个别节点宕机时,整个网络可以不间断的运行,所以,KeepAlived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

        KeepAlived服务的三个重要功能:

            1.管理LVS负载均衡软件

            2.实现LVS集群节点的健康检查

            3.作为系统网络服务的高可用性(failover)

        KeepAlived高可用原理

        安装KeepAlived:

            1.下载地址

                http://www.keepalived.org/download.html

//安装软件包

yum install -y openssl openssl-devel

//下载

wget http://www.keepalived.org/download.html

//解压

tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/

cd keepalived-1.2.18/ &&./configure --prefix=/usr/local/keepalived

make && make install

//因为keepalived没有使用默认安装路径,需要修改,先创建文件夹,将配置文件复制:

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

//然后复制keepalived脚本文件

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

ln -s /usr/local/sbin/keepalived /usr/sbin/

//如果存在则进行删除:

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

//可以设置开机启动

chkconfig keepalived on

            2.Keepalived配置

vim /etc/keepalived/keepalived.conf

 04节点配置:

!Configuration File for keepalived

global defs{

    router id bhz04  ##标识节点的字符串,通常为hostname

}

vrrp script chk haproxy{

    script "/etc/keepalived/haproxy_check.sh" ##执行脚本位置

    interval 2 ##检测时间间隔

    weight -20 ##如果条件成立则权重减20

}

vrrp_instance VI_1{

    state MASTER ##主节点为MASTER,备份节点为BACKUP

    interface eth你的网卡地址  ##绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同

    virtual router_id 04 ##虚拟路由ID号(主备节点一定要相同)

    mcast_src_ip localhost ##本机IP地址

    priority 100 ##优先级配置(0-254的值)

    nopreempt

    advert_int 1 ##组播信息发送间隔,两节点必须配置一致,默认1s

    authentication{ ##认证匹配

        auth_type PASS

        auth_type bhz

    }

    track_script{

        chk_haproxy

    }

    virtual_ipaddress{

        192.168.128.10  ## 虚拟ip,可以指定多个

    }

}

 05节点配置:

!Configuration File for keepalived

global defs{

    router id bhz05  ##标识节点的字符串,通常为hostname

}

vrrp script chk haproxy{

    script "/etc/keepalived/haproxy_check.sh" ##执行脚本位置

    interval 2 ##检测时间间隔

    weight -20 ##如果条件成立则权重减20

}

vrrp_instance VI_1{

    state MASTER ##主节点为MASTER,备份节点为BACKUP

    interface eth0 ##绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同

    virtual router_id 05 ##虚拟路由ID号(主备节点一定要相同)

    mcast_src_ip localhost ##本机IP地址

    priority 90 ##优先级配置(0-254的值)

    nopreempt

    advert_int 1 ##组播信息发送间隔,两节点必须配置一致,默认1s

    authentication{ ##认证匹配

        auth_type PASS

        auth_type bhz

    }

    track_script{

        chk_haproxy

    }

    virtual_ipaddress{

        192.168.128.10  ## 虚拟ip,可以指定多个

    }

}

            3.执行脚本编写

添加文件位置:/etc/keepalived/haproxy_check.sh(04,05两个节点文件内容一致即可)

#!/bin/bash

COUNT=`ps -C haproxy --no-header |wc -l` 

if[ $COUNT -eq 0];then

    /usr/local/haproxy/sbin/haproxy -f /etx/haproxy/haproxy.cfg

    sleep 2

    if[`ps -C haproxy --no-header |wc -l` eq 0];then

        killall keepalived

    fi

fi

            4.执行脚本赋权

haproxy_check.sh 脚本授权,赋予可执行权限

chmod +x /etc/keepalived/haproxy_check.sh

            5.启动keepalived

当启动两个haproxy节点以后,我们可以启动keepalived服务程序:

//如果04,05的haproxy没有启动则执行启动脚本

/usr/local/haproxy/sbin/haproxy -f /etx/haproxy/haproxy.cfg

//查看haproxy进程状态

ps -ef | grep haproxy

//启动两台机器的keepalived

service keepalived start | start | stop | status | restart

//查看状态

ps -ef | grep haproxy

ps -ef | grep keepalived

    集群配置文件:

        关键配置参数:

            1.tcp_listeners 设置rabbitmq的监听端口,默认为[5672]

            2.disk_free_limit磁盘低水位线,若磁盘容量低于指定值则停止接收数据,默认值为{mem_relative,1.0},即与内存相关联1:1,也可定制为多少byte

            3.vm_memory_high_watermark,设置内存低水位线,若低于该水位线,则开启流控制机制,默认值是0.4,即内存总量的40%

            4.hipe_compile将部分rabbitmq代码用High Performance Erlang compiler编译,可提升性能,该参数是实验性,若出现erlang vmsegfaults,应关掉

            5.force_fine_statistics,该参数属于rabbitmq_management,若为true则进行精细化的统计,但会影响性能

            集群节点模式:Disk为磁盘模式存储/Ram为内存模式存储

        集群配置文件:

            创建如下配置文件位于:/etc/rabbitmq目录下(这个需要自己创建)

            环境变量配置文件:rabbitmq-env.conf

            配置信息配置文件:rabbitmq.config(可以不创建和配置,修改)

            rabbitmq-env.conf配置文件:

--------------关键参数配置------

RABBITMQ_NODE_IP_ADDRESS=本机IP地址

RABBIT_NODE_PORT=5672

RABBITMQ_LOG_BASE=/var/lib/rabbitmq/log

RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia    数据实际存储位置

            配置参数参考如下:

RABBITMQ_NODENAME=FZTEC-240088    节点名称

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1    监听IP

RABBITMQ_NODE_PORT=5672    监听端口

RABBITMQ_LOG_BASE=/data/rabbitmq/log    日志目录

RABBITMQ_PLUGINS_DIR=/data/rabbitmq/plugins    插件目录

RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia 后端存储目录

详细配置见:http://www.rabbitmq.com/configure.html#configuration-file

            配置文件信息修改:

/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.4/ebin/rabbit.app和rabbitmq.config配置文件配置任意一个即可,我们进行配置如下:

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.4/ebin/rabbit.app

    服务测试运行:

        集群启动:

    集群回复与故障转移:

        RabbitMQ镜像队列集群的回复的解决方案和应用场景:

            前提:比如两个节点A和B组成一个镜像队列,B是主节点

场景方案:
A先停,B后停该场景下B是Master,只要先启动B,再启动A即可。或者先启动A,再30S内启动B即可恢复镜像队列。
A,B同时停机

该场景可能是由于机房掉电等原因造成的,只需在30S之内连续启动A和B即可恢复镜像

A先停,B后停,且A无法恢复该场景是1场景的加强版,因为B是Master,所以等B起来以后,在B节点上调用控制台命令:rabbitmqctl forget_cluster_node A 解除与A的Cluster关系,再将新的Slave节点加入B即可重新恢复镜像队列
A先停,B后停,且B无法恢复

该场景是3场景的加强版,比较难处理,原因是因为Master节点无法恢复,早在3.1.x时代之前没有什么好的解决方案,但是现在已经有解决方案了,在3.4.2以后的版本。因为B是主节点,所以直接启动A是不行的,当A无法启动的时候,也就没办法在A节点上调用之前的rabbitmqctl forget_cluster_node B命令了。新版本中,forget_cluster_node支持--offline参数(RabbitMQ在未启动的Slave节点中选择一个节点作为Master,当在A节点执行rabbitmqctl forget_node --offline B时,RabbitMQ会mock一个节点代表A,执行forget_cluster_node命令将B剔除cluster,然后A就可以正常启动了,最后将新的Salve节点加入A即可重新恢复镜像队列)

A先停,B后停,且A,B均无法恢复,但是能得到A或B的磁盘文件这种只能通过恢复数据的方式去尝试恢复,将A或B的数据库文件默认在$RABBIT_HOME/var/lib/目录中,把它拷贝到新节点的对应mulxia,再将新节点的hostname改成A或B的hostname,如果是A节点(Slave)的磁盘文件,则按照场景4处理即可,如果是B节点(Master)的磁盘文件,则按照场景3处理,最后将新的Slave加入到新节点后完成恢复。
A先停,B后停,且A,B均无法恢复,且得不到A或B的磁盘文件无解

    消息的一致性问题

        在使用rabbitMQ中,消息的一致性是非常重要的,所以必须达到一下条件:

        1.broker持久化消息

       待补充。。。

 

附加:

    集群负载均衡Haproxy技术

        HAProxy是一款提供高可用性,负载均衡以及基于TCP和HTTP应用的代理软件,支持虚拟主机,它适用于负载特别大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以千计的并发连接,并且它的运行模式使得它可以很简单安全的整合进行你当前的架构中,同时保护你的web服务器不被暴露在网络中。

    Haprox借助于OS上机种常见的技术来实现性能最大化

        1.单进程,事件驱动模型显著降低了上下文切换的开销以及内存占用

        2.在任何可用的情况下,单缓冲机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期以及内存带宽

        3.借助Linux2.6上的splice()系统调用实现零复制转发和启动

        4.内存分配器在固定大小的内存池中可以实现即时内存分配,这能够显著减少创建一个会话的时长

        5.树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令,保持运行队列命令以及管理轮询及最少连接队列

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/457211
推荐阅读
相关标签
  

闽ICP备14008679号