什么是镜像队列
镜像队列集群是相对于普通集群而言的。在普通集群中,消息实体只会存在于主节点的队列中,从节点只会存储主节点的元数据(交换机、绑定关系以及队列的结构),不存储消息实体,因此存在消息丢失的可能性。
引入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 administrator
sudo 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_app
rabbitmqctl join_cluster --ram rabbit@h-ncdrdcs7
rabbitmqctl 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 haproxy
vi /etc/haproxy/haproxy.cfg
listen rabbitmq_local_cluster 0.0.0.0:5672
配置TCP模式
mode tcp
option 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