当节点发生故障时,尽管所有元数据信息都可以从磁盘节点上将元数据拷贝到本节点上,但是队列的消息内容就不行了,这样就会导致消息的丢失,那是因为在默认情况下,队列只会保存在其中一个节点上,我们在将集群队列时也说过。
聪明的 RabbitMQ 早就意识到这个问题了,在 2.6以后的版本中增加了,队列冗余选项:镜像队列。镜像队列的主队列(master)依然是仅存在于一个节点上,其余从主队列拷贝的队列叫从队列(slave)。如果主队列没有发生故障,那么其工作流程依然跟普通队列一样,生产者和消费者不会感知其变化,当发布消息时,依然是路由到主队列中,而主队列通过类似广播的机制,将消息扩散同步至其余从队列中,这就有点像 fanout 交换器一样。而消费者依然是从主队列中读取消息。
一旦主队列发生故障,集群就会从最老的一个从队列选举为新的主队列,这也就实现了队列的高可用了,但我们切记不要滥用这个机制,在上面也说了,队列的冗余操作会导致不能通过扩展节点增加存储空间,而且会造成性能瓶颈。
命令格式如下
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority] # -p Vhost: 可选参数,针对指定vhost下的queue进行设置 # Name: policy的名称 # Pattern: queue的匹配模式(正则表达式) # Definition: 镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode # ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes # all: 表示在集群中所有的节点上进行镜像 # exactly: 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定 # nodes: 表示在指定的节点上进行镜像,节点名称通过ha-params指定 # ha-params: ha-mode模式需要用到的参数 # ha-sync-mode: 进行队列中消息的同步方式,有效值为automatic和manual # priority: 可选参数,policy的优先级 案例以下示例声明名为ha-all的策略,它与名称以”ha”开头的队列相匹配,并将镜像配置到集群中的所有节点:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
上述命令会将所有的队列冗余到所有节点上,一般可以拿来测试。
策略的名称以”two”开始的队列镜像到群集中的任意两个节点,并进行自动同步:
rabbitmqctl set_policy ha-two "^two." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'以”node”开头的队列镜像到集群中的特定节点的策略:
rabbitmqctl set_policy ha-nodes "^nodes." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}' 集群负载均衡HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
集群负载均和架构图:
安装haproxyyum -y install haproxy
编辑HaProxyvim /etc/haproxy/haproxy.cfg
#绑定配置 listen rabbitmq_cluster 0.0.0.0:5670 #配置TCP模式 mode tcp #加权轮询 balance roundrobin #RabbitMQ集群节点配置 server rabbitmq-1 192.168.171.134:5672 check inter 2000 rise 2 fall 3 server rabbitmq-2 192.168.171.135:5672 check inter 2000 rise 2 fall 3 #haproxy监控页面地址 listen monitor 0.0.0.0:8100 mode http option httplog stats enable stats uri /stats stats refresh 5s 启动HaProxysystemctl restart haproxy
浏览器访问IP:8100/stats
部署node_exporter 下载haproxy_exporter wget https://github.com/prometheus/haproxy_exporter/releases/download/v0.11.0/haproxy_exporter-0.11.0.linux-amd64.tar.gz 下载RabbitMQ_exporter wget https://github.com/kbudde/rabbitmq_exporter/releases/download/v1.0.0-RC7/rabbitmq_exporter-1.0.0-RC7.linux-amd64.tar.gz wget https://github.com/deadtrickster/prometheus_rabbitmq_exporter/releases/download/rabbitmq-3.6.12-pre18/prometheus_rabbitmq_exporter-v3.6.12.1.ez 部署rabbitmq_exporter cp prometheus_rabbitmq_exporter-v3.6.12.1.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.3.5/plugins/ # 启动rabbitmq_exporter RABBIT_USER=guest RABBIT_PASSWORD=guest OUTPUT_FORMAT=json PUBLIC_PORT=9090 RABBIT_URL=http://localhost:15672 nohup ./rabbitmq_exporter & tail -1000f nohup. # 参数说明 # RABBIT_USER:rabbit用户名 # RABBIT_PASSWORD:rabbit密码 # RABBIT_URL:rabbit服务地址和端口 # OUTPUT_FORMAT:输出格式 # PUBLIC_PORT:暴露端口 # 验证服务端口 lsof -i:9419 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rabbitmq_ 1682 root 3u IPv6 23446 0t0 TCP *:9419 (LISTEN)