RabbitMQ环境部署(Windows、单机、Docker、集群)

一、windows安装

1.1、erlang下载

erlang下载页面:https://www.erlang.org/downloads
erlang下载地址:https://erlang.org/download/otp_win64_24.0.exe

直接下一步安装 即可,遇到下图安装visual C++
请添加图片描述
安装完成配置环境变量
在这里插入图片描述
并在Path中添加%ERLANG_HOME%\bin
在这里插入图片描述
验证
配置完环境变量后,win + R 运行cmd,打开命令行,输入erl,回车

输入1 + 1 .加上 . (英文句号),再输入回车,出现结果2
在这里插入图片描述

1.2、rabbitmq下载

rabbitmq下载页面:https://www.rabbitmq.com/download.html
rabbitmq下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.5/rabbitmq-server-windows-3.9.5.zip
解压后 双击sbin下的rabbitmq-server.bat文件,启动
访问:http://127.0.0.1:15672/
用户guest
密码guest

二、Linux安装

2.1、erlang安装

rabbitmq是erlang语言编写的,安装rabbitmq之前,需要先安装erlang,这里用erlang的源码进行安装,erlang安装包官网下载地址:https://github.com/erlang/otp/releases/

# 先安装以下依赖包
yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel

## 新建rabbitmq文件夹
mkdir /opt/home/rabbitmq

## 切换rabbitmq文件夹
cd /opt/home/rabbitmq/

## wget 下载
wget https://github.com/erlang/otp/releases/download/OTP-24.0.5/otp_src_24.0.5.tar.gz

## 解压
tar -zxvf otp_src_24.0.5.tar.gz

## 切换到otp_src_24.0.5文件夹
cd otp_src_24.0.5/

# 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/opt/home/rabbitmq/erlang中,方便查找和使用。
mkdir /opt/home/rabbitmq/erlang

## ./configure --prefix=/opt/home/rabbitmq/erlang
## 参数说明:

## --prefix:			 指定安装目录
## --with-ssl:		 	 使用SSL包,openssl的扩展库
## --enable-threads:	 启用异步线程支持
## --enable-smp-support:启用对称多处理支持(Symmetric Multi-Processing对称多处理结构的简称)
## --enable-kernel-poll:启用Linux内核poll
## --enable-hipe:		 启用高性能Erlang
## --enable-sctp:		 启用流控制协议支持(Stream Control Transmission Protocol,流控制传输协议)

./configure --prefix=/opt/home/rabbitmq/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac

# 然后,直接执行make && makeinstall 进行编译安装
make && make install

# 添加环境变量 将/opt/home/rabbitmq/erlang/bin这个文件夹加入到环境变量中
vi /etc/profile

# 添加如下内容
# erlang
ERL_PATH=/opt/home/rabbitmq/erlang/bin
PATH=$ERL_PATH:$PATH
 
## 使配置生效
source /etc/profile

# 查看erlang版本
erl -version

2.2、rabbitmq安装

官网地址:https://www.rabbitmq.com/

下载地址:https://www.rabbitmq.com/download.html

## wget下载
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.8/rabbitmq-server-generic-unix-3.9.8.tar.xz

# 解压
tar -xvf rabbitmq-server-generic-unix-3.9.8.tar.xz 

## 添加环境变量
vi /etc/profile

## 添加以下内容
# rabbitmq
RABBIT_MQ_PATH=/opt/home/rabbitmq/rabbitmq_server-3.9.8/sbin
PATH=$RABBIT_MQ_PATH:$PATH

## 重载一下环境变量
source /etc/profile
 
## 查看插件列表
# {:query, :"rabbit@CentOS8-2", {:badrpc, :timeout}} 	# 如果出现这种提示,修改hostname,重启系统
rabbitmq-plugins list

## 添加web管理插件
rabbitmq-plugins enable rabbitmq_management

# 后台启动rabbitmq服务
rabbitmq-server -detached

访问http://192.168.0.3:15672/
默认用户名密码 guest/guest
web访问入口guest用户登录问题,报错是用户只能通过本地主机登录
在这里插入图片描述
第一种解决方式

只能本机通过localhost方式访问了,一般不安装图形界面,所以这个基本不会选择

第二种解决方式

## 创建用户
rabbitmqctl add_user java521 java521

## 添加权限,赋予用户默认vhose的全部操作权限:
rabbitmqctl set_permissions -p / java521 ".*" ".*" ".*"

## 修改用户角色,设置为管理员
rabbitmqctl set_user_tags java521 administrator
# 不用重启服务,直接访问即可。

在这里插入图片描述
总的来说,使用Web UI已经非常方便了,可以实现基本常用的管理操作。当然除了用Web UI,还有用命令行

常用的一些命令行操作:

