MQ--1( Message queuing)>>>>RabbitMQ

MQ( Message queuing)

消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统稳定性,消息队列主要具有以下特点:
削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)

系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)

提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)

蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)

目前主流的消息队列软件有RabbitMQ 、 kafka 、 A ctiveMQ 、 R ocket MQ 等 还有小众的消息队列软件如 ZeroMQ 、 Apache Qpid 等 。

一.RabbitMQ:

https://www.rabbitmq.com/ #RabbitMQ官网

https://www.aliyun.com/product/ons?spm=5176.234368.h2v3icoap.427.2620db25lcHi1Q&aly_as=Tz_Lue_o #阿里云消息队列

1.1 RabbitMQ 简介

Message Queue的需求由来已久,在 1 9 世纪 80 年代金融交易中,美国高盛等公司采用 Teknekron 公司的产品,当时的 Message queuing 软件叫做 the informationbus TIB 后来 TIB 被电信和通讯 等 公司采用, 然后 路透社收购了 Teknekron 公司 ,再然 后 IBM 公司 开发了 MQSeries 并且 微软 也 开发了 Microsoft MessageQueue MSMQ ),但是 这些商业 MQ 供应商的问题是厂商锁定及使用价格高昂,于是 2001 年, Java Message queuing 试图解决 锁定和交互性的问题,但对应用来说反而更加麻烦了,于是 2004 年,摩根大通和 iMatrix 开始着手 Advanced MessageQueuing Protocol AMQP )开放标准的开发 2006 年, AMQP 规范发布, 2007年, Rabbit 技术公司基于 AMQP 标准开发的 Rab bitMQ 1.0 发布。
路透社Reuters LSE RTR NASDAQ: RTRSY )是世界上最早 创办的通讯社之一,也是目前英国最大的通讯社和西方四大通讯社之一, 路透社是世界前三大的多媒体新闻通讯社,提供各类新闻和金融数据,在 128 个国家运行。
摩根大通集团 业界称西摩或小摩,总部位于美国纽约,总资产 2.5 万亿美元,总存款 1.5 万亿美元,占美国存款总额的 25%25%,分行 6000 多家,是美国最大金融服务机构之一 。
iMatrix 是一个企业级的 JAVA 快速开发平台 。
MQ--1( Message queuing)>>>>RabbitMQ_第1张图片
RabbitMQ: 采用 Erlang 语 言开发, Erlang 语言由 Ericson 设计, Erlang 在分布式编程和故障恢复方面表现出色,电信领域被广泛使用。
Broker: 接收和分发消息的应用, RabbitMQ Server 就是 Message Broker 。
Virtual host: 出于多租户和安全因素设计的,把 AMQP 的基本组件 划分到一个虚拟的分组中,类似于网络中的 namespace概念当多个不同的用户使用同 一个RabbitMQ server 提供的服务时,可以划分出多个vhost ,每个用户在自己的 vhost创建 exchange queue 等。
Connection: publisher consumer 和 broker 之间的 TCP 连接。
Channel: 如果每一次访问 RabbitMQ 都建立一个 Connection ,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。 Channel 是在 connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的chann el 进行通讯, AMQP method 包含了 channel id 帮助客户端和 message broker识别 channel ,所以 channel 之间是完全隔离的。 Channel 作为轻量级的 Connection极大减少了操作系统建立 TCP connection 的开销。
Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key ,分发消息到 queue 中去。常用的类型有: direct (point to point), topic (publish subscribe) and fanout (multicast) 。
Queue: 消息最终被送到这里等待 consumer 取走。
Binding : exchange 和 queue 之间的虚拟连接, binding 中可以包含 routing key 。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。

1.2Rabbit M Q 中的生产者消费者示例

MQ--1( Message queuing)>>>>RabbitMQ_第2张图片

生产者发送消息到 broker server (RabbitMQ) 在 Broker 内部,用户创建Exchange/Queue ,通过 Binding 规则将 两者联系在一起, Exchange 分发消息,根据类型/binding 的不同分发策略有区别, 消息最后来到 Queue 中,等待消费者取走。

