RabbitMQ 消息中间件与集群的部署

RabbitMQ 消息中间件

1、消息中间件

1、简介

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。

2、作用
1、消息中间件主要作用
  • 冗余(存储)

  • 扩展性

  • 可恢复性

  • 顺序保证

  • 缓冲

  • 异步通信

2、消息中间件的两种模式
1、P2P模式(点对点)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

P2P的特点:

  • 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中

  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列

  • 接收者在成功接收消息之后需向队列应答成功

  • 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

2、Pub/Sub模式(多对多)

Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Pub/Sub的特点:

  • 每个消息可以有多个消费者

  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息

  • 为了消费消息,订阅者必须保持运行的状态

  • 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

3、常用中间件介绍与对比
1、Kafka

Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

2、RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

3、RocketMQ

RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

RabbiMQ集群

RabbiMQ简介

RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

2、RabbitMQ 特点
  • 可靠性

  • 扩展性

  • 高可用性

  • 多种协议

  • 多语言客户端

  • 管理界面

  • 插件机制

3、什么是消息队列

MQ 全称为Message Queue, 。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。

RabbiMQ模式

注意:RabbitMQ模式⼤概分为以下三种:

(1)单⼀模式。

(2)普通模式(默认的集群模式)。

(3) 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤。

了解集群中的基本概念:

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的。

复制代码
 ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
 Channel(信道):消息推送使用的通道;
 Exchange(交换器):用于接受、分配消息;
 Queue(队列):用于存储生产者的消息;
 RoutingKey(路由键):用于把生成者的数据分配到交换器上;
 BindingKey(绑定键):用于把交换器的消息绑定到队列上;
 Broker:简单来说就是消息队列服务器实体
 vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
 producer:消息生产者,就是投递消息的程序。
 consumer:消息消费者,就是接受消息的程序。
 user:用户

1 内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)

2 磁盘节点:保存状态到内存和磁盘。---推荐

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了

如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

普通集群准备环境

注意,这⾥三台服务器都联⽹,另外RabbitMQ集群节点必须在同⼀⽹段⾥,如果是跨⼴域⽹,效果会变差。关闭防火墙和selinux

cpp 复制代码
 192.168.50.138  rabbitmq-1
 192.168.50.139  rabbitmq-2
 192.168.50.140  rabbitmq-3

三台机器都操作:

  1. 配置hosts⽂件更改三台MQ节点的计算机名分别为rabbitmq-1、rabbitmq-2 和rabbitmq-3,然后修改hosts配置⽂件

    cpp 复制代码
     [root@rabbitmq-1 ~]# vim /etc/hosts
     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
     192.168.50.138 rabbitmq-1
     192.168.50.139 rabbitmq-2
     192.168.50.140 rabbitmq-3

    2.三个节点配置安装rabbitmq软件

复制代码
 安装依赖