## 服务启动停止:
# 服务启动: 
rabbitmq-server -detached

#服务停止: 
rabbitmqctl stop

## 插件管理:
# 插件列表: 
rabbitmq-plugins list 

# 启动插件: 
rabbitmq-plugins enable XXX   #(XXX为插件名)

# 停用插件: 
rabbitmq-plugins disable XXX


## 用户管理:
# 添加用户: 
rabbitmqctl add_user username password

# 删除用户:
rabbitmqctl delete_user username

# 修改密码: 
rabbitmqctl change_password username newpassword

# 设置用户角色: 
rabbitmqctl set_user_tags username tag

# 列出用户: 
rabbitmqctl list_users


## 权限管理:
# 列出所有用户权限: 
rabbitmqctl list_permissions

# 查看制定用户权限: 
rabbitmqctl list_user_permissions username

# 清除用户权限: 
rabbitmqctl clear_permissions [-p vhostpath] username

# 设置用户权限: 
# conf: 一个正则匹配哪些资源能被该用户访问
# write:一个正则匹配哪些资源能被该用户写入
# read:一个正则匹配哪些资源能被该用户读取
rabbitmqctl set_permissions [-p vhostpath] username conf write read

三、Docker安装

## 在线拉取镜像
docker pull rabbitmq

## 安装MQ
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

## 指定用户名 密码 虚拟主机
docker run -it --rm --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --hostname mq1 -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

## 如果无法访问 http://192.168.0.3:15672/

## 进入mq容器
docker exec -it mq bash

## 进入后执行
rabbitmq-plugins enable rabbitmq_management

就可以正常访问了

四、集群部署

官方文档:https://www.rabbitmq.com/clustering.html
实验环境:

主机名 操作系统 IP地址 用途
CentOS8-1 CentOS8 192.168.0.3 磁盘节
CentOS8-2 CentOS8 192.168.0.4 内存节点
CentOS8-3 CentOS8 192.168.0.5 内存节点

4.1、初始化环境

分别修改主机名为CentOS8-1、CentOS8-2、CentOS8-3

vi /etc/hostname

按照单机部署的方式

修改三台服务器的hosts文件

vi /etc/hosts

## 记得改成自己的ip地址和主机名
cat >> /etc/hosts <<EOF
192.168.0.3 CentOS8-1
192.168.0.4 CentOS8-2
192.168.0.5 CentOS8-3
EOF

4.2、配置 Erlang Cookie

CentOS8-1上的.erlang.cookie文件拷贝到其他两台主机上。该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。

RabbitMQ 服务启动时,erlang VM 会自动创建该 cookie 文件,默认的存储路径为 /var/lib/rabbitmq/.erlang.cookie$HOME/.erlang.cookie,该文件是一个隐藏文件,需要使用 ls -al 命令查看。(拷贝.cookie时,各节点都必须停止MQ服务)

## # 停止所有服务,构建Erlang的集群环境
rabbitmqctl stop

## 复制文件
scp /root/.erlang.cookie [email protected]:/root
scp /root/.erlang.cookie [email protected]:/root

[root@CentOS8-1 ~]# scp /root/.erlang.cookie [email protected]:/root
The authenticity of host '192.168.0.4 (192.168.0.4)' can't be established.
ECDSA key fingerprint is SHA256:O2JGlpOuPjzaXTTknt0fySaZfBVLOv5tvpN9jxCiff4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.4' (ECDSA) to the list of known hosts.
[email protected]'s password: 
.erlang.cookie                                                                                                             100%   20     3.4KB/s   00:00    
[root@CentOS8-1 ~]# scp /root/.erlang.cookie [email protected]:/root
The authenticity of host '192.168.0.5 (192.168.0.5)' can't be established.
ECDSA key fingerprint is SHA256:xx9oKlGfPwTbHLYi7Yw1VThpF2MwYsU9uzxgRXyZFlI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.5' (ECDSA) to the list of known hosts.
[email protected]'s password: 
.erlang.cookie 

由于你可能在三台主机上使用不同的账户进行操作,为避免后面出现权限不足的问题,这里建议将 cookie 文件原来的 400 权限改为 600,命令如下:

chmod 600 /root/.erlang.cookie

4.3、启动服务

rabbitmq-server -detached

4.4、集群搭建

RabbitMQ 集群的搭建需要选择其中任意一个节点为基准,将其它节点逐步加入。这里我们以CentOS8-1为基准节点,将CentOS8-2和CentOS8-3加入集群。在CentOS8-2和CentOS8-3上执行以下命令:

# 1.停止服务
rabbitmqctl stop_app

# 2.重置状态
rabbitmqctl reset

# 3.节点加入, 在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app
rabbitmqctl join_cluster rabbit@CentOS8-1

# 4.启动服务
rabbitmqctl start_app

