RabbitMQ高级-应用问题、集群搭建

本文介绍了RabbitMQ的消息补偿机制、幂等性保障,通过镜像队列实现高可用性,以及如何使用HAProxy进行负载均衡。内容涵盖了集群搭建、单机多实例部署、RabbitMQ的配置策略和HAProxy的配置和管理。
摘要由CSDN通过智能技术生成

1.消息补偿

消息可靠性保障:——消息补偿机制

需求:100%确保消息发送成功

2.幂等性保障

幂等性指一次和多次请求某一资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与第一次执行的影响相同

在MQ中是指,消费多条相同的消息,得到与消费该消息一次相同的结果

消息幂等性保障——乐观锁机制

3.集群搭建-镜像队列 

集群方案原理

RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的

此处展示单机多实例部署,多个节点之间用端口来区分,在使用真正的集群时用ip来区分即可

单机多实例部署

启动单实例RabbitMQ

查看RabbitMQ运行状态,确保RabbitMQ运行正常

查看正常无误后,停止以上单实例RabbitMQ

systemctl stop rabbitmq-server

启动第1个节点实例(前台启动)

端口:5673,web管理插件端默认端口:15672

注: 这里将默认端口5672留给HA使用

RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server start

(前台启动方式)

启动第2个节点实例

 RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server start

附:结束集群节点命令

rabbitmqctl -n rabbit1 stop

rabbitmqctl -n rabbit2 stop

重置rabbit1实例为主节点

在新的会话窗口,依次执行命令(停止—>重置—>启动)

rabbitmqctl -n rabbit1 stop_app

rabbitmqctl -n rabbit1 reset

rabbitmqctl -n rabbit1 start_app

重置rabbit2实例为从节点

在新的会话窗口,依次执行命令(停止—>重置—>设为从节点—>启动)

将rabbit2加入到rabbit1节点,作为rabbit1的从节点

命令格式:
rabbitmqctl -n rabbit2 join_cluster rabbit1@'###'

注: 引号''内的“#”换成真实环境的主机名,如master等

rabbitmqctl -n rabbit2 join_cluster rabbit1@'master'

rabbitmqctl -n rabbit2 start_app

查看集群状态命令 

rabbitmqctl cluster_status -n rabbit1

说明: 此时在rabbit1节点创建的队列和队列内的消息在rabbit2节点也能看到。但是当rabbit1节点宕机时,rabbit2也将无法看到rabbit1之前的队列和消息(造成消息丢失),原因是配置到此步骤,仍然没能实现队列和消息等的同步 

附:集群管理相关命令

rabbitmqctl join_cluster {cluster_node} [–ram]
将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ应用并重置节点

rabbitmqctl cluster_status
显示集群的状态

rabbitmqctl change_cluster_node_type {disc|ram}
修改集群节点的类型。在这个命令执行前需要停止RabbitMQ应用

rabbitmqctl forget_cluster_node [–offline]
将节点从集群中删除,允许离线执行

rabbitmqctl update_cluster_nodes {clusternode}
在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息。这个和join_cluster不同,它不加入集群。考虑这样一种情况,节点A和节点B都在集群中,当节点A离线了,节点C又和节点B组成了一个集群,然后节点B又离开了集群,当A醒来的时候,它会尝试联系节点B,但是这样会失败,因为节点B已经不在集群中了

rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列queue同步镜像的操作

rabbitmqctl set_cluster_name {name}
设置集群名称。集群名称在客户端连接时会通报给客户端。Federation和Shovel插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置

RabbitMQ镜像集群配置

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式一定程度上解决了项目节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列(即集群策略Policy)

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做

设置的镜像队列(即添加集群策略Policy:同步交换机和队列)

可以通过RabbitMQ的web管理端设置

参数说明:

Name:策略名称

Pattern:匹配的规则,如果是匹配所有的队列,是^.

Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档

 通过dos命令设置

rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'

此时在rabbit1节点rabbit2节点已实现队列和交换机同步

4.集群搭建-安装HAProxy,进行负载均衡 

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数

安装依赖包

下载源码包 :OpenPKG Project: Download

解压到/usr/local目录

tar -xvf haproxy-2.7.5.tar.gz -C /usr/local

进入源码目录、编译、安装

cd /usr/local/haproxy-2.7.5

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

make install PREFIX=/usr/local/haproxy

添加组、用户,并赋权

groupadd -r -g 149 haproxy

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

配置haproxy(创建目录、创建配置文件haproxy.cfg)

mkdir /etc/haproxy

vim /etc/haproxy/haproxy.cfg

haproxy.cfg中写入以下内容 

注: 在配置文件/etc/haproxy/haproxy.cfg中的listen stats下的bind属性中的IP地址需换成服务器IP,不能改为127.0.0.1,否则HAProxy的web管理页面访问不了

#logging options
global
        log 127.0.0.1 local0 info
        maxconn 5120
        chroot /usr/local/haproxy
        uid 99
        gid 99
        daemon
        quiet
        nbproc 20
        pidfile /var/run/haproxy.pid

defaults
        log global

        mode tcp

        option tcplog
        option dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout 5s
   
     clitimeout 60s

     srvtimeout 15s
#front-end IP for consumers and producters

listen rabbitmq_cluster
        bind 0.0.0.0:5672

        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_domain_only
        #balance rdp-cookie
        #balance leastconn
        #balance source //ip

        balance roundrobin

        server node1 127.0.0.1:5673 check inter 5000 rise 2 fall 2
        server node2 127.0.0.1:5674 check inter 5000 rise 2 fall 2

listen stats
        bind 192.168.235.129:8100
        mode http
        option httplog
        stats enable
        stats uri /rabbitmq-stats
        stats refresh 5s

启动HAproxy负载,并查看haproxy进程 

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

ps -ef | grep haproxy

其他命令

启动haproxy
# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
重启haproxy
# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/haproxy.pid` 
停止haproxy
# killall haproxy

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值