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