更新时间:2021-12-14 10:16:23 来源:极悦 浏览991次
erlang安装版本一致
RabbitMQ安装版本一致
以下示例使用 192.168.73.134 和 192.168.73.135 构建 Rabbitmq 集群
RabbitMQ 是用 erlang 开发的。Cluster 非常方便,因为 erlang 本质上是一种分布式语言,但它不支持负载均衡。在第一次模拟考试中,Rabbit模式可以分为三种:单模、共模和镜像模式。
第一次模拟考试:最简单的情况,非集群模式。
普通模式:默认集群模式。
about Queue Message实体只存在于一个节点,A,B这两个节点只有相同的元数据,即队列结构。
当消息进入A节点的Queue中后,consumer从B节点被拉取时,RabbitMQ会临时在A、B之间传递消息,B中的消息实体发送给consumer。
因此消费者尝试连接每个节点并从中获取消息。也就是说,对于同一个逻辑队列,需要在多个节点建立物理队列。否则不管是A还是B的消费者,出口总是在A,会有瓶颈。
这个模型有问题 A 节点故障后, B 节点无法检索到 A 节点中尚未消费的消息实体。
如果消息持久化完成,则等待A节点恢复后才能被消费;如果没有持久化,那么将不会有更多的节点
镜像模式:将需要的队列做成镜像队列,存在于多个节点中。属于RabbitMQ的HA方案。
该模式解决了上述问题。其本质与普通模式的区别在于消息实体会主动在镜像节点之间同步,而不是在镜像节点消费者取数据时临时拉取数据。
这种模式的副作用也很明显。除了降低系统性能外,如果图像队列数量过多,大量消息进入,集群内的网络带宽也会被这种同步通信大量消耗。
因此适用于对可靠性要求较高的场合(后面会详细介绍这种模式,我们目前搭建的环境就属于这种模式)。
(1)集群中的基本概念
RabbitMQ 的集群节点包括内存节点和磁盘节点。
顾名思义,内存节点将所有数据放在内存中,而磁盘节点将数据放在磁盘上。但是,如上所述,如果在传递消息时开启消息持久化,即使是内存节点,数据仍然安全地放置在磁盘上。
RabbitMQ 集群可以共享用户、虚拟主机、队列、交换器等。必须在所有节点上复制所有数据和状态。例外是当前属于创建它的节点的消息队列,尽管它们是可见的并且可以被所有节点读取。RabbitMQ 节点可以动态加入集群。一个节点可以加入集群,也可以从集群环集群进行基本的负载均衡。
集群中有两种类型的节点:
内存节点:只将状态保存到内存(例外:持久队列的持久内容会保存到磁盘)
磁盘节点:将状态保存到内存和磁盘。
内存节点不写入磁盘,但性能优于磁盘节点。在一个集群中,只需要一个磁盘节点来保存状态,
如果集群中只有内存节点,则不能停止,否则所有的状态、消息等都会丢失。
思路:
为了实现RabbitMQ的高可用,我们先搭建普通集群模式,再配置镜像模式,实现高可用。在Rabbit集群前面增加了一个反向代理,生产者和消费者通过反向代理访问RabbitMQ集群。
架构如下:
(2)集群模式配置
step1:局域网配置
在安装好的三个节点服务器中,分别修改/etc/hosts文件
1. vim /etc/hosts
192.168.73.134 节点 1
192.168.73.135 节点 2
step2:为不同节点之间的相同认证设置Erlang Cookie
Erlang 集群中每个节点的魔法 cookie 来实现,这个 cookie 存储在 /var/lib/rabbitmq/.erlang.cookie 中,该文件的权限为 400。
因此,必须保证每个节点的 cookie 一致,否则节点之间将无法通信。
从主节点采用 copy 的方式来保持 Cookie 的一致性:
1. chmod 777 /var/lib/rabbitmq/.erlang.cookie
2. scp -p 22 /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
复制后,检查文件的用户、组和权限是否符合要求。如果没有,请修改它。在.erlang.cookie之后恢复,否则可能会遇到错误:
3. chown rabbitmq:rabbitmq .erlang.cookie
4. chmod 400 /var/lib/rabbitmq/.erlang.cookie
step3:使用-分离运行每个节点
在RabbitMQ重启后设置cookie:
1. cd /sbin
2.rabbitmqctl停止
3. rabbitmq-server 启动
这里正常重启可能会提示节点实例再次运行。如果出现,使用以下命令启动:
1. ps -aux | 格雷厄尔
2. kill -9 {pid}
3. RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node1 ./rabbitmq-server -detached
RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node2 ./rabbitmq-server -detached
ps:上面的5678是因为rabbitmq端口改成了5678,而且nodename和hosts的设置是一致的。
依次启动所有节点。
step4:查看各个节点的状态
1.查看启动端口:netstat -lntp
活动 Internet 连接(仅限服务器)
Proto Recv-Q Send-Q 本地地址 外地址 状态 PID/程序名称
tcp 0 0 0.0.0.0:4369 0.0.0.0:* 听 27321/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 760/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1066/master
tcp 0 0 0.0.0.0:15678 0.0.0.0:* 听 27862/beam.smp
tcp 0 0 0.0.0.0:25672 0.0.0.0:* 听 27862/beam.smp
tcp6 0 0 :::5678 :::* 听 27862/beam.smp
tcp6 0 0 :::8080 :::* 听 964/java
tcp6 0 0 :::4369 :::* 听 27321/epmd
tcp6 0 0 :::22 :::* LISTEN 760/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1066/master
tcp6 0 0 127.0.0.1:8005 :::* 听 964/java
tcp6 0 0 :::8009 :::* 听 964/java
2.查看rabbitmq启动状态:
rabbitmqctl -n rabbit1@node1 状态
rabbitmqctl -n rabbit1@node2 状态
3.访问http://bbitraq后台打开后,可以查看网页是否可以访问
step5:创建和部署集群
以rabbit@rabbitmq2和rabbit@rabbitmq1组成集群,rabbitmq2作为内存节点(一个硬盘节点就够了);
兔子MQ2:
1.停止节点2的应用:rabbitmqctl -n rabbit@node2 stop_app
在节点 rabbit@rabbitmq2 上停止兔子应用程序
2.添加节点1作为内存节点rabbitmqctl -n rabbit@node2 join_cluster --ram rabbit@node1
集群节点 rabbit@node2 与 rabbit@node1
3、启动节点2的应用:rabbitmqctl -n rabbit@node2 start_app
起始节点rabbit@node2
step6:查看集群状态
1.查看节点1的集群状态:rabbitmqctl -n rabbit@node1 cluster_status
节点rabbit@node1的集群状态
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{分区,[]},
{警报,[{rabbit@node1,[]}]}]
2.查看节点2的集群状态:rabbitmqctl -n rabbit@node2 cluster_status
节点rabbit@node2的集群状态
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
{警报,[{rabbit@node1,[]}]}]
3.后台查看集群状态:
至此,rabbitmq 集群搭建完毕。
上面配置了RabbitMQ默认的集群模式,但是不保证队列的高可用。虽然可以将切换和绑定复制到集群中的任何节点,但不会复制队列内容。这种模式虽然解决了一些节点压力,但是队列节点宕机直接导致队列无法使用,只能等待重启。因此,需要关闭队列节点,否则故障也可以正常使用。要将队列的内容复制到集群中的每个节点,需要创建一个图像队列。
第一步:添加负载均衡器
在负载均衡器方面,F5的BIG-IP、Radware的AppDirector等商用产品都是硬件架构的产品,可以实现高处理能力。但是这些产品的高价会让人望而却步,所以我们也有软件负载均衡解决方案。互联网公司常用的软件LB有LVS、HAProxy、Nginx等,LVS是内核层产品,主要负责第四层的数据包转发,使用比较复杂。HAProxy 和 Nginx 是应用层产品,但 Nginx 主要用于处理 HTTP,因此选择 HAProxy 作为 RabbitMQ 前端的 lb。
1.安装HAProxy(在192.168.73.136安装在HAProxy上)
yum -y 安装haproxy
2.修改haproxy.config进行配置
vim /etc/haproxy/haproxy.config
添加以下配置:
听rabbitmq_cluster 0.0.0.0:5678
模式tcp
平衡循环
服务器rabbitmaster 192.168.73.134:5678 检查inter 2000 上升2 下降3
服务器rabbitslave 192.168.73.135:5678 检查inter 2000 上升2 下降3
修改HaProxy配置后,重启可能会提示端口绑定失败。在这种情况下,请执行以下命令:
setebool -P haproxy_connect_any=1
负载均衡器将监听 192.168.73.136 的 5678 端口,并轮询我们 192.168.73.134 和 192.168.73.135 的 5678 端口这两个节点。这样磁盘节点不会同时受到影响,除了故障。
第二步:配置Rabbitmq策略
在任意节点上执行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
上面的命令会将所有队列设置为镜像队列,即队列会被复制到每个节点,每个节点的状态会保持一致
第三步:使用负载服务器发送消息
客户端使用负载服务器172.16.3.110(panyuntao3)发送消息,队列复制到所有节点。到这里我们就完成了RabbitMQ集群的高可用配置。
通过上述相信大家对RabbitMQ集群搭建已经有所了解,如果您想了解更多相关知识,可以关注一下极悦的RabbitMQ教程,里面的内容细致全面,由浅到深,适合小白学习,希望对大家的学习能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习