设为首页 收藏本站
查看: 1031|回复: 0

[经验分享] LVS+KeepAlived,RabbitMQ高可用负载均衡

[复制链接]

尚未签到

发表于 2018-12-28 13:30:29 | 显示全部楼层 |阅读模式
  最近团队准备对项目进行重构,其中用到了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/hosts
192.168.1.121   initiator
192.168.1.114   mygateway  两个节点安装rabbitMQ:
yum -y install rabbitmq-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 ~]# rabbitmqctl stop_app
[root@initiator ~]# rabbitmqctl join_cluster --ram rabbit@mygateway #创建ram类型的集群
[root@initiator ~]# rabbitmqctl start_app  查看rabbitMQ集群状态:
[root@initiator ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@initiator ...
[{nodes,[{disc,[rabbit@initiator,rabbit@mygateway]}]},
{running_nodes,[rabbit@mygateway,rabbit@initiator]},
{partitions,[]}]
...done.  设置镜像队列策略,任意一个节点执行:
[root@initiator ~]# rabbitmqctl set_policy ha-all “^” ’{“ha-mode”:”all”}’将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。
至此,rabbitMQ配置完成,可以在任意一个节点执行命令查看两个节点是否保持一致:
[root@initiator ~]# rabbitmqctl add_vhost testCluster
Creating vhost "testCluster" ...
...done.
[root@initiator ~]# rabbitmqctl list_vhosts
Listing vhosts ...
/
testCluster
...done.
[root@mygateway ~]# rabbitmqctl list_vhosts
Listing vhosts ...
/
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: Config realserver lo and apply noarp  
SNS_VIP=192.168.1.120
. /etc/rc.d/init.d/functions
case "$1" in
start)
   ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
   /sbin/route add -host $SNS_VIP dev lo:0
   echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
   sysctl -p >/dev/null 2>&1
   echo "RealServer Start OK"  
   ;;
stop)
   ifconfig lo:0 down
   route del $SNS_VIP >/dev/null 2>&1
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
   echo "RealServer Stoped"  
   ;;
*)
   echo "Usage: $0 {start|stop}"  
   exit 1
esac
exit 0  两个节点要保持内容一致,运行realserver.sh:
[root@initiator ~]# chmod u+x /etc/rc.d/init.d/realserver.sh
[root@initiator ~]# /etc/rc.d/init.d/realserver.sh start  查看VIP是否成功绑定到lo上:
[root@initiator ~]# ip add
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.1.120/32 brd 192.168.1.120 scope global lo:0
inet6 ::1/128 scope host两个节点都要执行以上操作。
两个节点安装keepalived:
[root@initiator ~]# yum -y install keepalived  在主节点上修改keepalived配置文件:
[root@initiator ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   !smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
  persistence_timeout 7200
}
!vrrp_script chk_port { #定义检测脚本 此处!表示注释掉
!   script "/opt/checkRabbitmq.sh" #脚本具体路径
!   interval 2 #检测频率
!   weight 2
!}
vrrp_instance VI_1 {
state MASTER #备节点上修改为BACKUP
interface eth1 #根据情况修改为本机的网卡名称
virtual_router_id 52
priority 100 #备节点将此值修改为低于100即可,优先级
advert_int 1
authentication {
auth_type PASS #备节点与之一致
auth_pass 1111 #备节点与之一致
}

!track_script {
!   chk_port #调用检测脚本
!}
virtual_ipaddress {
192.168.1.120/32 dev eth1 label eth1:0 #将VIP绑定到网卡上
}
}
virtual_server 192.168.1.120 5672 { #配置虚拟IP实例
delay_loop 6
lb_algo rr #lvs调度算法,此处为轮询
lb_kind DR #LVS模型,此处为采用DR模型,直接路由
#nat_mask 255.255.255.0
#persistence_timeout 50
protocol TCP
real_server 192.168.1.121 5672 {#后端的realserver,即真正运行rabbitMQd 主机IP 及端口
weight 2
TCP_CHECK { #rabbitMQ端口检测
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 5672
}
}
real_server 192.168.1.114 5672 { #第二个rabbitMQ节点
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 5672
}
}

}
}  在两个节点上启动keepalived:
[root@initiator ~]# /etc/init.d/keepalived start  在主节点上查看,VIP是否绑定到主节点上的ethN网卡上:
[root@initiator ~]# ip add
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.1.120/32 brd 192.168.1.120 scope global lo:0
inet6 ::1/128 scope host
   valid_lft forever preferred_lft forever
2: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:27:b0:80 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.121/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.120/32 scope global eth1:0
inet6 fe80::250:56ff:fe27:b080/64 scope link
   valid_lft forever preferred_lft forever可以看到,VIP已经成功绑定到eth1上。
查看keepalived的日志:
[root@initiator ~]# tail /var/log/messages
[root@localhost~]# ipvsadm -Ln # 查看LVS状态,若有没有该工具yum -y install ipvsadm即可  具体对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做简单的修改即可:
state BACKUP#都修改成BACKUP
virtual_router_id 60#默认51 主从都修改为60
priority 100#优先级(1-254之间),另一台改为90,备用节点必须比主节点优先级低。
nopreempt   #不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项  客户端连接192.168.1.120:5672就可以像使用单台rabbitMQ一样使用进行队列操作,lvs会轮询的将客户端的链接路由至两台realserver上。在生产环境里,要设置keepalived,rabbitMQ、lvs启动脚本为开机启动。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-656915-1-1.html 上篇帖子: Percona 下篇帖子: Keepalived基本问题定位方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表