JMS是在2001 年发布的 Java 消息服务( Java Message Service )应用程序接口是一个 Java 平台中关于面向消息中间件( MOM message oriented middleware)的 API ,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

1.3RabbitMQ 单机部署

https://www.rabbitmq.com/download.html #官网下载链接
https://github.com/rabbitmq/rabbitmq-server/releases #github下载地址
https://www.rabbitmq.com/install-debian.html #环境部署参考
http://dl.bintray.com/rabbitmq-erlang/debian/pool/erlang/ #erlang版本参考
服务器环境
172.18.0.51 mq server1
实验:
172.20.10.100 MQ-server1.kaivi.tech
root@MQ-server1:~# hostnamectl set-hostname MQ-server1.kaivi.tech

1.3.1 Ubuntu 1804 安装 单机版 RabbitMQ

https://www.rabbitmq.com/install-debian.html#apt

1.3.1.1主机名解析

在当前MQ服务器配置本地 主机名解析:
172.18.0.51 mq server1 mq server1.magedu.net
之后主机名不要修改,不然可能rabbitmq起不来
实验:

root@MQ-server1:~# vim /etc/hosts
172.20.10.100 MQ-server1 MQ-server1.kaivi.tech #短域名以及长域名都解析一下 最后一行新增

1.3.1. 2 服务器安装 RabbitMQ

安装 基础命令及添加 key
sudo apt g et install curl gnupg
# curl fsSL https://github.com/rabbitmq/signing
keys/releases/download/2.0/rabbitmq release signing key.asc | sudo apt key add
OK

安装 apt HTTPS 传输
# sudo apt get install apt transport https

各节点添加 apt 源
sudo tee /etc/apt/sources.list. d/bintray.rabbitmq.list <<EOF
## Installs the latest Erlang 22.x
## Change component to "erlang 21.x" to install the latest 21.x version.
## "bionic" as distribution name should work for any later Ubuntu or Debian
## See the release to di stribution mapping table in RabbitMQ doc guides to learn
more.
deb https://dl.bintray.com/rabbitmq erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
EOF

更新软件包列表并安装:
# sudo apt get update
# apt cache madison rabbitmq server 查看可以安装的版本
apt install rabbitmq server=3.7.22 1 安装较新版本的 R abbitMQ

安装完成
MQ--1( Message queuing)>>>>RabbitMQ_第3张图片
实验:
https://www.rabbitmq.com/install-debian.html #单机安装部署参考文件

sudo apt-get update -y

sudo apt-get install curl gnupg -y

curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

sudo apt-get install apt-transport-https

sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <<EOF
## Installs the latest Erlang 22.x release.
## Change component to "erlang-21.x" to install the latest 21.x version.
## "bionic" as distribution name should work for any later Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
EOF
sudo apt-get update -y
apt-cache madison rabbitmq-server
root@MQ-server1:~# apt install rabbitmq-server=3.8.3-1 -y

MQ--1( Message queuing)>>>>RabbitMQ_第4张图片

root@MQ-server1:~# systemctl status rabbitmq-server  #ubantu会自动启动rabbitmq
修改了配置文件需要restart

MQ--1( Message queuing)>>>>RabbitMQ_第5张图片

root@MQ-server1:~# rabbitmqctl --help  #查看对应命令

https://docs.openstack.org/install-guide/environment-messaging-ubuntu.html #命令使用 权限

1 .3.1.3 :启动 Rabbit MQ服务

# systemctl start rabbitmq server
# systemctl enable rabbitmq server

MQ--1( Message queuing)>>>>RabbitMQ_第6张图片

1.3.1.4 :开启web界面管理插件

root@MQ-server1:~# rabbitmq-plugins list  #插件已经安装
root@MQ-server1:~# rabbitmq-plugins enable  rabbitmq_management  #打开插件
Enabling plugins on node rabbit@MQ-server1:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@MQ-server1...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

# rabbitmq-plugins enable rabbitmq_management

5672 :消费者访问的 端口
15672 web 管理端口
25672 :集群状态通信端口

MQ--1( Message queuing)>>>>RabbitMQ_第7张图片

1.3.1.5 登陆 web 管理界面

