- 一、windows安装
- 1.1、erlang下载
- 1.2、rabbitmq下载
- 二、Linux安装
- 2.1、erlang安装
- 2.2、rabbitmq安装
- 三、Docker安装
- 四、集群部署
- 4.1、初始化环境
- 4.2、配置 Erlang cookie
- 4.3、启动服务
- 4.4、集群搭建
- 4.5、查看集群状态
- 4.6、UI界面查看
- 4.7、配置镜像队列
- 4.7.1、开启镜像队列
- 4.7.2、复制系数
- 4.7.3、查看镜像状态
- 4.8、集群的关闭与重启
- 4.9、解除集群
- 4.10、变更节点类型
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 /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 -version2.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 | 内存节点 |
分别修改主机名为CentOS8-1、CentOS8-2、CentOS8-3
vi /etc/hostname
按照单机部署的方式
修改三台服务器的hosts文件
vi /etc/hosts ## 记得改成自己的ip地址和主机名 cat >> /etc/hosts <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 root@192.168.0.4:/root scp /root/.erlang.cookie root@192.168.0.5:/root [root@CentOS8-1 ~]# scp /root/.erlang.cookie root@192.168.0.4:/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. root@192.168.0.4's password: .erlang.cookie 100% 20 3.4KB/s 00:00 [root@CentOS8-1 ~]# scp /root/.erlang.cookie root@192.168.0.5:/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. root@192.168.0.5's password: .erlang.cookie由于你可能在三台主机上使用不同的账户进行操作,为避免后面出现权限不足的问题,这里建议将 cookie 文件原来的 400 权限改为 600,命令如下:
chmod 600 /root/.erlang.cookie4.3、启动服务rabbitmq-server -detached4.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_appjoin_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_cluster4.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-14.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



