当前位置: 首页 > news >正文

Linux之RabbitMQ集群部署

RabbitMQ 消息中间件

1、消息中间件

消息(message):
指在服务之间传送的数据。可以是简单的文本消息,也可以是包含复杂的嵌入对象的消息
消息队列(message queue):
指用来存放消息的队列,一般采用先进先出的队列方式,即最先进入的消息最先被处理。用于解耦发送者和接收者之间的关系,提高系统的可靠性和可伸缩性。发送者将消息放入队列中,接收者从队列中获取消息进行处理。

1、简介

消息中间件也可以称消息队列,是利用高效可靠的消息传递机制进行异步的数据传输并基于数据通信来进行分布式系统的集成。

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

2、作用

1. 冗余(存储)
  • 数据持久化:消息中间件通常会将消息存储在磁盘或其他持久化存储介质中,即使发生故障,消息也不会丢失。这对于需要确保消息传递可靠性的场景尤为重要。
  • 重试机制:如果消息传递过程中发生错误,消息中间件可以重新尝试发送消息,直到成功为止。这种机制对于保证消息的最终一致性非常有用。
2. 扩展性
  • 水平扩展:通过消息中间件,可以轻松地增加更多的消费者实例来处理更多负载,从而实现系统的水平扩展。这对于应对流量峰值尤其有用。
  • 分布式处理:消息中间件允许将任务分布在不同的服务器上执行,这有助于实现负载均衡和资源优化。
3. 解耦
  • 松耦合:消息中间件让生产者和消费者之间不再直接通信,而是通过消息中间件进行间接通信。这样做的好处是,当一方发生变化时,不会直接影响另一方,增加了系统的灵活性和可维护性。
  • 灵活性:生产者可以向多个消费者发送消息,同时消费者可以从多个生产者那里接收消息。这种模式允许系统架构更加灵活多变。
4. 异步通信
  • 非阻塞处理:生产者将消息发送到消息中间件后,无需等待消费者处理完成即可继续执行其他任务。这使得系统可以更快地响应新的请求,提高了整体效率。
  • 提高响应时间:由于异步处理,系统可以更快地响应用户请求,提高了用户体验。
5. 削峰
  • 平滑负载:消息中间件可以作为一个缓冲层,帮助平滑流量高峰,避免后端系统因短时间内大量请求而导致过载。
  • 按需处理:消息中间件可以根据后端系统的处理能力和当前的负载情况,调整消息处理的速度。例如,在负载较低时加快处理速度,而在负载较高时减慢处理速度。

2、消息中间件的两种模式

1. 点对点 (P2P) 模式

角色
  • 消息队列 (Queue):消息队列是消息的临时存储容器。它负责接收消息,并将消息转发给消费者。
  • 发送者 (Sender):也称为生产者 (Producer),负责将消息发送到指定的消息队列。
  • 接收者 (Receiver):也称为消费者 (Consumer),负责从消息队列中拉取消息并处理。
特点
  • 消息唯一性:在一个消息队列中,每条消息只能被一个消费者消费。一旦被消费,该消息就会从队列中移除。
  • 可靠性:消息队列通常会持久化消息,以确保即使消费者暂时不可用,消息也不会丢失。
  • 顺序性:消费者一般按照消息进入队列的顺序来处理消息。

2. 发布/订阅 (Pub/Sub) 模式

角色
  • 主题 (Topic):主题是消息分类的一种方式。发布者将消息发布到特定的主题,订阅者根据自己的需求订阅感兴趣的主题。
  • 发布者 (Publisher):发布者将消息发送到指定的主题。
  • 订阅者 (Subscriber):订阅者订阅一个或多个主题,以便接收与这些主题相关的所有消息。
特点
  • 广播特性:发布者发送的消息会被所有订阅了该主题的订阅者接收。
  • 解耦:发布者和订阅者之间不存在直接联系,这使得双方可以独立地进行开发和部署。
  • 动态订阅:订阅者可以在运行时动态地添加或删除订阅关系。
  • 消息过滤:某些消息中间件支持订阅者基于消息的内容进行过滤,只接收满足特定条件的消息。
  • P2P模式 更适合需要保证消息被单个消费者消费且具有严格顺序要求的场景,如事务处理或订单处理等。
  • Pub/Sub模式 则更适合需要将消息广播给多个订阅者并且不需要严格顺序的场景,如实时通知系统或消息推送服务等。