rabbitmq 从 3.3.0 开始禁止使用 guest/guest 权限通过除 localhost 外的访问 ,
直接访问报错如下:默认账号口令都是guest。但是禁止了除了本机登入
MQ--1( Message queuing)>>>>RabbitMQ_第8张图片
允许方式:

#vim /usr/lib/rabbitmq/lib/rabbitmq_server 3.7.22/ebin/rabbit.app
39行    {loopback_users, []},    #删除被禁止登陆的 guest账户 删除中括号里面的内容

#systemctl restart rabbitmq server.service   # 重启 rabbitmq 服务

实验:

root@MQ-server1:~# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.3/ebin/rabbit.app 
39行    {loopback_users, []},    #删除被禁止登陆的 guest账户 删除中括号里面的内容

root@MQ-server1:~# systemctl restart rabbitmq-server.service 

MQ--1( Message queuing)>>>>RabbitMQ_第9张图片
刷新重新登入:
MQ--1( Message queuing)>>>>RabbitMQ_第10张图片
创建用户:
可以直接在web操作端中的Admin中创建新的用户
MQ--1( Message queuing)>>>>RabbitMQ_第11张图片
也可以通过命令行的方式创建用户,但是默认是没有权限的,权限需要重新用命令行进行授权:

root@MQ-server1:~# rabbitmqctl  add_user user2 123456
Adding user "user2" ...

root@MQ-server1:~# rabbitmqctl set_permissions user2 ".*" ".*" ".*"
Setting permissions for user "user2" in vhost "/" ...

.*代表全部权限 每一个对应表示下面的配置 写 和读
MQ--1( Message queuing)>>>>RabbitMQ_第12张图片

1.4 RabbitMQ 集群部署

Rabbitmq集群 分为二种方式:

普通模式:创建好 RabbitMQ 之后的默认模式 。
镜像模式:把需要的队列做成镜像队列。

普通集群模式:
queue 创建之后,如果没有其它 policy ,消息实体只存在于其中一个节点, A 、 B 两个 Rabbitmq 节点仅有相同的元数据 ,即队列结构,但队列的数据仅保存有一份,即创建该队列的 rabbitmq 节点( A 节点),当消息进入 A 节点的 Queue 中后, consumer 从 B 节点拉取时, RabbitMQ 会临时在 A 、 B 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer ,所以 consumer 可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后, B节点无法取到 A 节点中还未消费的消息实体。
一个消息只能被消费者消费一次
消息消费在同一个mq是不会重复被消费

镜像集群模式:
把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ 的 HA 方案(镜像模式是在普通模式的基础上,增加一 些镜像策略)该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,
集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy ,然后客户端创建队列的时候, rabbitmq 集群根据“队列名称”自动设置是普通集群模式或镜像队列。

集群中有两种节点类型:
内存节点:只将数据保存到内存 内存节点断电之后会丢失 磁盘节点不会断电丢失
磁盘节点:保存数据到内存和磁盘。
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了。如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失。

推荐设计架构:
在一个 rabbitmq 集群里,有 3 台 或以上机器,其中 1 台使用磁盘模式,其它节点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作为数据备份使用。

1.4.1Ubuntu 1804 安装集群版 RabbitMQ

集群环境 三台服务器具体 IP 如下
172.18.0.51
172.18.0.52
172.18.0.53

实验:
172.20.10.100 MQ-server1.kaivi.tech
172.20.10.101 MQ-server2.kaivi.tech
172.20.10.102 MQ-server3.kaivi.tech

1.4.1.1 主机名解析配置

各 MQ 服务器配置本地 主机名解析:
172.18.0.51 mq server1 mq server1.magedu.net
172.18.0.52 mq server2 mq server2.magedu.net
172.18.0.53 mq server3 mq server3.magedu.net

实验:
集群中的每一台服务器都配置一样的本地主机名解析

root@MQ-serverx:~# vim /etc/hosts
root@MQ-serverx:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	ubuntu-server

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.10.100 MQ-server1 MQ-server1.kaivi.tech
172.20.10.101 MQ-server2 MQ-server2.kaivi.tech
172.20.10.102 MQ-server3 MQ-server3.kaivi.tech

1.4.1. 2 :各服务器安装 RabbitMQ

