RabbitMQ高可用镜像队列集群

RabbitMQ高可用镜像队列集群

团队介绍

光大科技有限公司智能云计算部运维服务团队光大e信项目组,致力于为全集团员工提供信息共享、工作协同的一站式移动办公服务平台,助力集团进行战略数字化转型。团队拥有经验丰富的互联网技术研发人员,在自主研发创新项目中不断总结技术经验,不定期进行原创技术文章和实践经验分享,共同去探索如何更好地去进行大型金控集团数字化战略转型IT信息建设。

什么是镜像队列

镜像队列集群是相对于普通集群而言的。在普通集群中,消息实体只会存在于主节点的队列中,从节点只会存储主节点的元数据(交换机、绑定关系以及队列的结构),不存储消息实体,因此存在消息丢失的可能性。

引入RabbitMQ的镜像队列机制,将队列镜像到集群中其他的节点之上。在该实现下,如果集群中的一个节点失效了,queue能自动地切换到镜像中的另一个节点以保证服务的可用性。针对每个镜像队列都包含一个主节点(master)和若干个从节点(slave)。

镜像队列工作原理

在通常的用法中,针对每一个镜像队列都包含一个master和多个slave,分别对应于不同的节点。slave会准确地按照master执行命令的顺序进行命令执行,故slave与master上维护的状态应该是相同的。除了publish外所有动作都只会向master发送,然后由master将命令执行的结果广播给slave们,故看似从镜像队列中的消费操作实际上是在master上执行的。

一旦完成了选中的slave被提升为master的动作,发送到镜像队列的message将不会再丢失:publish到镜像队列的所有消息总是被直接publish到master和所有的slave之上。这样一旦master失效了,message仍然可以继续发送到其他slave上。

简单来说,镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或

由于在镜像队列模式下消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。

该模式带来的副作用也很明显:除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。

所以在对可靠性要求较高的场合中适用。

镜像队列的使用方式

在客户端直接连接集群中的节点

通过Haproxy+LVS+KeepAlived方式

如果使用在客户端直接连接集群节点方式,需要在客户端应用中设置集群节点的IP地址,如果集群节点发生变化,客户端应用程序也需要进行变更,而且客户端需要实现负载功能。

而采用Haproxy+LVS+KeepAlived方式,在这种方式中客户端只需要配置VIP,集群节点的变化不会影响到客户端应用,而且集群的负载由Haproxy完成,其架构如下图所示,本文重点讲解Haproxy+LVS+KeepAlived方式使用RabbitMQ镜像队列(高可用镜像队列集群)。

高可镜像队列集群工作方式

客户端配置VIP,通过VIP与RabbitMQ集群中的一台连接。

Haproxy采用主备模式,防止单点故障。在正常运行时,只有主节点绑定着VIP,客户端通过主节点与RabbitMQ集群进行交互,具体与集群哪一台连接依赖于Haproxy的负载策略。

如果连接的是镜像队列的主节点,无论对于消息的生产还是消息的消费都会同步到镜像队列的从节点;

如果连接的是镜像队列的从节点,请求都会重定向到镜像队列的主节点,再将请求消息同步到镜像队列的从节点。

当Haproxy的主节点宕机,KeepAlived探测到主节点的挂掉后,VIP会漂移到从节点,从节点升级为主节点,继续保证集群的可用性。

当集群中的某一节点宕机,由于该节点不仅是某些镜像队列的主节点,也是某些镜像队列的从节点。

对于把该节点作为主节点的镜像队列,会在其他节点中重新选举出镜像队列的主节点,对于把该节点作为从节点的镜像队列,不会受到影响。

通过Haproxy主备模式+镜像队列优秀的工作机制,共同保证了集群的可用性。

如何搭建高可用镜像队列集群

单机上安装

以集群为3个节点为例:

假设3个节点的ip分别为

192.168.0.1

192.168.0.2   

192.168.0.3

在3个节点上分别安装rabbitmq server。

1.Install Erlang

yum install erlang

测试erlang是否安装成功,输入:

erl //进入erl窗口则表示安装成功

2.Install RabbitMQ Server

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.2/rabbitmq-server-3.6.2-1.noarch.rpm# yum install rabbitmq-server-3.6.2-1.noarch.rpm

3.启动

/etc/init.d/rabbitmq-server start

4.开机启动

chkconfig rabbitmq-server on

测试是否安装成功

rabbitmqctl status //查看rabbitmq的运行状态信息

5.启用插件rabbitmq management

rabbitmq-plugins enable rabbitmq_management/etc/init.d/rabbitmq-server restart

输入http://ip:15672可以登录管理界面,

默认账户guest/guest

