环境准备:
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@master ~]# uname -a
Linux master 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@master ~]# ip addr
ens33:
inet 192.168.0.201/24 brd 192.168.0.255 scope global ens33
当前Erlang和RabbitMQ版本:
[root@master ~]# erl
Erlang/OTP 22 [erts-10.7.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
[root@master ~]# rabbitmqctl version
3.8.3
一、部署单节点RabbitMQ
通常所说的RabbitMQ节点,其实是RabbitMQ应用程序和其所在的Erlang虚拟机。类似于JAVA应用程序和JVM虚拟机。
Erlang能让应用程序无须知道对方是否在同一台机器上即可相互通信。
1.1、配置repo:
[root@master ~]# cat /etc/yum.repos.d/erlang_solutions.repo
[erlang-solutions]
name=Centos $releasever - $basearch - Erlang Solutions
baseurl=http://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/erlang_solutions.asc
enabled=1
[root@master ~]# cat /etc/yum.repos.d/rabbitmq.repo
[rabbitmq_rabbitmq-server]
name=rabbitmq_rabbitmq-server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[root@master ~]# wget -O /etc/pki/rpm-gpg/erlang_solutions.asc https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
1.2、执行安装:
[root@master ~]# yum clean all
[root@master ~]# yum makecache
[root@master ~]# yum -y install erlang
[root@master ~]# yum -y install rabbitmq-server
1.3、配置文件:
[root@master ~]# wget -O /etc/rabbitmq/rabbitmq.conf --no-check-certificate https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example
二、启动和停止
2.1、启动:
通过rpm方式安装的RabbitMQ,只需要执行一条简单的命令即可完成启动:
[root@master ~]# rabbitmq-server
将RabbitMQ放在后台启动:
[root@master ~]# rabbitmq-server -detached
这样,就启动了RabbitMQ应用程序和Erlang程序。
如果此时执行netstat命令查看端口,会发现三个新的端口(4369、25672、5672):
4369被empd进程使用,全称为Erlang Port Mapper Daemon。当启动一个分布式Erlang节点时,它会用empd进程进行注册,提供OS内核分配的地址和端口;
25672就是由OS分配给运行RabbitMQ的Erlang VM的;
5672则是AMQP客户端连接RabbitMQ的端口。
2.2、停止:
[root@master ~]# rabbitmqctl stop
或者
[root@master ~]# rabbitmqctl shutdown
也可以通过systemctl来管理RabbitMQ的启动和停止:
[root@master ~]# systemctl start rabbitmq-server.service
[root@master ~]# systemctl stop rabbitmq-server.service
以上命令适用于整个RabbitMQ节点(应用程序和Erlang虚拟机)。如果只想重启RabbitMQ应用程序,而保持Erlang虚拟机运行:
[root@master ~]# rabbitmqctl stop_app
[root@master ~]# rabbitmqctl start_app
三、权限管理
用户是访问控制的基本单元,针对一到多个vhost,用户可以被赋予不同级别的访问权限。
首先创建用户,然后为其赋予权限(配置、写、读)。
3.1、用户管理:
创建用户,创建一个名为“user1”的用户,其密码为“passwd1”:
[root@master ~]# rabbitmqctl add_user user1 passwd1
为指定用户修改密码,如将用户“user1”的密码修改为“newpasswd”:
[root@master ~]# rabbitmqctl change_password user1 newpasswd
查看现有用户:
[root@master ~]# rabbitmqctl list_users
删除用户,如删除用户“user1”:
[root@master ~]# rabbitmqctl delete_user user1
3.2、权限系统:
RabbitMQ实现了一套访问控制列表(ACL)风格的权限系统,可以授予用户配置、写、读权限:
配置权限:队列和交换器的创建与删除;
写:发布消息;
读:有关消费消息的任何操作,包括“清除”整个队列。
访问控制条目是无法跨越vhost的,举例来说,如果想要给用户user1在vhost1和vhost2上赋予相同的权限,必须创建两份相同的访问控制条目。
下表展示了大部分AMQP命令和对应的权限:
AMQP命令 |
交换器exchange |
队列queue |
exchange.declare |
配置 |
|
exchange.delete |
配置 |
|
queue.declare |
配置 |
|
queue.bind |
读 |
写 |
basic.publish |
写 |
|
basic.get |
读 |
|
basic.consume |
读 |
|
queue.puege |
读 |
3.2.1、授予权限:
例子1,为user1用户赋予vhost1的完全访问权限(配置、写和读)。
首先创建一个vhost:
[root@master ~]# rabbitmqctl add_vhost vhost1
为user1赋予权限:
[root@master ~]# rabbitmqctl set_permissions -p vhost1 user1 ".*" ".*" ".*"
-p vhost1:set_permissions条目应该应用到哪个vhost上。如果不指定-p,则默认使用默认"/";
user1:被赋予权限的用户;
".*" ".*" ".*":分别代表了配置、写、读权限。".*"意味着匹配任何队列或者交换器名字。
例子2,为user1赋予vhost1上的权限,允许该用户对任何队列或者交换器可执行读操作,只能对以logs-开始的队列或者交换器执行写操作,同时,完全阻止配置操作:
[root@master ~]# rabbitmqctl set_permissions -p vhost1 user1 "" "logs-.*" ".*"
如例子所示,""表示不匹配任何队列或者交换器。
3.2.2、查看权限:
查看vhost1上的所有权限条目:
[root@master ~]# rabbitmqctl list_permissions -p vhost1
查看user1拥有的权限:
[root@master ~]# rabbitmqctl list_user_permissions user1
3.2.3、清除权限:
清除user1在vhost1的权限:
[root@master ~]# rabbitmqctl clear_permissions -p vhost1 user1
clear_permissions会清除用户在指定vhost上的所有权限。如果想要修改用户权限,只需要执行set_permissions设置新权限即可。
四、检查统计
4.1、查看队列和消息数目:
[root@master ~]# rabbitmqctl list_queues -p vhost1
查看更多关于队列的信息:
[root@master ~]# rabbitmqctl list_queues -p vhost1 name messages consumers memory durable auto_delete
该命令返回vhost1上队列的名称、消息数目、附加的消费者数量、使用的内存、durable属性(是否为持久化队列)以及auto_delete属性
4.2、查看交换器和绑定
4.2.1、查看交换器:
[root@master ~]# rabbitmqctl list_exchanges -p vhost1
Listing exchanges for vhost vhost1 ...
name type
amq.headers headers
amq.match headers
amq.topic topic
direct
amq.rabbitmq.trace topic
amq.direct direct
amq.fanout fanout
默认情况下,该命令返回交换器名称和类型。当创建一个vhost时,若干交换器已经声明好了。其中有一个只显示了“type”为“direct”的交换器,该交换器为“匿名交换器”,每个新的队列默认都会绑定到该交换器上。
4.2.2、查看交换器的更多信息:
[root@master ~]# rabbitmqctl list_exchanges -p vhost1 name type durable auto_delete
4.2.3、查看关于binding的信息:
[root@master ~]# rabbitmqctl list_bindings
五、关于Rabbit
5.1、节点名:
RabbitMQ节点启动时,会使用像rabbit@master这样的节点名。“rabbit”通常是固定的,“master”一般是本机的HOSTNAME。节点名被用在很多地方,比如通过rabbitmqctl命令管理远程节点时,必须匹配远程节点名。再有Mnesia和log目录,如下:
[root@master ~]# ls -dl /var/log/rabbitmq/rabbit@master.log
[root@master ~]# ls -dl /var/lib/rabbitmq/mnesia/rabbit@master
如果修改了本机的HOSTNAME,执行rabbitmqctl时,可能出现诸如“nodedown”之类的错误,所以尽可能保证节点名。
5.2、Erlang cookie:
Erlang节点通过匹配Erlang cookie获得认证。当创建RabbitMQ集群时,需要保证各节点的Erlang cookie一致,才能让节点之间互相通信。cookie一般存放在“~/.erlang.cookie”文件中,“~”通常指rabbitmq用户的家目录。
为了查找.erlang.cookie文件的位置,也可以执行:
[root@master ~]# find / -name .erlang.cookie
5.3、Mnesia:
RabbitMQ使用Mnesia存储队列、交换器、绑定等信息。RabbitMQ启动时会启动Mnesia数据库,如果Mnesia启动失败,也会导致RabbitMQ启动失败。
Mnesia会基于机器的节点名创建数据库schema,所以主机名的改变也会导致RabbitMQ出现问题。
5.4、轮替RabbitMQ日志:
[root@master ~]# rabbitmqctl rotate_logs
[root@master ~]# ls /var/log/rabbitmq/*.log
更多:
RabbitMQ学习之一:理解RabbitMQ
https://blog.51cto.com/13568014/2495857
来源:oschina
链接:https://my.oschina.net/u/4350320/blog/4283426