消费者怎么得到消息队列的数据?

消费者怎么从消息队列里边得到数据?有两种办法:
​
- 生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push)
- 消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull)

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

1、Kafka

Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是追求高吞吐量(单机可达到10万级)时效性是毫秒级的,一开始的目的就是用于日志收集和传输。对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

2、RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、可靠性、安全。在企业系统内对数据一致性、稳定性和可靠性要求很高的场景(时效性是微秒级),对性能和吞吐量(单机万级)的要求还在其次。

Erlang是一种通用的面向并发的编程语言,它专注于构建分布式、可伸缩的实时应用程序。它具有轻量级进程、消息传递和内置容错机制等特性,非常适合构建高并发的系统。
AMQP(Advanced Message Queuing Protocol)协议是一种用于进程间传递异步消息的网络协议。它定义了消息的格式和传递规则,支持可靠的消息传送、消息路由和队列管理等功能。

3、区别

RabbitMQ更适合需要高可靠性和灵活性的应用场景,适用于需要确保消息传递不丢失且顺序性较为重要的场景。而Kafka则更适合对数据处理的吞吐量要求较高、并且可以接受一些消息传递的延迟和少量数据丢失的场景,适用于大规模数据流处理或实时日志处理等场景。

RabbiMQ集群

RabbiMQ简介

RabbiMQ是⽤erlang语言开发的,开源的,集群⾮常⽅便,支持多种语言客户端,包括java、Python、ruby、PHP、C/C++等,但其本身并不⽀持负载均衡,支持高并发。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、高可用性等方面表现不俗。

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。Ajax = 异步 JavaScript 和 XML

2、RabbitMQ 特点

- 可靠性---提供了多种技术可以在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、和高可用性机制。持久性机制:可以通过设置消息的持久性标志来确保消息在服务器重启后仍然存在。持久化的消息会被写入磁盘,并在RabbitMQ重启后重新加载。投递确认:发布确认功能可以让生产者知道消息是否成功发送到了消息队列。如果消息未能成功投递,生产者可以重新发送该消息。高可用性机制:RabbitMQ 支持集群部署,可以配置为镜像队列模式,这样即使某个节点失败,其他节点也可以继续提供服务,确保消息不会丢失。
​
- 高可用性:集群:多个RabbitMQ节点可以组成一个集群,使得消息可以在集群内的任意节点上被发布和消费。镜像队列:在集群中,可以将队列配置为镜像队列,这意味着队列的内容会在所有集群节点上复制,从而提高了系统的容错性和可用性。故障转移:当某个节点发生故障时,其他节点可以接管其工作,确保服务的连续性。
​
- 多语言客户端:RabbitMQ 支持多种编程语言的客户端库,这使得开发者可以用自己熟悉的语言编写应用程序。官方支持的语言包括但不限于 Java、Python、Ruby、.NET 和 JavaScript。此外,由于RabbitMQ基于AMQP标准协议,所以几乎所有的编程语言都可以通过第三方库或自定义客户端与之交互。
​
- 管理界面:RabbitMQ 提供了一个直观的Web管理界面,允许管理员监控和管理RabbitMQ服务器的状态。通过这个界面,您可以查看队列、交换机和连接的状态,还可以执行各种管理操作,例如创建和删除队列、查看消息内容等。
​
- 插件机制

MQ如何实现持久化 

​1. 队列实现持久化
如果要队列实现持久化,需要在声明队列的时候把 durable 参数设置为持久化 。
boolean durable = true;
channel.queueDeclare(ACK_QUEUE_NAME, durable, false, false, null);
但是需要注意的就是如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新 创建一个持久化的队列,不然就会出现错误。
​
当我们将durable参数位置传递true之后,即使重启 rabbitmq 队列也依然存在。
​
2. 消息实现持久化
要想让消息实现持久化需要在消息生产者修改代码,需要像channel的basicPublish方法中props属性中传递MessageProperties.PERSISTENT_TEXT_PLAIN 参数

