CentOS7安装RabbitMQ集群
使用yum方式安装RabbitMQ集群,RabbiMQ集群很方便,因为Erlang为分布式语言,但其本身并不支持负载均衡,可以使用HAproxy实现。这里首先搭建RabbitMQ集群的普通模式,在普通模式的基础上再配置镜像模式实现高可用,内存节点无疑速度更快,因此在集群前增加haproxy做负载均衡,让客户端 (consumer、producer)连接访问内存节点,而磁盘模式的节点,由于磁盘IO相对较慢,因此仅做数据备份使用
IP 节点名
192.168.3.210 rabbitmq1
192.168.3.220 rabbitmq2
192.168.3.230 rabbitmq3
RabbitMQ模式大概分为以下三种:
(1)单一模式
最简单的非集群模式,就是一台机器部署多个RabbitMQ服务
(2)普通模式
对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象
(3)镜像模式
把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的高可用方案,在对业务可靠性要求较高的场合中比较适用
系统准备
#修改计算机名 #主节点1 hostnamectl --static set-hostname RabbitMQ1 && su #主节点2 hostnamectl --static set-hostname RabbitMQ2 && su #主节点3 hostnamectl --static set-hostname RabbitMQ3 && su #关闭防火墙和修改内核参数 setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config systemctl stop firewalld.service && systemctl disable firewalld.service && systemctl status firewalld.service #添加hosts cat >>/etc/hosts <<EOF 192.168.3.210 RabbitMQ1 192.168.3.220 RabbitMQ2 192.168.3.230 RabbitMQ3 EOF #免密分发 ssh-keygen -t rsa -b 1200 ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ1 ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ2 ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ3 scp -p /etc/hosts root@RabbitMQ2:/etc/hosts scp -p /etc/hosts root@RabbitMQ3:/etc/hosts
安装RabbitMQ
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash yum install erlang rabbitmq-server -y systemctl enable rabbitmq-server && systemctl start rabbitmq-server.service && systemctl status rabbitmq-server.service
创建集群
#使用相同的Erlang Cookie ls -a /var/lib/rabbitmq/ scp -p /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ2:/var/lib/rabbitmq scp -p /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ3:/var/lib/rabbitmq systemctl stop rabbitmq-server && systemctl start rabbitmq-server && systemctl status rabbitmq-server.service ss -tunlp|grep 5672
内存节点(RAM):内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中
磁盘节点(Disk):将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息
1)RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复, 或者可以设置两个磁盘节点,以保持有一个是可用的
2)内存节点虽然不写入磁盘,但是它执行比磁盘节点要好
3)如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失
#节点2和3已磁盘节点加入集群 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@RabbitMQ1 rabbitmqctl start_app rabbitmqctl cluster_status
#节点1改为内存节点 rabbitmqctl stop_app rabbitmqctl change_cluster_node_type ram rabbitmqctl start_app rabbitmqctl cluster_status
#开启web管理控制台和开启MQTT协议 rabbitmq-plugins enable rabbitmq_management rabbitmq-plugins enable rabbitmq_mqtt systemctl stop rabbitmq-server && systemctl start rabbitmq-server #集群创建用户 rabbitmqctl add_user vos vospassword rabbitmqctl set_permissions vos ".*" ".*" ".*" rabbitmqctl set_user_tags vos administrator systemctl restart rabbitmq-server
上面配置为RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。镜像模式和普通模式之间相对比,镜像模式提供高可用性,普通模式会提供更高的吞吐量。
配置策略
#在集群中如果某个节点挂掉,整个集群还是可以正常工作的,但是挂掉的那个节点的消息就清空了,这种情况在生产环境中是不可接受的,所以需要用到镜像功能,也就是主从配置 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' #复制匹配到的队列到集群中的任意两个或多个节点,而不是到所有节点,并进行自动同步 #rabbitmqctl set_policy ha-all "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}' #复制匹配到的队列到集群中的指定节点 #rabbitmqctl set_policy ha-all "^" '{"ha-mode":"nodes","ha-params":["rabbit@rabbitram1","rabbit@rabbitram2"]}'
Haproxy负载均衡
节点1和节点2
yum install epel-release -y yum install haproxy -y cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak cat > /etc/haproxy/haproxy.cfg << "EOF" global log 127.0.0.1 local0 notice maxconn 10000 user haproxy group haproxy defaults timeout connect 5s timeout client 100s timeout server 100s #RabbitMQ服务代理 listen rabbitmq bind 0.0.0.0:5673 mode tcp balance roundrobin server rabbitmq1 192.168.3.210:5672 check inter 5s rise 2 fall 3 server rabbitmq2 192.168.3.220:5672 check inter 5s rise 2 fall 3 #RabbitMQ管理界面 listen rabbitmq_management bind 0.0.0.0:15673 server node1 192.168.3.210:15672 server node2 192.168.3.220:15672 server node3 192.168.3.230:15672 #HAProxy监控页面 listen stats :9000 mode http stats enable stats hide-version stats realm Haproxy\ Statistics stats uri / stats auth vos:vospassword EOF 执行 systemctl start haproxy && systemctl status haproxy netstat -anupt | grep haproxy
Keepalived实现主备
节点1和节点2
yum install keepalived -y cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
监控脚本
cat > /etc/keepalived/check_haproxy.sh << "EOF" #!/bin/bash LOGFILE="/var/log/keepalived-haproxy-status.log" date >> $LOGFILE if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "warning: restart haproxy" >> $LOGFILE haproxy -f /etc/haproxy/haproxy.cfg sleep 2 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "fail: check_haproxy status" >> $LOGFILE systemctl stop keepalived fi else echo "success: check_haproxy status" >> $LOGFILE fi EOF 执行chmod +x /etc/keepalived/check_haproxy.sh
节点1配置
cat > /etc/keepalived/keepalived.conf << "EOF" #全局设置 global_defs { router_id LVS_DEVEL vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #检测任务 vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 2 weight 5 } #虚拟组 vrrp_instance haproxy { state MASTER interface ens33 virtual_router_id 50 priority 100 advert_int 1 unicast_src_ip 192.168.3.210 unicast_peer { 192.168.3.220 } authentication { auth_type PASS auth_pass vospassword } #虚拟IP地址 virtual_ipaddress { 192.168.3.200 } #检测脚本 track_script { check_haproxy } } EOF 执行systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived
节点2配置
cat > /etc/keepalived/keepalived.conf << "EOF" #全局设置 global_defs { router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #检测任务 vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 2 weight 5 } #虚拟组 vrrp_instance haproxy { state BACKUP interface ens33 virtual_router_id 50 priority 99 advert_int 1 unicast_src_ip 192.168.3.220 unicast_peer { 192.168.3.210 } authentication { auth_type PASS auth_pass vospassword } #虚拟IP地址 virtual_ipaddress { 192.168.3.200 } #检测脚本 track_script { check_haproxy } } EOF 执行systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived
业务地址
#RabbitMQ负载均衡端口 5673
#HAProxy监控 http://192.168.3.200:9000
#RabbitMQ管理页面 http://192.168.3.200:15673
测试
rabbitmq网页管理端Queues--Add queue
已经同步到mirrors节点
本站所有文章均可随意转载,转载时请保留原文链接及作者。