热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在CentOS7上部署Rabbitmq集群配置

概述RabbitMQ是目前流行的开源消息队列系统。MQ(消息队列)是一种应用程序对应用程序的通信方法。RabbitMQ的结构图如图所示:实现步骤在一个集群里,有三台服务器,其中一台
概述

RabbitMQ是目前流行的开源消息队列系统。MQ(消息队列)是一种应用程序对应用程序的通信方法。

RabbitMQ的结构图如图所示:

技术分享图片

实现步骤

在一个集群里,有三台服务器,其中一台使用磁盘模式,另两台使用内存模式。两台内存模式的节点无疑速度更快,因此通过客户端连接访问它们。但是客户端不可能分别连接两个内存节点,肯定是通过前端反向代理去轮询分发请求如果担心前端反向代理服务器故障,可以通过Keepalived软件做一个高可用架构。而磁盘模式的节点,由于磁盘IO相对较慢,因此仅作数据备份使用。

注意:将三台服务器都连接上互联网并安装软件包。另外RabbitMQ集群节点必须在同一个网段里,如果是跨广域网,效果就会变差。

RabbitMQ集群配置信息如表所示表:

技术分享图片

实验步骤

1.配置三个节点的host文件,将以下内容分别加入到三台服务器上。

rabbitmq01:
[root@localhost ~]# vim /etc/hostname
mq01.localdomain

[root@localhost ~]# vim /etc/hosts 
192.168.126.138 mq01            #注意-主机名称也要更改
192.168.126.133 mq02
192.168.126.141 mq03 

rabbitmq02:
[root@localhost ~]# vim /etc/hostname     
mq02.localdomain

[root@localhost ~]# vim /etc/hosts 
192.168.126.138 mq01       
192.168.126.133 mq02
192.168.126.141 mq03     

rabbitmq03:
[root@localhost ~]# vim /etc/hostname 
mq03.localdomain
[root@localhost ~]# vim /etc/hosts 
192.168.126.138 mq01       
192.168.126.133 mq02
192.168.126.141 mq03 

2.关闭三台服务器的防火墙并且重启虚拟机便于系统识别

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# init 6       #重启

3.准备好YUM源之后,就可以直接使用yum命令安装rabbitmq到三台服务器上。

[root@mq01 ~]# yum install epel-release -y
[root@mq01 ~]# yum install rabbitmq-server -y

[root@mq01 ~]# ln -s /usr/lib/rabbitmq/bin/* /usr/bin/

4.分别查看三个节点并添加管理服务

[root@mq01 ~]# cd /usr/lib/rabbitmq/bin/
[root@mq01 bin]# ls
rabbitmqctl        rabbitmq-env      rabbitmq-server
rabbitmq-defaults  rabbitmq-plugins
[root@mq01 bin]# rabbitmq-plugins list   #查看插件安装情况
[ ] amqp_client                       3.3.5
[ ] cowboy                            0.5.0-rmq3.3.5-git4b93c2d
[ ] eldap                             3.3.5-gite309de4
[ ] mochiweb                          2.7.0-rmq3.3.5-git680dba8
[ ] rabbitmq_amqp1_0                  3.3.5
[ ] rabbitmq_auth_backend_ldap        3.3.5
.......//省略

[root@mq01 bin]# rabbitmq-plugins enable rabbitmq_management    #启用管理服务
The following plugins have been enabled:
  mochiweb        
  webmachine
  rabbitmq_web_dispatch   #网络调度
  amqp_client
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect. #插件配置发生了变化。重新启动RabbitMQ以使更改生效。

5.启动rabbitmq服务,使用netstat -an | grep 5672进行查看,有如下三个端口开放说明正常。

[root@mq01 bin]# systemctl start rabbitmq-server.service 
[root@mq01 bin]# netstat -an | grep 5672
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN     
tcp6       0      0 :::5672        

参数注解:
15672和25672是rabbitmq的管理端口
5672是生产者、消费者通信的端口

6.检查三台的集群状态

[root@mq01 bin]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...     #目前相互独立,没有形成集群
[{nodes,[{disc,[rabbit@mq01]}]},
 {running_nodes,[rabbit@mq01]},
 {cluster_name,<<"rabbit@mq01">>},
 {partitions,[]}]
...done.

7.停止三台服务器的rabbitmq服务

[root@mq01 bin]# systemctl stop rabbitmq-server.service 

8.在三台服务器上构建Erlang的集群环境

[root@mq01 bin]# vim /var/lib/rabbitmq/.erlang.COOKIE 
GYIIPFNYPZITHCELVPZU          
注意:
在Erlang的集群中,各节点是通过一个magic COOKIE来实现的,这个coolie存放在/var/lib/rabbitmq/.erlang.COOKIE中,文件是400的权限。所以必须保证各节COOKIE保持一致,否则节点间就无法通信!

9.开启rabbitmq服务

[root@mq01 bin]# systemctl start rabbitmq-server.service 

10.将rabbitmq02、rabbitmq03作为内存节点与rabbitmq01磁盘节点连接起来。