只能使用http://localhost:15672登录,

要想远程登录,需要添加一个新的用户:

rabbitmqctl add_user admin 1234

用户设置为administrator才能远程访问

sudo rabbitmqctl set_user_tags admin administratorsudo rabbitmqctl set_permissions -p / admin \".*\" \".*\" \".*\" 

该命令使用户admin具有‘/’

这个virtual host中所有资源的配置、写、读权限

以便管理其中的资源。

rabbitmqctl status //查看rabbitmq的运行状态信息

6.查看所有用户

rabbitmqctl list_users

镜像集群搭建

将192.168.0.1上的

/var/lib/rabbitmq/.erlang.cookie中的内容复制到

158和159上的/var/lib/rabbitmq/.erlang.cookie文件中,

即三台服务器必须具有相同的cookie,

如果不相同的话,无法搭建集群。

192.168.0.2和192.168.0.3节点上分别执行命令,加入到集群:

rabbitmqctl stop_apprabbitmqctl join_cluster --ram rabbit@h-ncdrdcs7rabbitmqctl start_app

其中–ram代表是内存节点,如果希望是磁盘节点则不用加–ram,在rabbitmq集群中,至少需要一个磁盘节点。

查看集群的状态

rabbitmqctl cluster_status

设置成镜像队列

rabbitmqctl set_policy ha-all \"^ha\\.\" \'{\"ha-mode\":\"all\"}\' //意思表示以ha.开头的queue都会复制到各个节点 [\"^\"匹配所有]

Haproxy负载代理

利用haproxy做负载均衡

在192.168.1.1和192.168.1.2节点上安装haproxy

yum install haproxyvi /etc/haproxy/haproxy.cfglisten rabbitmq_local_cluster 0.0.0.0:5672 

配置TCP模式 

mode tcpoption tcplog 

简单的轮询 

balance roundrobin

rabbitmq集群节点配置 

server rabbit1 192.168.0.1:5672 check inter 5000 rise 2 fall 2 server rabbit2 192.168.0.2:5672 check inter 5000 rise 2 fall 2 server rabbit3 192.168.0.3:5672 check inter 5000 rise 2 fall 2

配置haproxy web监控,查看统计信息

listen private_monitoring :8100 mode http option httplog stats enable 

设置haproxy监控地址为

http://localhost:8100/stats 

stats uri /stats stats refresh 30s 

添加用户名密码认证

stats auth admin:1234

启动

haproxy -f haproxy.cfg 

重启动

service haproxy restart

Keepalived安装

利用keepalived做主备,避免单点问题,实现高可用。

在192.168.1.1和192.168.1.2节点上安装最新版keepalived

192.168.1.1(主)修改keepalived.conf为:Primary配置。

vrrp_script chk_haproxy {    script \"pidof haproxy\"    interval 2}vrrp_instance VI_1 {    interface ens192    state MASTER    priority 200    virtual_router_id 10    unicast_src_ip 192.168.1.1    unicast_peer {        192.168.1.2    }    authentication {        auth_type PASS        auth_pass password    }    virtual_ipaddress {        192.168.1.10 //虚拟ip,对外提供服务    }    track_script {        chk_haproxy    }    notify_master /loadbtify_master.sh}

192.168.1.2(备)修改keepalived.conf为:Secondary配置:

vrrp_script chk_haproxy {    script \"pidof haproxy\"    interval 2}vrrp_instance VI_1 {    interface ens192    state BACKUP    priority 100    virtual_router_id 10    unicast_src_ip 192.168.1.2    unicast_peer {        192.168.1.1    }    authentication {        auth_type PASS        auth_pass password    }    virtual_ipaddress {        192.168.1.10    }    track_script {        chk_haproxy    }    notify_master /loadbtify_master.sh  }

启动keepalived即可,192.168.1.10是对外提供的统一地址。

通过192.168.1.10:5672就可以访问rabbitmq服务。

总结

通过本文的介绍,了解了RabbitMQ镜像队列的基本原理以及如何搭建高可用的RabbitMQ镜像队列,使用镜像队列模式可以达到数据不丢失效果,由于集群节点之间需要保证数据一致性,所以镜像队列只适用于数据可靠性较高的场景,具体情况需要根据实际业务场景进行选择。

作者:任国豪

往期回顾

探索零信任下的应用安全建设

一种时间序列数据的异常检测方法

Docker容器存储层数据持久化实现

初识大二层网络

公众号 : EBCloud

● 扫码关注我们 ●

原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33065.html

(0)
EBCloud's avatarEBCloud
上一篇 2024年4月2日 下午3:29
下一篇 2024年4月2日 下午3:29

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注