LVS+KeepAlived,RabbitMQ高可用负载均衡推荐

最近团队准备对项目进行重构,其中用到了RabbitMQ,也考虑了几个方案,下边着重介绍在项目中即将采用的方案。关于RabbitMQ就不在这里详细说明,具体查看 RabbitMQ中文手册。直接看架构图:

如图所示: 前端采用keepalived+lvs实现高可用负载均衡, RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建两个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。任务处理进程同时监控每一太RabbitMQ节点(每个节点都相应部署一份任务处理模块)。这样一来,每一份任务处理模块只需要处理自己所监听的rabbitMQ-server接受的任务即可,两份任务处理模块功能完全一致,但相互不影响;当其中一台RabbitMQ宕机之后,与之对应的任务处理进程停止即可,不影响另外一个节点正常工作。

本例环境:

rabbitMQ1:192.168.1.121 hostname:initiator

rabbitMQ2:192.168.1.114 hostname:mygateway

keepalived(master)+lvs:192.168.1.121

keepalived(backup)+lvs:192.168.1.114

VIP:192.168.1.120

配置rabbitMQ集群:

修改两个节点的/etc/hosts文件,确保可以通过hostname连通。

[root@initiator~]#cat/etc/hosts192.168.1.121initiator192.168.1.114mygateway

两个节点安装rabbitMQ:

yum-yinstallrabbitmq-server

配置两个节点上rabbitmq的cookie,将两个节点上的/var/lib/rabbitmq/.erlang.cookie内容设置为一样的。注意权限为:400,所有者:rabbitmq:rabbitmq

[root@initiator~]#cat/var/lib/rabbitmq/.erlang.cookie

两个节点启动rabbitMQ:

[root@initiator~]#rabbitmq-server-detached

在其中任意一个节点执行操作,配置rabbitMQ集群:

[root@initiator~]#rabbitmqctlstop_app[root@initiator~]#rabbitmqctljoin_cluster--ramrabbit@mygateway#创建ram类型的集群[root@initiator~]#rabbitmqctlstart_app

查看rabbitMQ集群状态:

[root@initiator~]#rabbitmqctlcluster_statusClusterstatusofnoderabbit@initiator...[{nodes,[{disc,[rabbit@initiator,rabbit@mygateway]}]},{running_nodes,[rabbit@mygateway,rabbit@initiator]},{partitions,[]}]...done.

设置镜像队列策略,任意一个节点执行:

[root@initiator~]#rabbitmqctlset_policyha-all“^”’{“ha-mode”:”all”}’

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。

至此,rabbitMQ配置完成,可以在任意一个节点执行命令查看两个节点是否保持一致:

[root@initiator~]#rabbitmqctladd_vhosttestClusterCreatingvhost"testCluster"......done.[root@initiator~]#rabbitmqctllist_vhostsListingvhosts...testCluster...done.[root@mygateway~]#rabbitmqctllist_vhostsListingvhosts...testCluster...done.

可以看到创建的虚拟机被复制了另外一个节点,两个节点状态保持一致。更多命令行操作,请查看rabbitmqctl –help

配置keepalived+lvs:

LVS(Linux Virtual Server),Linux虚拟服务器。目前已被Linux内核接纳,在内核模块的名称为ip_vs,从Linux内核版本2.6起,ip_vs code已经被整合进了内核中,因此,只要在编译内核的时候选择了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23以后的内核版本也整合了ip_vs code,但是如果更旧的内核版本,需要手动将ip_vs code整合进内核源码中,并重新编译内核房可使用lvs。在Linux中用户并不能直接操作内核模块,所以ip_vs也有相应的用户空间程序ipvsadm,用户可以直接使用ipvsadm对lvs进行配置即可。

Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。其高可用主要基于VRRP协议实现,VRRP是一个“选举”协议,它能够动态地将一个虚拟路由器的责任指定至同一个VRRP组中的其它路由器上,从而消除了静态路由配置的单点故障。如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。

本例中lvs和keepalived搭配使用,所以lvs配置比较简单,具体的添加realserver的操作keepalived在配置文件中代为操作了。lvs只需要绑定虚IP即可,lvs脚本:

[root@initiator~]#cat/etc/rc.d/init.d/realserver.sh#!/bin/bash#description:ConfigrealserverloandapplynoarpSNS_VIP=192.168.1.120./etc/rc.d/init.d/functionscase"$1"instart)ifconfiglo:0$SNS_VIPnetmask255.255.255.255broadcast$SNS_VIP/sbin/routeadd-host$SNS_VIPdevlo:0echo"1" /proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2" /proc/sys/net/ipv4/conf/lo/arp_announceecho"1" /proc/sys/net/ipv4/conf/all/arp_ignoreecho"2" /proc/sys/net/ipv4/conf/all/arp_announcesysctl-p /dev/null2 1echo"RealServerStartOK";;stop)ifconfiglo:0downroutedel$SNS_VIP /dev/null2 1echo"0" /proc/sys/net/ipv4/conf/lo/arp_ignoreecho"0" /proc/sys/net/ipv4/conf/lo/arp_announceecho"0" /proc/sys/net/ipv4/conf/all/arp_ignoreecho"0" /proc/sys/net/ipv4/conf/all/arp_announceecho"RealServerStoped";;echo"Usage:$0{start|stop}"exit1exit0