rabbitmq02:
[root@mq02 bin]# rabbitmqctl stop_app   #停止rabbitmq
[root@mq02 bin]# rabbitmqctl join_cluster --ram rabbit@mq01  #将mq02连接到mq01,成为一个集群
Clustering node rabbit@mq02 with rabbit@mq01 ...
...done.
[root@mq02 bin]# rabbitmqctl start_app   #开启rabbitmq
[root@mq02 bin]# rabbitmqctl cluster_status   #验证群集状态
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]},      
 {running_nodes,[rabbit@mq01,rabbit@mq02]},
 {cluster_name,<<"rabbit@mq01">>},
 {partitions,[]}]
...done.

rabbitmq03:
[root@mq03 bin]# rabbitmqctl cluster_status    #验证群集
Cluster status of node rabbit@mq03 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},   
 {running_nodes,[rabbit@mq02,rabbit@mq01,rabbit@mq03]},
 {cluster_name,<<"rabbit@mq01">>},
 {partitions,[]}]
...done.                                      #验证成功

11.打开浏览器访问http://192.168.126.138:15672/ #默认用户名:guest 密码:guest
技术分享图片
技术分享图片

策略创建、查看、添加队列

1).点击右边的policies按钮,创建策略。
技术分享图片
技术分享图片

参数注释:
Name:策略名称
pattern:匹配的规则
Definition:使用ha-mode模式中的all,也就是同步所以匹配的队列。‘?’类型与帮助文档
Priority:优先级,默认为0,值越大优先级越大。

2)在任意一台节点上添加一个Queues队列,点击Queues按钮,输入name、Arguments的值,别的值按其默认就好,如图所示:
技术分享图片
技术分享图片

参数注解:
Name:队列的名称
Durability:队列是否持久化(Durable持久化)
Node:消息队列的节点
Auto delete:自动删除
Arguments:使用的策略类型

3)再创建一个队列,分别在两个队列里创建一条消息。点击aa、ht队列按钮,选择Publish Message创建消息。
技术分享图片

参数注解:
2-Persistent:持久化,反之上面显示非持久化
Headers:随意填写即可
Properties:点击问号,选择一个消息ID

4)进行破坏性测试看看群集效果是否成功。

将rabbitmq01节点关闭,再通过mq02、mq03查看消息记录是否还存在。

[root@mq01 ~]# systemctl stop rabbitmq-server.service 

如图所示:
技术分享图片
技术分享图片

从上图可以看到ht队列已经不存在了,说明没有做镜像模式。而aa队列已经从之前的+2显示成+1了,而且消息还是存在的。

再将mq02节点的服务关闭,通过mq03查看消息记录是否还存在。如图所示:

[root@mq02 ~]# systemctl stop rabbitmq-server.service 

技术分享图片

将mq01、mq02节点的服务启动,看到aa队列后面的+2变成粉色,鼠标指上去显示镜像无法同步。如果这个时候将mq03节点的服务停止,那么队列里的消息将会丢失。
技术分享图片

在mq02节点服务器上执行rabbitmqctl sync_queue aa,同步完成后+2变成蓝色。如图所示:

[root@mq02 ~]# rabbitmqctl sync_queue aa

技术分享图片
5)查看队列在服务器上的位置,如图所示,一个目录对应的就是一个队列,里面就是该队列本身的消息。注意如果内存节点故障,队列就会丢失;如果是磁盘节点故障,队列还会存在。但如果是创建队列时指定了ha参数,带修复磁盘节点故障后,再启动磁盘节点的rabbitmq服务,未消费的队列及消息会不存在,需要手动执行同步队列命令。

[root@mq01 ~]# ll /var/lib/rabbitmq/mnesia/rabbit\@mq01/queues/ 
总用量 0
drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月   1 15:07 81NI5XJ4KZDI2KGNS7MV3CP7T
drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月   1 14:39 COUUYINKJGWZ16DIMV5GJZ5Z7

rabbitmq集群的破坏性测试成功,说明集群配置成功。

注意:
消息节点一般都是程序直接调用,去创建队列、消息等等。程序里面如果想使用消息高可用集群配置,那么代码需要指定ha参数,如果不指定x-ha-prolicy的话将无法复制。

在CentOS7上部署Rabbitmq集群配置


推荐阅读
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 在尝试重新激活已过期的 Visual Studio 2008 试用版时遇到了困难,特别是找不到输入序列号的位置。经过一番探索,最终找到了有效的解决方法,包括未安装和已安装过期后的处理方式。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细介绍了一种高效的算法——线性筛法,用于快速筛选出一定范围内的所有素数。通过该方法,可以显著提高求解素数问题的效率。 ... [详细]
  • 本文详细介绍了get和set方法的作用及其在编程中的实现方式,同时探讨了点语法的使用场景。通过具体示例,解释了属性声明与合成存取方法的概念,并补充了相关操作的最佳实践。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 在CentOS上构建Ntopng实时网络流量监控平台
    本文详细介绍了如何在CentOS操作系统上安装和配置Ntopng,一个强大的网络流量监控工具。Ntopng能够提供实时的网络流量分析,并通过Web界面展示详细的流量报告。 ... [详细]
author-avatar
薄雨如烟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有