前言
最近项目需要用到这个RabbitMQ消息队列,于是尝试先在本地环境下安装 RabbitMQ 试试水。
一、RabbitMQ 介绍
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。
1.RabbitMQ 模式
(1)单一模式:最简单的情况,非集群模式,即单实例服务。
(2)普通模式:即默认的集群模式
将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用。因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了,如果消息队列没做持久化,那么消息就丢了。
(3)镜像模式
Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。
2.RabbitMQ 节点类型
(1)内存节点:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得交换机和队列声明等操作速度更快。
(2)磁盘节点:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。
二、RabbitMQ 安装
1.在 Linux 环境下离线安装 RabbitMQ
(1)首先查看 Linux 内核版本,确定是 Ubuntu 还是 CentOS 版本,其实只要是离线安装,即源码安装,就是终极大法,通用的,这一步直接跳过即可;
root@hostvm-ubuntu16:~# uname -a
Linux hostvm-ubuntu16 4.4.0-124-generic #148-Ubuntu SMP Wed May 2 13:00:18 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
(2)前往 Erlang 官网下载 Erlang/OTP 工具包,并且安装,如下载当前最新的 Erlang/OTP 25.0.4 版本,得到 otp_src_25.0.4.tar.gz 压缩包;
传送门:25 - Erlang/OTP
(3)在虚拟机创建安装工具包目录,将压缩包上传到该目录,上传完成则进入该目录,解压文件;
root@hostvm-ubuntu16:/# mkdir /安装工具包
# ...
root@hostvm-ubuntu16:/# cd /安装工具包
root@hostvm-ubuntu16:/安装工具包# tar -zxvf otp_src_25.0.4.tar.gz
(4)编译安装Erlang/OTP 25.0.4,再创建一个软连接,注意软连接的地址,查看是【/home/erlang/bin/erl】还是【/home/erlang/lib/erlang/bin/erl】,最后验证是否安装成功;
root@hostvm-ubuntu16:/安装工具包# cd /安装工具包/otp_src_25.0.4/
root@hostvm-ubuntu16:/安装工具包/otp_src_25.0.4# ./configure --prefix=/home/erlang -without-javac
root@hostvm-ubuntu16:/安装工具包/otp_src_25.0.4# make
root@hostvm-ubuntu16:/安装工具包/otp_src_25.0.4# make install
root@hostvm-ubuntu16:/安装工具包/otp_src_25.0.4# ln -s /home/erlang/lib/erlang/bin/erl /usr/bin/erl
root@hostvm-ubuntu16:/安装工具包/otp_src_25.0.4# erl
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
Eshell V13.0.4 (abort with ^G)
1> OK
(5)前往 RabbitMQ 官网下载 RabbitMQ服务程序,如下载当前最新的 Erlang/OTP 25.0.4 版本对应的 RabbitMQ,得到 rabbitmq-server-generic-unix-3.10.7.tar 压缩包;
(6)将压缩包在本地解压,上传到虚拟机 home 目录,进入 rabbitmq_server-3.10.7 目录,vi配置一下环境,最后一行加入 export PATH=$PATH:/home/rabbitmq_server-3.10.7/sbin/ ,刷新配置,最后启动服务,如此就安装完成啦;
# ...
root@hostvm-ubuntu16:/# cd /home/rabbitmq_server-3.10.7/
root@hostvm-ubuntu16:/home/rabbitmq_server-3.10.7# vim /etc/profile
root@hostvm-ubuntu16:/home/rabbitmq_server-3.10.7# source /etc/profile
# 启动服务
root@hostvm-ubuntu16:/home/rabbitmq_server-3.10.7# rabbitmq-server -detached
(7)若出现 Permission denied 问题,导致无法启动,可能是在 /home/rabbitmq_server-3.10.7/sbin/ 目录下的 rabbitmq-server 等组件未设置成可读可写可执行的权限;
(8)RabbitMQ的查看服务、停止服务、重启服务并后台运行、允许 Web 访问服务、查看 RabbitMQ 进程状态等命令
# 查看服务
Linux-SUSE12SP5:~ # cd /home/rabbitmq_server-3.10.7/sbin/
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmqctl status
# 停止服务
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmqctl stop
Stopping and halting node rabbit@Linux-SUSE12SP5 ...
# 重启服务并后台运行
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmq-server -detached
# 允许 Web 访问服务
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmq-plugins enable rabbitmq_management
# 使用 ps -ef|grep rabbit 查看 RabbitMQ 进程状态
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # ps -ef|grep rabbit
(9)Web端管理后台的默认账户和密码都是 guest,但是不允许外部登录,只能本地访问,所以需要添加 admin 新用户,设置完就可以登录啦;
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmqctl add_user admin admin
Adding user "admin" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
(10)杀掉Rabbit MQ进程;
# 查找占用端口的进程
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # netstat -tln | grep 25672
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 23817/xxxxxxxx
# 查找占用端口的进程的PID
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # sudo lsof -i:25672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xxxxxxxx 23817 root 17u IPv4 10733754 0t0 TCP *:25672 (LISTEN)
# 杀掉这个PID的进程
Linux-SUSE12SP5:/home/rabbitmq_server-3.10.7/sbin # kill -9 23817
2.在 Windows 环境下离线安装 RabbitMQ
(1)首先在官网可以看到 RabbitMQ 和 Erlang 的版本对应关系,看清楚需要的版本再下载哦!
版本关系传送门:https://www.rabbitmq.com/which-erlang.html
RabbitMQ下载地址:https://www.rabbitmq.com/download.html
Erlang下载地址:https://www.erlang.org/downloads
最后下载完成了这两个文件【rabbitmq-server-3.11.4.exe】和【otp_win64_25.0.exe】
(2)安装 Erlang
步骤一:双击 otp_win64_25.0.exe 文件,按照提示完成安装
步骤二:在系统变量,新建一个键为 ERLANG_HOME,值为 Erlang 的安装目录,然后在 Path 新增 %ERLANG_HOME%\bin
步骤三:查看安装是否成功,打开 cmd 控制台,输入 erl -version 得到版本号即为成功
(3)安装 RabbitMQ
步骤一:双击 rabbitmq-server-3.11.4.exe 文件,按照提示完成安装,注意安装路径不要有中文或空格
步骤二:在系统变量的 Path 新增 RabbitMQ完整的安装路径\sbin
(4)常用的命令与说明
基本命令
启动监控管理器:rabbitmq-plugins enable rabbitmq_management
关闭监控管理器:rabbitmq-plugins disable rabbitmq_management
启动RabbitMQ:rabbitmq-service start
关闭RabbitMQ:rabbitmq-service stop
查看所有队列:rabbitmqctl list_queues
清除所有队列:rabbitmqctl reset
关闭应用:rabbitmqctl stop_app
启动应用:rabbitmqctl start_app
用户和权限设置
添加用户:rabbitmqctl add_user username password
分配角色:rabbitmqctl set_user_tags username administrator
新增虚拟主机:rabbitmqctl add_vhost vhost_name
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username ‘.’ '.’ ‘.*’
角色说明
none 最小权限角色
management 管理员角色
policymaker 决策者
monitoring 监控
administrator 超级管理员