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
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
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 -p /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
官网地址: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 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 | 内存节点 |
分别修改主机名为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
将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
rabbitmq-server -detached
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 这一步,因为内存上的数据本身就不是持久化的。
搭建成功后,此时可以在任意节点上使用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
需要重新设置用户
## 创建账号
rabbitmqctl add_user admin admin
## 设置用户角色
rabbitmqctl set_user_tags admin administrator
## 设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
这里我们为所有队列开启镜像配置,其语法如下:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
在上面我们指定了 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
配置完成后,可以通过 Web UI 界面查看任意队列的镜像状态,情况如下
没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 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 参数,它允许节点在自身没有启动的情况下将其他节点剔除。
重置当前节点
# 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
我们可以将节点的类型从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