cpp 复制代码
[root@rabbitmq-1 ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
复制代码
 yum安装erlang
cpp 复制代码
 [root@rabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
 [root@rabbitmq-1 ~]# yum install erlang-21.3.8.21-1.el7.x86_64
复制代码
 测试;
cpp 复制代码
 [root@rabbitmq-1 ~]# erl
 Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]
 ​
 Eshell V9.3  (abort with ^G)
 1>
复制代码
 ​
 安装rabbitmq
cpp 复制代码
 https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.10
 [root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.10-1.el7.noarch.rpm
复制代码
 ​
 # rabbitmq 和erlang兼容版本
 https://www.rabbitmq.com/which-erlang.html
 # erlang 版本选择
 https://packagecloud.io/rabbitmq/erlang
 # rabbitmq 版本选择
 https://www.rabbitmq.com/news.html
复制代码
 3.启动
 [root@rabbitmq-1 ~]# systemctl daemon-reload
 [root@rabbitmq-1 ~]# systemctl start rabbitmq-server
 [root@rabbitmq-1 ~]# systemctl enable rabbitmq-server
 启动方式二:
 [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status  ---查看状态
 [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start   ---启动
 每台都操作开启rabbitmq的web访问界面:
 [root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management

创建用户

复制代码
 注意:在一台机器操作
 添加用户和密码
 [root@rabbitmq-1 ~]# rabbitmqctl add_user newrain 123456
 Creating user "newrain" ...
 ...done.
 这是为管理员
 [root@rabbitmq-1 ~]# rabbitmqctl set_user_tags newrain administrator
 Setting tags for user "newrain" to [administrator] ...
 ...done.
 查看用户
 [root@rabbitmq-1 ~]# rabbitmqctl list_users
 Listing users ...
 guest   [administrator]
 newrain [administrator]
 ...done.
 ​
 此处设置权限时注意'.*'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限 例如:当没有给
 newrain设置这三个权限前是没有权限查询队列,在ui界面也看不见
 [root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" newrain ".*" ".*" ".*"
 Setting permissions for user "newrain" in vhost "/" ...
 ...done.

所有机器都操作:开启用户远程登录:

复制代码
 [root@rabbitmq-1 ~]# cd /etc/rabbitmq/
 [root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
 [root@rabbitmq-1 rabbitmq]# ls
 enabled_plugins  rabbitmq.config
 [root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
 修改如下:
复制代码
 三台机器都操作重启服务服务:
 [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

查看端口

复制代码
 4369 -- erlang发现端口
 5672 --程序连接端口
 15672 -- 管理界面ui端口
 25672 -- server间内部通信口

!注意如果是云服务器,切记添加安全组端口放行。

访问:192.168.50.138:15672

这里需要注意:

rabbitmq默认管理员用户:guest 密码:guest

新添加的用户为:newrain 密码:123456

开始部署集群三台机器都操作:

1.首先创建好数据存放目录和日志存放目录:

复制代码
 [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
 [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
 [root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
 [root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R
 创建配置文件:
 [root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
 [root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
 RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
 RABBITMQ_LOG_BASE=/data/rabbitmq/logs
 重启服务
 [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

2.拷⻉erlang.cookie

Rabbitmq的集群是依附于erlang的集群来⼯作的,所以必须先构建起erlang的集群景象。Erlang的集群中

各节点是经由过程⼀个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,⽂件是400的权限。所以必须保证各节点cookie⼀致,不然节点之间就⽆法通信.

如果执行# rabbitmqctl stop_app 这条命令报错:需要执行

复制代码
 #如果执行# rabbitmqctl stop_app 这条命令报错:需要执行
 #chmod 400 .erlang.cookie
 #chown rabbitmq.rabbitmq .erlang.cookie

(官方在介绍集群的文档中提到过.erlang.cookie 一般会存在这两个地址:第一个是home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在{home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。)

复制代码
 [root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
 HOUCUGJDZYTFZDSWXTHJ
 ⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中。
 [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.139:/var/lib/rabbitmq/
 [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/

3.将mq-2、mq-3作为内存节点加⼊mq-1节点集群中

复制代码
 在mq-2、mq-3执⾏如下命令:
 [root@rabbitmq-2 ~]# systemctl restart rabbitmq-server
 [root@rabbitmq-2 ~]# rabbitmqctl stop_app  #停止节点
 [root@rabbitmq-2 ~]# rabbitmqctl reset   #如果有数据需要重置,没有则不用
 [root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1  #添加到磁盘节点
 Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
 [root@rabbitmq-2 ~]# rabbitmqctl start_app  #启动节点
 Starting node 'rabbit@rabbitmq-2' ...
 ======================================================================
 [root@rabbitmq-3 ~]# systemctl restart rabbitmq-server
 [root@rabbitmq-3 ~]# rabbitmqctl stop_app
 Stopping node 'rabbit@rabbitmq-3' ...
 [root@rabbitmq-3 ~]# rabbitmqctl reset
 Resetting node 'rabbit@rabbitmq-3' ...
 [root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
 Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
 [root@rabbitmq-3 ~]# rabbitmqctl start_app
 Starting node 'rabbit@rabbitmq-3' ...
 ​
 (1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
 mq-1是磁盘节点。
 (2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
 (3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type
 disc(ram),前提是必须停掉rabbit应⽤
 注:
 #如果有需要使用磁盘节点加入集群
  [root@rabbitmq-2 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1
  [root@rabbitmq-3 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1

4.查看集群状态

复制代码
 在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。
 在mq-1磁盘节点上面查看
 [root@rabbitmq-1 ~]# rabbitmqctl cluster_status
复制代码
 每台机器显示出三台节点,表示已经添加成功!
 (1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
 (2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
 (3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉
 rabbit应用
 在RabbitMQ集群集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。

5.登录rabbitmq web管理控制台,创建新的队列

打开浏览器输⼊http://192.168.50.138:15672, 输⼊默认的Username:guest,输⼊默认的

Password:guest

登录后出现如图所示的界⾯。

根据界⾯提示创建⼀条队列

在RabbitMQ集群集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当

磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。

RabbitMQ镜像集群配置

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。 保证各个节点之间数据同步;

创建镜像集群:

复制代码
 rabbitmqctl set_permissions  ".*" ".*" ".*"         (后面三个”*”代表用户拥有配置、写、读全部权限)
复制代码
 [root@rabbitmq-1 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
 Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
 ​
 [root@rabbitmq-2 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
 Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
 ​
 [root@rabbitmq-3 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
 Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

再次查看队列已经同步到其他两台节点:

"-p Vhost" :vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点。

则此时镜像队列设置成功。(这里的虚拟主机是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。

2、镜像队列策略设置说明

复制代码
 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的优先级

已经部署完成

实验创建一个vhost,并给用户权限添加队列:

首先,在web界面,登陆后,点击"Admin--Virtual Hosts(页面右侧)",在打开的页面上的下方的"Add a new virtual host"处增加一个虚拟主机,同时创建用户"admin"和"guest"均加上权限(在页面直接设置、点点点即可);

一:

创建用户:

注意:创建用户的时候tags指定的从下面的选项中选择用户的类型,如管理员之类的。

再新添加一条队列

在第一台服务器中执行以下命令;

复制代码
 [root@rabbitmq-1 ~]# rabbitmqctl set_policy -p coresystem  ha-all "^" '{"ha-mode":"all"}'

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 6 个步骤后,RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。

三、常见问题

常见错误:

1、使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用rabbitmqctl status提示服务已启动,可知此问题不用解决。

2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下

复制代码
 Cluster status of node rabbit@web2 ...
 Error: unable to connect to node rabbit@web2: nodedown
 ​
 DIAGNOSTICS
 ===========
 ​
 attempted to contact: [rabbit@web2]
 ​
 rabbit@web2:
   * connected to epmd (port 4369) on web2
   * epmd reports node 'rabbit' running on port 25672
   * TCP connection succeeded but Erlang distribution failed
 ​
   * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"
 ​
 ​
 current node details:
 - node name: 'rabbitmq-cli-11@web2'
 - home dir: /root
 - cookie hash: SGwxMdJ3PjEXG1asIEFpBg==

此时先ps aux | grep mq,然后kill -9 该进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)

3、使用rabbitmqctl stoprabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。

采用脚本启动,在脚本中写好启动好需要加载的各配置项(创建admin用户并授权,创建虚拟主机并授权,配置镜像队列)。

安装并配置负载均衡器HA

注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。

安装并配置负载均衡器HA

1、在192.168.50.138安装HAProxy

复制代码
 yum -y install haproxy

2、修改 /etc/haproxy/haproxy.cfg

复制代码
 [root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
 [root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfg
 global
     log         127.0.0.1 local2
 ​
     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid
     maxconn     4000
     user        haproxy
     group       haproxy
     nbproc      4
     daemon
     # turn on stats unix socket
     stats socket /var/lib/haproxy/stats
 #---------------------------------------------------------------------
 defaults
     mode                    http
     log                     global
     retries                 3
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout check           10s
     maxconn                 2048
 #---------------------------------------------------------------------
 ##监控查看本地状态#####
 listen admin_stats
         bind *:80
     mode http
     option httplog
     option httpclose
     log 127.0.0.1 local0 err
     stats uri  /haproxy
     stats auth newrain:123456
     stats refresh 30s
 ####################################
 ###反代监控
 frontend server
     bind *:5670
     log global
     mode tcp
     #option forwardfor
     default_backend rabbitmq
     maxconn 3
 backend rabbitmq
     mode        tcp
     log         global
     balance     roundrobin
     server      rabbitmq1 192.168.50.138:5672 check inter 2000s rise 2 fall 3
     server      rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3
     server      rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3
     
 [root@rabbitmq-1 ~]# systemctl start haproxy

浏览器输入http://192.168.50.138/haproxy查看rabbitmq的状态。

常见命令

插件管理

复制代码
   开启某个插件:rabbitmq-plugins enable  xxx
   关闭某个插件:rabbitmq-plugins disable xxx
   注意:重启服务器后生效。
 ​

virtual_host管理

复制代码
   新建virtual_host:rabbitmqctl add_vhost  xxx
   撤销virtual_host:rabbitmqctl  delete_vhost xxx 

用户管理

复制代码
   新建用户:rabbitmqctl add_user xxxpwd
   删除用户: rabbitmqctl delete_user xxx
   查看用户:rabbitmqctl list_users
   改密码: rabbimqctl change_password {username} {newpassword}
   设置用户角色:rabbitmqctlset_user_tags {username} {tag ...}
   Tag可以为 administrator,monitoring, management

其他使用命令:

复制代码
 rabbitmq使用命令:
 rabbitmq-plugins list    ----查看安装的插件
 rabbitmq-server -detached  -----------启动RabbitMQ节点
 rabbitmqctl start_app ----------启动RabbitMQ应用,而不是节点
 rabbitmqctl stop_app  ------停止
 rabbitmqctl status  ------查看状态
 rabbitmqctl add_user mq 123456    -------设置用户和密码
 rabbitmqctl set_user_tags mq administrator ------------------新增账户并设置为管理员
 rabbitmq-plugins enable rabbitmq_management  --------------------启用RabbitMQ_Management
 rabbitmqctl cluster_status -------------------集群状态
 rabbitmqctl forget_cluster_node rabbit@rabbit3 -------------------节点摘除 
 rabbitmqctl reset application----------------------重置
  rabbitmqctl set_permissions -p "/" 123456  ".*" ".*" ".*"    --------------授权
 --------------------- 
 查看Connection,Queue,Channel,User
 ​
    rabbitmqctl list_connections  #列出所有连接
    rabbitmqctl list_queues  #列出所有队列
    rabbitmqctl list_channels #列出所有通道
    rabbitmqctl list_users   #列出所有用户
 --------------------- 
复制代码
 设置节点类型
 如果你想更换节点类型可以通过命令修改,如下:
 ​
 rabbitmqctl stop_app
 rabbitmqctl change_cluster_node_type dist
 rabbitmqctl change_cluster_node_type ram
 rabbitmqctl start_app
 ===================================================
 移除节点
 如果想要把节点从集群中移除,可使用如下命令实现:
 ​
 rabbitmqctl stop_app
 rabbitmqctl restart
 rabbitmqctl start_app
 =============================================
 集群重启顺序
 集群重启的顺序是固定的,并且是相反的。如下所述:
 ​
 启动顺序:磁盘节点 => 内存节点
 关闭顺序:内存节点 => 磁盘节点
 ​
 最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。
 ​

RabbitMQ 错误处理

复制代码
 returned an error: shutdown: failed to  start child: Logger.ErrorHandler
 原因:erlang版本与RabbitMQ的版本不对应
 解决:根据 RabbitMQ Erlang Version Requirements 这个网页检查版本 https://www.rabbitmq.com/which-erlang.html
相关推荐
回家路上绕了弯1 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840823 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者4 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者6 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧7 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖7 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农7 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者7 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀7 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式