join_cluster 命令有一个可选的参数 --ram ,该参数代表新加入的节点是内存节点,默认是磁盘节点。如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。除非是将 RabbitMQ 用于 RPC 这种需要超低延迟的场景,否则在大多数情况下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的形式。

另外,如果节点以磁盘节点的形式加入,则需要先使用 reset 命令进行重置,然后才能加入现有群集,重置节点会删除该节点上存在的所有的历史资源和数据。采用内存节点的形式加入时可以略过 reset 这一步,因为内存上的数据本身就不是持久化的。

4.5、查看集群状态

搭建成功后,此时可以在任意节点上使用rabbitmqctl cluster_status命令查看集群状态

## 验证集群状态
rabbitmqctl cluster_status

输出如下:

[root@CentOS8-3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@CentOS8-3 ...
Basics

Cluster name: rabbit@CentOS8-3

Disk Nodes

rabbit@CentOS8-1
rabbit@CentOS8-2
rabbit@CentOS8-3

Running Nodes

rabbit@CentOS8-1
rabbit@CentOS8-2
rabbit@CentOS8-3

Versions

rabbit@CentOS8-1: RabbitMQ 3.9.8 on Erlang 24.0.5
rabbit@CentOS8-2: RabbitMQ 3.9.8 on Erlang 24.0.5
rabbit@CentOS8-3: RabbitMQ 3.9.8 on Erlang 24.0.5

Maintenance status

Node: rabbit@CentOS8-1, status: not under maintenance
Node: rabbit@CentOS8-2, status: not under maintenance
Node: rabbit@CentOS8-3, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

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

Feature flags

Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: stream_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

可以看到Disk Nodes下显示了全部节点的信息,节点都是 disc (磁盘节点),此时代表集群已经搭建成功,默认的名字为Cluster name: rabbit@CentOS8-1,如果你想进行修改,可以使用以下命令

rabbitmqctl set_cluster_name my_rabbitmq_cluster

4.6、UI界面查看

在这里插入图片描述

4.7、配置镜像队列

4.7.1、开启镜像队列

这里我们为所有队列开启镜像配置,其语法如下:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

4.7.2、复制系数

在上面我们指定了 ha-mode 的值为 all ,代表消息会被同步到所有节点的相同队列中。这里我们之所以这样配置,因为我们本身只有三个节点,因此复制操作的性能开销比较小。如果你的集群有很多节点,那么此时复制的性能开销就比较大,此时需要选择合适的复制系数。通常可以遵循过半写原则,即对于一个节点数为 n 的集群,只需要同步到 n/2+1 个节点上即可。此时需要同时修改镜像策略为 exactly,并指定复制系数 ha-params,示例命令如下:

rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

除此之外,RabbitMQ 还支持使用正则表达式来过滤需要进行镜像操作的队列,示例如下:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

此时只会对 ha 开头的队列进行镜像。更多镜像队列的配置说明,可以参考官方文档:Highly Available (Mirrored) Queues

4.7.3、查看镜像状态

配置完成后,可以通过 Web UI 界面查看任意队列的镜像状态,情况如下
在这里插入图片描述

4.8、集群的关闭与重启

没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。

这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 CentOS8-1,CentOS8-2,CentOS8-3,如果CentOS8-1因为故障暂时没法恢复,此时CentOS8-2和CentOS8-3就无法启动。想要解决这个问题,可以先将CentOS8-1节点进行剔除,命令如下:

rabbitmqctl forget_cluster_node rabbit@CentOS8-1 --offline

此时需要加上 -offline 参数,它允许节点在自身没有启动的情况下将其他节点剔除。

4.9、解除集群

重置当前节点

# 1.停止服务
rabbitmqctl stop_app
# 2.重置集群状态
rabbitmqctl reset
# 3.重启服务
rabbitmqctl start_app

重新加入集群

# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@CentOS8-1
# 4.重启服务
rabbitmqctl start_app

完成后重新检查 RabbitMQ 集群状态

rabbitmqctl cluster_status

除了在当前节点重置集群外,还可在集群其他正常节点将节点踢出集群

rabbitmqctl forget_cluster_node rabbit@CentOS8-1

4.10、变更节点类型

我们可以将节点的类型从RAM更改为Disk,反之亦然。假设我们想要反转rabbit@CentOS8-1和rabbit@CentOS8-2的类型,从磁盘节点转换为RAM节点。为此,我们可以使用change_cluster_node_type命令。必须首先停止节点。

# 1.停止服务
rabbitmqctl stop_app
# 2.变更类型 ram disc
rabbitmqctl change_cluster_node_type ram 
# 3.重启服务
rabbitmqctl start_app

猜你喜欢

转载自blog.csdn.net/qq_37242720/article/details/120995380