各 RabbitMQ 服务器安装 基础命令及添加 key
#sudo apt get install curl gnupg
# curl -fsSL https://github.com/rabbitmq/signing-
keys/releases/download/2.0/rabbitmq release signing key.asc | sudo apt key add
OK

各 RabbitMQ 安装 apt HTTPS 传输
# sudo apt get install apt transport https

各 RabbitMQ 服务器添加 apt 源
sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <<EOF
## Installs the latest Erlang 22.x release.
## Change component to "erlang 21.x" to install the latest 21.x version.
## "bionic" as distribution name should work for any later Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn
more.
deb https://dl.bintray.com/rabbitmq erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
EOF

各 RabbitMQ 更新软件包列表并执行安装:
# sudo apt get update
# apt cache madison rabbitmq-server 查看可以安装的版本
apt install rabbitmq-server=3.7.22 1 安装较新版本的 RabbitMQ

实验:
https://www.rabbitmq.com/install-debian.html #集群安装部署参考
这里直接用脚本的方式安装,在每一个服务其中创建一个脚本文件,然后运行安装即可:

#!/bin/sh

## If sudo is not available on the system,
## uncomment the line below to install it
# apt-get install -y sudo

sudo apt-get update -y

## Install prerequisites
sudo apt-get install curl gnupg -y

## Install RabbitMQ signing key
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

## Install apt HTTPS transport
sudo apt-get install apt-transport-https

## Add Bintray repositories that provision latest RabbitMQ and Erlang 21.x releases
sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <<EOF
## Installs the latest Erlang 22.x release.
## Change component to "erlang-21.x" to install the latest 21.x version.
## "bionic" as distribution name should work for any later Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
EOF

## Update package indices
sudo apt-get update -y

## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing

安装完成
MQ--1( Message queuing)>>>>RabbitMQ_第13张图片

1.4.1.3 启动 RabbitMQ 服务

Server1
root@mq server1:~# systemctl enable rabbitmq server
root@mq server1:~# sys temctl start rabbitmq server

Server2
root@mq server2:~# systemctl start rabbitmq server
root@mq server2:~# systemctl enable rabbitmq server

Server3
root@mq server3:~# systemctl start rabbitmq server
root@mq server3:~# systemctl enable rabbitm q server

1.4.1.4 :创建 Rabbit MQ 集群

Rabbitmq的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境 而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限 所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。

1.4.1.4.1 :各服务器关闭 RabbitMQ

拷贝同步之前需要把各个服务器的rabbitmq关闭,这样相对来说安全些

root@MQ-server1:~# systemctl stop rabbitmq-server.service
root@MQ-server2:~# systemctl stop rabbitmq-server.service 
root@MQ-server3:~# systemctl stop rabbitmq-server.service


在 mq server1 同步 .erlang.cookie 至其他两台服务器
# scp /var/lib/rabbitmq/.erlang.cookie 172.18.0.52:/var/lib/rabbitmq/.erlang.cookie

# scp /var/lib/rabbitmq/.erlang.cookie 172.18.0.53:/var/lib/rabbitmq/.erlang.cookie
1.4.1.4.2 各服务器启动 RabbitMQ

打开web插件以及允许用户远程访问

root@MQ-server1:~# rabbitmq-plugins enable rabbitmq_management 
root@MQ-server2:~# rabbitmq-plugins enable rabbitmq_management 
root@MQ-server3:~# rabbitmq-plugins enable rabbitmq_management 

打开每一个服务器的除了本机的远程访问

root@MQ-serverX:~# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.3/ebin/rabbit.app 
39行   {loopback_users, []},  #把中括号里面的<<"guest">>删除即可
root@MQ-server1:~# systemctl restart rabbitmq-server.service
root@MQ-server2:~# systemctl restart rabbitmq-server.service 
root@MQ-server3:~# systemctl restart rabbitmq-server.service

验证集群中的erlang.cookie是否全部一致

cat /var/lib/rabbitmq/.erlang.cookie 
AQMGTUCQYQKQYXZUIDPT
1.4.1.4.3 查看当前集群状态

这个是3.7.X版本的返回状态的结果