3、消息队列

MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

RabbiMQ模式

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

(1)单⼀模式。在单一模式下,RabbitMQ仅由单个节点组成,用于传递消息。这种模式适用于简单的应用场景,对可靠性和高可用性要求较低。

(2)普通模式。普通模式是RabbitMQ的默认集群模式。多个节点组成一个集群,消息会在这些节点之间进行分发和传递,以提高消息传递的可靠性和高可用性。普通模式适用于大多数场景。

(3) 镜像模式。镜像模式是RabbitMQ的高可用性解决方案之一。在镜像模式中,需要先建立一个普通集群模式,然后在此基础上配置镜像模式。镜像队列将消息副本存储在多个节点上,以实现高可用性。这种模式适用于对业务可靠性要求较高的场景。

集群中的基本概念

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。

内存节点(RAM节点):内存节点将所有的队列、交换器和绑定信息存储在内存中。这种节点对于低延迟和高吞吐量的场景非常适用,但是在节点宕机时,存储在内存中的消息会丢失。

磁盘节点:磁盘节点将队列、交换器和绑定信息存储在磁盘上,以保证数据的持久性。即使节点宕机,数据也可以从磁盘中恢复。磁盘节点可以通过配置设置为具有镜像队列的高可用性模式,以确保数据的冗余备份。

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

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立tcp连接的管理器,程序代码中使用;
Channel(信道):消息推送使用的通道;
Exchange(交换器):用于接受、分配消息;
Queue(队列):用于存储生产者的消息;类似存放商品的仓库和商店。是生产商品的工厂和购买商品的用户之间的中转站。
Broker:简单来说就是消息队列服务器实体
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
user:用户
Binding: exchange 与 queue 之间的虚拟链接,binding 中可以包含 routing key。binding 信息被保存到 exchange 的查询表中,用于消息的分发。

面试注意:集群中有两种节点

1 内存节点:只保存状态到内存(持久的queue的持久内容将被保存到disk)

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

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了。如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

普通集群准备环境

