RabbitMQ学习之二:管理单节点RabbitMQ

南楼画角 提交于 2020-08-07 21:09:56

环境准备:

[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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!