root@mq server1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq server1 ...
[{nodes,[{disc,['rabbit@mq server1']}]}, #磁盘
{running_nodes,['rabbit@mq server1']},
{cluster_name,<<"rabbit@mq server1">>},
{partitions,[]},
{alarms,[{'rabbit@mq server1',[]}]}]

root@mq server2:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq server2 ...
[{nodes,[{disc,['rabbit@mq server2']}]},
{running_nodes,['rabbit@mq server2']},
{cluster_name,<<"rabbit@mq server2
{partitions,[]},
{alarms,[{'rabbit@mq server2',[]}]}]

root@mq server3:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq server3 ...
[{nodes,[{disc,['rabbit@mq server3']}]},
{running_nodes,['rabbit@mq server3']},
{cluster_name,<<"ra bbit@mq server3">>},
{partitions,[]},
{alarms,[{'rabbit@mq server3',[]}]}]

3.8.x版本返回集群的状态:

root@MQ-server1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@MQ-server1 ...
Basics

Cluster name: rabbit@MQ-server1

Disk Nodes

rabbit@MQ-server1

Running Nodes

rabbit@MQ-server1

Versions

rabbit@MQ-server1: RabbitMQ 3.8.3 on Erlang 22.3

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@MQ-server1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@MQ-server1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@MQ-server1, interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

1.4.1.4.4 :创建 RabbitMQ 集群:

在mq server1 作为内存节点连接起来,并作为内存节点,在 mq server1 执行以下命令:
被加入的节点数据需要清空 没有其他的节点
这里把mq serer1 和mq serer2 节点加到mq server3中

root@mq server1:~# rabbitmqctl stop_app  #停止 app 服务
root@mq server1:~# rabbitmqctl reset  #清空元数据
Resetting node rabbit@mq server1 ...

#将rabbitmq server1 添加到集群当中,并成为内存节点,不加 --ram 默认是磁盘节点
加了--ram 表示作为内存节点
root@mq server1:~# rabbitmqctl join_cluster rabbit@mq-server3 --ram
Clustering node rabbit@mq server1 with rabbit@mq server3  #rabbit不是用户而已一种协议 后面是可以解析的短域名

root@mq server1:~# rabbitmqctl start_app #启动app服务
Starting node rabbit@mq server1 ...
completed with 3 plugins.

在mq server2 作为内存节点连接起来,并作为内存节点,在 mq server2 执行以下命令:

root@mq server2:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq server2 ...

root@mq server2:~# rabbitmqctl reset 
Resett ing node rabbit@mq server2 ...

root@mq server2:~# rabbitmqctl join_cluster rabbit@mq-server3 --ram
Clustering node rabbit@mq server2 with rabbit@mq server3

root@mq server2:~# rabbitmqctl start_app
Starting node rabbit@mq server2 ...
completed with 0 p lugins.

启动插件不需要重启服务

实验:
在mq server1 作为内存节点连接起来,并作为内存节点,在 mq server1 执行以下命令

root@MQ-server1:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@MQ-server1 ...

root@MQ-server1:~# rabbitmqctl reset
Resetting node rabbit@MQ-server1 ...

root@MQ-server1:~# id rabbitmq  #存在一个用户叫做rabbitmq
uid=113(rabbitmq) gid=116(rabbitmq) groups=116(rabbitmq)

root@MQ-server1:~# rabbitmqctl join_cluster rabbit@MQ-server3 --ram 
Clustering node rabbit@MQ-server1 with rabbit@MQ-server3

root@MQ-server1:~# rabbitmqctl start_app

在mq server2 作为内存节点连接起来,并作为内存节点,在 mq server2 执行以下命令

root@MQ-server2:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@MQ-server2 ...
root@MQ-server2:~# rabbitmqctl reset
Resetting node rabbit@MQ-server2 ...
root@MQ-server2:~# rabbitmqctl join_cluster rabbit@MQ-server3 --ram 
Clustering node rabbit@MQ-server2 with rabbit@MQ-server3
root@MQ-server2:~# rabbitmqctl start_app
Starting node rabbit@MQ-server2 ...
 completed with 3 plugins.
root@MQ-server2:~# 

查看web管理界面:
MQ--1( Message queuing)>>>>RabbitMQ_第14张图片
如果没有显式信息,中间绿色部分是黄色,那就是明天开启web插件

1.4.1.4.5:将集群设置为镜像模式

只要在其中一台节点执行以下命令即可:

root@mq server1:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

实验:
镜像模式需要设置一个策略即可:

root@MQ-server2:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

这样之后数据会自动同步到其他的节点
可以在MQ-server3 中创建一个账号 然后再MQ-server1中查看是否同步

1.4.1.4.6 验证当前集群状态:

这个是3.7.X版本的返回状态的结果

root@mq server1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq server1 ...
[{nodes,[{disc,['rabbit@mq server3']}, #集群中至少有一个节点是磁盘节点用于数据持久化
{ram,['rabbit@mq server2','rabbit@mq server1']}]}, #集群中的内存节点
{running_nodes,['rabbit@mq server2','rabbit@mq server3','r abbit@mq server1']},
{cluster_name,<<"rabbit@mq server3">>}, #当前正在运行的节点
{partitio ns,[]},
{alarms,[{'rabbit@mq server2',[]},
		{'rabbit@mq server3',[]},
		{'rabbit@mq server1',[]}]}]

这个是3.8.X版本的返回状态的结果

root@MQ-server1:~# rabbitmqctl cluster_status
Cluster status of node rabbit@MQ-server1 ...
Basics

Cluster name: rabbit@MQ-server1

Disk Nodes

rabbit@MQ-server3

RAM Nodes

rabbit@MQ-server1
rabbit@MQ-server2

Running Nodes

rabbit@MQ-server1
rabbit@MQ-server2
rabbit@MQ-server3

Versions

rabbit@MQ-server1: RabbitMQ 3.8.3 on Erlang 22.3
rabbit@MQ-server2: RabbitMQ 3.8.3 on Erlang 22.3
rabbit@MQ-server3: RabbitMQ 3.8.3 on Erlang 22.3

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@MQ-server1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@MQ-server1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@MQ-server1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@MQ-server2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@MQ-server2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@MQ-server2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@MQ-server3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@MQ-server3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@MQ-server3, interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

1.4.2 web 界面验证集群状态

1.4.2.1 web 界面验证当 前集群状态:

不启用 web 插件的 rabbitmq 服务器 会在 web 节点提示 节点统计信息不可用
Node statistics not available
MQ--1( Message queuing)>>>>RabbitMQ_第15张图片

1.2.2 各服务器启动 web 插件

root@mq server2:~# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@mq server2:
rabbitmq_management
The following plugins have b een configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@mq server2...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch

started 3 plugins.

root@mq server3:~# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@mq server3:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_ web_dispatch
Applying plugin configuration to rabbit@mq server3...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch

started 3 plugins.

1.4.2.3 开启 web 插件后的集群状态

MQ--1( Message queuing)>>>>RabbitMQ_第16张图片

1.5 Rabbit MQ 常用命令

创建 vhost  #一般开发去加
root@mq server1:~# rabbitmqctl add_vhost magedu
Adding vhost "magedu" ...

列出所有 vhost
root@mq server1:~# rabbitmqctl list_vhosts
Listing vhosts ...
name
magedu
/
列出所有队列
root@mq server1:~# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing q ueues for vhost / ...

删除指定 vhost
root@mq server1:~# rabbitmqctl delete_vhost magedu
Deleting vhost "magedu" ...

添加账户 jack 密码为 123456
root@mq server1:~# rabbitmqctl add_user jack 123456
Adding user "jack" ...

更改用户密码
root@mq server1:~# rabbitmqctl change_password jack 654321
Changing password for user "jack" ...

设置 jack 用户对 magedu 的 vhost 有读写权限 ,三个点为配置、读和写
root@mq-server1:~# rabbitmqctl set_permissions -p magedu jack ".*" ".*" ".*"
Setting permissions for user "jack" in vhost "magedu" ...

root@mq-server1:~# rabbitmqctl list_users
Listing users ...
user	tags
guest	[administrator]
duanxin	[administrator]

MQ--1( Message queuing)>>>>RabbitMQ_第17张图片

1.7 Rabbitmq API

https://rawcdn.githack.com/rabbitmq/rabbitmq-management/rabbitmq_v3_6_9/priv/www/api/index.html

1.7.1 集群状态监控

#!/bin/env python
#coding:utf 8
#Author: ZhangJie
import subprocess
running_list = []
error_list = []
false = "false"
true = "true"
def get_status():
obj = subprocess.Popen(("curl -s -u guest:guest
http://localhost:15672/a pi/nodes &> /dev/null"), shell=True,
stdout=subprocess.PIPE)  #通过root@MQ-server3:~# curl -s -u guest:guest http://localhost:15672/api/vhosts 来进行查找
data = obj.stdout.read()
data1 = eval(data)
for i in data1:
if i.get("running") == "true":
running_list.append(i.get("name"))
el se:
error_list.append(i.get("name"))
def count_server():
if len(running_list) < 3: # 可以判断错误列表大于 0 或者运行列表小于 3 3
未总计的节点数量
print(101) # 100 就是集群内有节点运行不正常了
else:
print(50) # 50 为所有节点全部运行正常
def main():
get_status()
count_server()
if __name__ == "__main__":
main()

######################################################################################

cat rabbitmq-monitor.py
#!/bin/env python
#coding:utf 8
#Author: ZhangJie
import subprocess

running_list = []
error_list = []
false = "false"
true = "true"

def get_status():
    obj = subprocess.Popen(("curl -s -u guest:guest http://localhost:15672/api/nodes &> /dev/null"), shell=True,stdout=subprocess.PIPE) 
     #通过root@MQ-server3:~# curl -s -u guest:guest http://localhost:15672/api/vhosts 来进行查找
    data = obj.stdout.read()
    data1 = eval(data)
    for i in data1:
        if i.get("running") == "true":
            running_list.append(i.get("name"))
        else:
            error_list.append(i.get("name"))

def count_server():
    if len(running_list) < 3: # 可以判断错误列表大于 0 或者运行列表小于 3 3未总计的节点数量
        print(100) # 100 就是集群内有节点运行不正常了
    else:
        print(50) # 50 为所有节点全部运行正常

def main():
    get_status()
    count_server()

if __name__ == "__main__":
    main()
root@MQ-server2:~# python3 rabbitmq-monitor.py  #节点失效
100
root@MQ-server2:~# python3 rabbitmq-monitor.py  #节点正常
50

1.7.2 内存使用监控

# cat rabbitmq_memory.py
#!/bin/env python
#coding:utf 8
#Author: ZhangJie
import subprocess
import sys
running_list = []
error_list = []
false = "false"
true = "true"
def get_status():
obj = subprocess.Popen(("curl s u guest:guest
http://localhost:15672/api/nodes &> /dev/null"), shell=True,
stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
#print(
for i in data1:
if i.get("name") == sys.argv[1]:
print(i.get("mem_used"))
def main():
get_status()
if __name__ == "__main__":
main()
root@mq server3:~# python3 rabbitmq_memory.py rabbit@mq server1
85774336
root@mq server3:~# python3 rabbitmq_memory.py rabbit@mq server2
91099136
root@mq server3:~# python3 rabbitmq_memory.py rabbit@mq server3
96428032

################################################################################################

#!/bin/env python
#coding:utf 8
#Author: ZhangJie
import subprocess
import sys

running_list = []
error_list = []
false = "false"
true = "true"


def get_status():
    obj = subprocess.Popen(("curl -s -u guest:guest http://localhost:15672/api/nodes &> /dev/null"), shell=True,stdout=subprocess.PIPE)
    data = obj.stdout.read()
    data1 = eval(data)
    for i in data1:
        if i.get("name") == sys.argv[1]:
            print(i.get("mem_used"))
            
def main():
    get_status()

if __name__ == "__main__":
    main()

root@MQ-server1:~# python3 rabbitmq-menmory.py rabbit@MQ-server1  #需要传参数
88158208
root@MQ-server1:~# python3 rabbitmq-menmory.py rabbit@MQ-server2
89165824
root@MQ-server1:~# python3 rabbitmq-menmory.py rabbit@MQ-server3
86065152

你可能感兴趣的:(MQ----RABBITMQ)