注意,这⾥三台服务器都关闭防火墙和selinux

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配置⽂件

    [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软件

安装依赖

[root@rabbitmq-1 ~]# yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
yum安装erlang
[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
测试;
[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
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.10 ---选择版本
下载下来将其上传到服务器中,三台机器相同操作
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm
​
[root@rabbitmq-1 ~]# yum install -y rabbitmq-server-3.7.10-1.el7.noarch.rpm
​
# erlang 版本选择
https://packagecloud.io/rabbitmq/erlang
# rabbitmq 和erlang兼容版本
https://www.rabbitmq.com/which-erlang.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 soho soso
Creating user "soho" ...
...done.
设置为管理员
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
Setting tags for user "soho" to [administrator] ...
...done.
查看用户
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
soho    [administrator]
...done.
此处设置权限时注意'.*'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限 
例如:当没有给
soho设置这三个权限前是没有权限查询队列,在ui界面也看不见
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho ".*" ".*" ".*"
Setting permissions for user "soho" 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

新添加的用户为:soho 密码:soso

部署集群

三台机器都操作

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的集群中

各节点是经由⼀个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 ~]# 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 ~]# 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

每台机器显示出三台节点,表示已经添加成功!

5.登录rabbitmq web管理控制台

打开浏览器输⼊http://192.168.50.138:15672

输⼊默认的Username:guest,输⼊默认的Password:guest

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

创建新的队列

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

创建新的用户

 添加主机

切换用户

RabbitMQ镜像集群配置

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

镜像队列是基于普通的集群模式的。

创建镜像集群

rabbitmq set_policy :设置策略

[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 "/" ...

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

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

设置策略介绍:
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition
-p Vhost: 可选参数,针对指定vhost下的queue进行设置(默认根虚拟主机)
Name: policy的名称,可以定义
Pattern: queue的匹配模式(正则表达式),也就是说会匹配一组。
Definition:镜像定义,包括ha-mode,ha-params,ha-sync-modeha-mode:指明镜像队列的模式all:表示在集群中所有的节点上进行镜像exactly:表示在指定个数的节点上进行镜像,ha-params:指定节点的个数ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual,一般为自动同步ha-params:ha-mode模式需要用到的参数
案例:
例如,对队列名称以hello开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为: 
rabbitmqctl set_policy hello-ha “^hello” ‘{“ha-mode”:”exactly”,”ha-params”:2,”ha-sync-mode”:”automatic”}’

则此时镜像队列设置成功。

示例:

[root@rabbitmq-1 ~]# rabbitmqctl set_policy ha-all-1 -p test "^" '{"ha-mode":"all"}'
Setting policy "ha-all-1" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "test" ...

已经部署完成

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。

三、常见问题

常见错误:

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等均丢失,还需要重新添加。

RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。

搭建均衡器

安装并配置负载均衡器HA

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

安装并配置负载均衡器HA

1、在192.168.50.138(rabbitmq-1)安装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
globallog         127.0.0.1 local2
​chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxynbproc      4daemon# turn on stats unix socketstats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
defaultsmode                    httplog                     globalretries                 3timeout connect         10stimeout client          1mtimeout server          1mtimeout check           10smaxconn                 2048
#---------------------------------------------------------------------
##监控查看本地状态#####
listen admin_statsbind *:80mode httpoption httplogoption httpcloselog 127.0.0.1 local0 errstats uri  /haproxystats auth yunjisuan:123
####################################
###反代监控
frontend serverbind *:5670log globalmode tcpdefault_backend rabbitmqmaxconn 3
backend rabbitmqmode        tcplog         globalbalance     roundrobinserver      rabbitmq1 192.168.50.138:5672 check inter 2000s rise 2 fall 3server      rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3server      rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3/usr/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg #检查配置是否有效
systemctl restart haproxy                #重启

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

常见命令

插件管理

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

用户管理

 新建用户:rabbitmqctl add_user xxx  pwd删除用户: rabbitmqctl delete_user xxx查看用户:rabbitmqctl list_users改密码: rabbimqctl change_password {username} {newpassword}设置用户角色:rabbitmqctl set_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 "/" soso  ".*" ".*" ".*"    --------------授权
--------------------- 
查看Connection,Queue,Channel,Userrabbitmqctl list_connections  #列出所有连接rabbitmqctl list_queues  #列出所有队列rabbitmqctl list_channels #列出所有通道rabbitmqctl list_users   #列出所有用户

相关文章:

Linux之RabbitMQ集群部署

RabbitMQ 消息中间件 1、消息中间件 消息(message): 指在服务之间传送的数据。可以是简单的文本消息,也可以是包含复杂的嵌入对象的消息 消息队列(message queue): 指用来存放消息的队列,一般采用先进先出的队列方式,即最先进入的…...

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步

多线程API 进程和线程 进程:进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人,专门负责完成某项任务(比如打开浏览器、播放音乐)。每个进程都有自己独立的资源(比如内存)和…...

最新Windows 11 23H2精简版,免费获取!稳定流畅!

今日,系统之家小编给大家带来了2024最新的Windows11 23H2精简版系统,该版本系统经过适度地优化与精简,保留大部分功能,完全能满足日常使用需求,兼容性非常出色,无需担心应用程序出现闪退问题。大家可以通过…...

PostgreSQL SELECT 语句:深入解析与实例应用

PostgreSQL SELECT 语句:深入解析与实例应用 PostgreSQL 是一款功能强大的开源关系数据库管理系统,它以稳定性、可靠性以及支持高级功能而著称。在 PostgreSQL 中,SELECT 语句是最基本也是最重要的查询语句之一,用于从数据库表中检索数据。本文将详细介绍 SELECT 语句的用…...

【自然语言处理】 构建文本对话系统

构建文本对话系统的框架如下: 根据聊天系统目的功用的不同,可分成三大类型: 闲聊式机器人:较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等,主要以娱乐为目的。 **知识问答型机器人:**知识…...

java: 程序包org.slf4j不存在

当在Java项目中遇到“程序包org.slf4j不存在”的错误时,这通常意味着你的项目没有正确地包含SLF4J(Simple Logging Facade for Java)的库。SLF4J是一个Java的日志门面(Facade),它允许你在后端使用不同的日志…...

图片转PDF怎么转?教你3种快捷方便的jpg转pdf方法

图片文件以及PDF文档已经是我们工作当中不可或缺的一部分,我们在一些商务合作的场景下经常需要把拍摄下来的合同、企划书、画册等图片内容转换为PDF格式后再发送,这样能够极大程度的保证文件的安全性,那么图片应该如何转换成PDF文件呢?今天来…...

数据防泄密软件如何防止数据泄密?七大措施筑起数据安全壁垒

数据防泄密软件通过集成多种安全防护技术,旨在全面保护企业数据的安全性和保密性。以安企神软件为例,其实现全面防泄密的方式主要包括以下7个方面,为企业筑起数据安全壁垒。 1. 透明加密技术 安企神软件采用先进的透明加密技术,确…...

GNU/Linux - systemd介绍

systemd官网: System and Service Manager systemd systemd Github地址: https://github.com/systemd/systemd 首次发布 2010年3月30日 System and Service Manager systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为…...

如何理解递归

在二叉树的题目中,我们难免会用到递归方法,递归思想很简单,但运用起来却因为抽象而难以理解。 理解递归的关键在于认识到它是一种解决问题的方法,允许函数直接或间接地调用自身。以下是对递归的概述以及如何理解它的几个要点&…...

Spring Cache sync属性

在Spring Cache中,Cacheable注解用于标记一个方法,使其返回值可以被缓存。sync属性是Spring 4.3引入的一个新特性,用于控制缓存的同步行为。 sync 属性 sync属性的默认值是false,表示异步缓存。如果将sync设置为true&#xff0c…...

【Unity】通用GM QA工具 运行时数值修改 命令行 测试工具

GM工具使用: GM工具通常用于游戏运行时修改数值(加钱/血量)、解锁关卡等,用于快速无死角测试游戏。一个通用型GM工具对于游戏项目是非常实用且必要的,但通用不能向易用妥协,纯命令行GM门槛太高,对QA不友好。 这类运行时命令行工具…...

[Spring] Spring原理(SpringBoot完结)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

python | rq,一个无敌的 关于Redis 的Python 库!

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。 原文链接:rq,一个无敌的 Python 库! 大家好,今天为大家分享一个无敌的 Python 库 - rq。 Github地址:https://githu…...

Redis的缓存淘汰策略

1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数,maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下, maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…...

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)

目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构,通常以二叉树的…...

1个人躲,5个人抓!《极限竞速:地平线5》全新游戏模式“捉迷藏”即将推出

风靡全球的赛车竞速游戏《极限竞速:地平线5》即将推出全新游戏模式——捉迷藏(Hide & Seek)。 《极限竞速:地平线5》日前发布了全新预告,展示了即将于 9 月 10 日推出的捉迷藏模式游戏玩法。该预告是日前举办的2024 年科隆国际游戏展 Xb…...

ARCGIS XY坐标excel转要素面

1、准备好excel 坐标 excel文件转为csv才能识别,CSV只能保留第一个工作表并且,不会保留格式。 2、在ArcGis中导入XY事件图层 创建XY事件图层 图层要素赋对象ID 将导入的图层导出为先新的图层,这样就给每个要素附加了唯一的值 选择点集转线…...

MyBatis源码系列3(解析配置文件,创建SqlSessionFactory对象)

创建SqlSessionFactory; 首先读取配置文件,使用构造者模式创建SqlSessionFactory对象。 InputStream inputStream Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder…...

企业级web应用服务器tomcat

目录 一、Web技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二、tomcat的功能介绍 2.1 安装 tomcat 环境准备 2.1.1 安装java环境 2.1.2 安装并启动tomcat …...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...