如图所示: 前端采用keepalived+lvs实现高可用负载均衡, RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建两个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。任务处理进程同时监控每一太RabbitMQ节点(每个节点都相应部署一份任务处理模块)。这样一来,每一份任务处理模块只需要处理自己所监听的rabbitMQ-server接受的任务即可,两份任务处理模块功能完全一致,但相互不影响;当其中一台RabbitMQ宕机之后,与之对应的任务处理进程停止即可,不影响另外一个节点正常工作。
本例环境:
rabbitMQ1:192.168.86.224
rabbitMQ2:192.168.86.235
keepalived(master)+lvs:192.168.86.224
keepalived(backup)+lvs:192.168.86.235
VIP:192.168.86.14
一.安装mq
1.二台机器全部安装Erlang
yum install compat-openssl10yum install libnslyum install ncurses-compat-libs
2.安装socat、erlang依赖包以及mq
yum install socatrpm -ivh erlang-20.3-1.el7.centos.x86_64.rpmrpm -ivh rabbitmq-server-3.7.4-1.el7.noarch.rpm
二、集群镜像部署配置
1.关闭防火墙
查看防火墙状态 firewall-cmd --state
关闭防火墙 firewall-cmd stop firewalld.service
2.Rabbitmq相互通信需要修改主机名,修改并生效
vim /etc/hosts
插入
192.168.86.224 server224
192.168.86.235 server235
修改相应主机名称:执行命令 hostname set-hostname server224
3.设置开机启动:chkconfig
启动两个节点:systemctl start rabbitmq-server.service
在副节点(192.168.86.235)停止应用:rabbitmqctl stop_app
副节点复位:rabbitmqctl reset
4.同步 .erlang_cookie: cat /var/lib/rabbitmq/.erlang.cookie
(查看两台服务器的erlang_cookie是否相同)
5.设置集群,副节点执行命令:
rabbitmqctl join_cluster rabbit@server224
出现 Clustering node rabbit@server235 with rabbit@server224表示成功
6.副节点开始应用
rabbitmqctl start_app
7.两台机器检查集群镜像状态
rabbitmqctl cluster_status
[root@rabbit1 tmp] rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2
[{nodes,[{disc,[rabbit@rabbit1,rabbit@235,rabbit@224]}]},{running_nodes,[rabbit@rabbit1,rabbit@r235,rabbit@224]},{cluster_name,<<"rabbit@host9">>},{partitions,[]},{alarms,[{rabbit@235,[]},{rabbit@224,[]}]}]
三.启动rabbit
1.启动.停止.命令行
systemctl start/stop rabbitmq-server.service 开启/关闭 (开启就行,不用关闭)
rabbitmqctl shutdown 关闭 (不用执行)
2.两机器启动可视化ui界面
rabbitmq-plugins enable rabbitmq_management
浏览器打开访问:192.168.86.224:15762、192.168.86.235:15762
四.用户权限
1.创建vhost
rabbitmqctl add_vhost 管理员
2.创建用户
rabbitmqctl add_user 用户 密码
3.分配权限
设置管理员最大管理权限,可登录ui,默认的guser用户需要自行配置才能登录
设置权限:rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
修改用户角色: rabbitmqctl set_user_tags 用户名 administrator
keepalived+lvs热备负载均衡
两台机器都需要做配置,只需修改个别配置参数,文档以192.168.86.224和192.168.86.235两台机器上部署rabbitmq为例
1. 两台机器安装所需要得应用
yum install keepalived
yum install ipvsadm #虚拟路由管理软件,几乎不用
2.两台机器设置开机启动
chkconfig keepalived on 或 systemctl enable keepalived.service
查看启动目录
/usr/lib/systemd/system/ | grep keepalived
4.配置keepalived启动文件
vim /etc/keepalived/keepalived.conf
192.168.86.224服务器配置
global_defs {notification_email {}router_id LVS_DEVEL #设置lvs的id,在一个网格内应该是唯一的
}# 虚拟组
vrrp_instance VI_1 {state MASTER # 此处为`主`,备机是 `BACKUP`interface bond0 #检查网络的接口,ifconfig查询virtual_router_id 51 # 虚拟路由id,同一个组内需要相同priority 100 # 主机的优先权要比备机高advert_int 1 # 心跳检查频率,单位:秒authentication { # 认证,组内的要相同auth_type PASSauth_pass 1111}# 虚拟ip,多个换行virtual_ipaddress {192.168.86.14}
}virtual_server 192.168.86.14 5672 { #配置虚拟IP实例
delay_loop 6
lb_algo wrr #负载均衡调度算法
lb_kind DR #负载均衡法则
persistence_timeout 50
protocol TCPreal_server 192.168.86.224 5672 {#后端的realserver,即真正运行rabbitMQd 主机IP 及端口
weight 100
TCP_CHECK { #rabbitMQ端口检测
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 5672
}
}real_server 192.168.86.235 5672 { #第二个rabbitMQ节点
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 5672
}
}
}
}
192.168.86.235 Backup服务配置修改:
将 state MASTER 改成 state BACKUP
priority 100 改成 priority 80
在 advert_int 1后加上 nopreempt 非抢占模式
5.启动keepalived
systemctl start keepalived
在主节点上查看,VIP是否绑定到主节点上的ethN网卡上: ip a
[root@initiator ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> 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.86.14/32 brd 192.168.86.14 scope global lo:0
inet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> 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.86.224/24 brd 192.168.1.255 scope global eth1
inet 192.168.86.14/32 scope global eth1:0
inet6 fe80::250:56ff:fe27:b080/64 scope link valid_lft forever preferred_lft forever
可以看到,VIP已经成功绑定到eth1上。