两个节点要保持内容一致,运行realserver.sh:

[root@initiator~]#chmodu+x/etc/rc.d/init.d/realserver.sh[root@initiator~]#/etc/rc.d/init.d/realserver.shstart

查看VIP是否成功绑定到lo上:

[root@initiator~]#ipadd1:lo: LOOPBACK,UP,LOWER_UP mtu16436qdiscnoqueuestateUNKNOWNlink/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostloinet192.168.1.120/32brd192.168.1.120scopegloballo:0inet6::1/128scopehost

两个节点都要执行以上操作。

两个节点安装keepalived:

[root@initiator~]#yum-yinstallkeepalived

在主节点上修改keepalived配置文件:

[root@initiator~]#cat/etc/keepalived/keepalived.conf!ConfigurationFileforkeepalivedglobal_defs{notification_email{acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_fromAlexandre.Cassen@firewall.loc!smtp_server192.168.200.1smtp_connect_timeout30router_idLVS_DEVELpersistence_timeout7200!vrrp_scriptchk_port{#定义检测脚本此处!表示注释掉!script"/opt/checkRabbitmq.sh"#脚本具体路径!interval2#检测频率!weight2vrrp_instanceVI_1{stateMASTER#备节点上修改为BACKUPinterfaceeth1#根据情况修改为本机的网卡名称virtual_router_id52priority100#备节点将此值修改为低于100即可,优先级advert_int1authentication{auth_typePASS#备节点与之一致auth_pass1111#备节点与之一致virtual_ipaddress{192.168.1.120/32deveth1labeleth1:0#将VIP绑定到网卡上virtual_server192.168.1.1205672{#配置虚拟IP实例delay_loop6lb_algorr#lvs调度算法,此处为轮询lb_kindDR#LVS模型,此处为采用DR模型,直接路由#nat_mask255.255.255.0#persistence_timeout50protocolTCPreal_server192.168.1.1215672{#后端的realserver,即真正运行rabbitMQd主机IP及端口weight2TCP_CHECK{#rabbitMQ端口检测connect_timeout3nb_get_retry3delay_before_retry3connect_port5672real_server192.168.1.1145672{#第二个rabbitMQ节点weight2TCP_CHECK{connect_timeout3nb_get_retry3delay_before_retry3connect_port5672}

在两个节点上启动keepalived:

[root@initiator~]#/etc/init.d/keepalivedstart

在主节点上查看,VIP是否绑定到主节点上的ethN网卡上:

[root@initiator~]#ipadd1:lo: LOOPBACK,UP,LOWER_UP mtu16436qdiscnoqueuestateUNKNOWNlink/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostloinet192.168.1.120/32brd192.168.1.120scopegloballo:0inet6::1/128scopehostvalid_lftforeverpreferred_lftforever2:eth1: BROADCAST,MULTICAST,UP,LOWER_UP mtu1500qdiscpfifo_faststateUPqlen1000link/ether00:50:56:27:b0:80brdff:ff:ff:ff:ff:ffinet192.168.1.121/24brd192.168.1.255scopeglobaleth1inet192.168.1.120/32scopeglobaleth1:0inet6fe80::250:56ff:fe27:b080/64scopelinkvalid_lftforeverpreferred_lftforever

可以看到,VIP已经成功绑定到eth1上。

查看keepalived的日志:

[root@initiator~]#tail/var/log/messages[root@localhost~]#ipvsadm-Ln#查看LVS状态,若有没有该工具yum-yinstallipvsadm即可

具体对rabbitMQ的健康状态检查后执行的操作,在real_server区段添加:

notify_up$PATH/SCRIPT.sh#检测到服务开启后执行的脚本可以是邮件报警,如某某IP,rabbitMQ挂掉。。。。notify_down$PATH/SCRIPT.sh#检测到服务停止后执行的脚本.

在实际应用中,当master挂掉之后,backup会占有资源。但当master恢复之后会抢占资源,自己继续做回主,将VIP绑定至master主机上。此时正在连接的业务有可能会中断。所以在生产上需要设置为不抢占(nopreempt)资源,即它活了之后也不会将主抢回来,继续作为备机存在。但nopreempt只能在stat 为BACKUP时设置,所以此时应该将主备机上的stat 都设置为BACKUP,将priority设置为一高一低,以优先级高低确定谁是主。

对keeplived做简单的修改即可:

stateBACKUP#都修改成BACKUPvirtual_router_id60#默认51主从都修改为60priority100#优先级(1-254之间),另一台改为90,备用节点必须比主节点优先级低。nopreempt#不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项

客户端连接192.168.1.120:5672就可以像使用单台rabbitMQ一样使用进行队列操作,lvs会轮询的将客户端的链接路由至两台realserver上。在生产环境里,要设置keepalived,rabbitMQ、lvs启动脚本为开机启动。

我们摇摇头说,困难其实没什么大不了。

LVS+KeepAlived,RabbitMQ高可用负载均衡推荐

相关文章:

你感兴趣的文章:

标签云: