美文网首页
八、运行和管理Rabbit

八、运行和管理Rabbit

作者: lancelea | 来源:发表于2019-12-11 16:18 被阅读0次

现在我们开始学习掌握 RabbitMQ 的日常基础管理。学完本节之后,诸如以下的一些问题就得心应手了:了解如何让 RabbitMQ 在工作站上运行起来?如何干净利落地停止它?如何限制 RabbitMQ 的内存消耗以致不会让同一台服务器上的其他应用程序“饿死”?

服务器管理

Erlang 节点

节点的概念

与 JVM 相似,Erlang 也有虚拟机,而虚拟机的每个实例我们称之为节点(node)。事实上,节点描述的是一个Erlang节点运行着一个Erlang应用程序。

节点的特征
  • 不同于JVM,多个 Erlang 应用程序可以运行在同一个节点之上。

  • 节点之间可以进行本地通信(不管它们是否真的在同一台服务器上)。

  • Erlang节点会自动尝试重启由于某些原因崩溃的应用程序。

启动节点

启动 Erlang 节点和 RabbitMQ 应用程序很简单,只需一个步骤即可。在 RabbitMQ 的安装目录下找到./sbin目录,运行./rabbitmq-server。当查看控制台时,你会发现不同的 RabbitMQ 子系统运行起来了,并准备好处理消息。执行结果如下图:

运行结果

也可以通过增加-detached参数的方式启动 Rabbit 节点,以守护程序的方式在后台运行:./rabbitmq-server -detached

如果在启动过程中遇到了任何错误,那么就检查一下 RabbitMQ 日志。通常情况下,可以在 RabbitMQ 安装目录下的/var/log/rabbitmq/目录下找到名为rabbit@[hostname].log的的日志文件。例如在上述运行./rabbitmq-server命令时,日志文件的所在目录已经打印出来了。文件名中的“rabbit”部分是运行 RabbitMQ 的默认 Erlang 节点名称。

停止节点

有两种停止 RabbitMQ 的方式:

  • 在使用./rabbitmq-server命令启动的情况下,直接按下按下CTRL + C组合键。

  • 在使用./rabbitmq-server -detached命令启动的情况下,在 RabbitMQ 安装目录下运行./sbin/rabbitmqctl stop
    rabbitmqctl 会和本地节点通信并指示其干净地关闭,并保护好那些持久化队列。也可以指定关闭不同的节点,包括远程节点。只需传入-n rabbit@[hostname]选项即可。

启动应用程序

在节点启动的状态下,在 RabbitMQ 安装目录下运行./sbin/rabbitmqctl start_app即可启动 RabbitMQ 应用程序。

关闭应用程序

在节点启动的状态下,在 RabbitMQ 安装目录下运行./sbin/rabbitmqctl stop_app即可关闭 RabbitMQ 应用程序。

关闭启动应用程序和节点的区别

  • 对应集群而言。rabbitmq-server 同时启动了节点和应用程序,因为它把 RabbitMQ 应用程序预先配置成了独立运行模式。为了把节点加入现有的集群当中,你需要做的是停止应用程序,把节点重置为原始状态。这样节点就准备好加入集群了。如果你使用./rabbitmqctl stop命令的话,就会把应用程序和节点同时关闭。这时如果运行./rabbitmq-server,由于独立运行模式的关系,又会迫使你把应用程序和节点同时启动起来。

  • 对于应用程序而言。如果在同一节点上运行的有除了 RabbitMQ 之外的其他 Erlang 应用程序,停止整个节点就不可取的。

常用节点查询

  • 机器上运行着哪些节点:net_adm:names().
  • 尝试对其他节点的连接:net_adm:ping('test@localhost').

RabbitMQ 配置文件

RabbitMQ 允许你设置系统范围的可调参数并通过配置文件进行设置。典型地,该配置文件位于 RabbitMQ 安装目录下的/etc/rabbitmq/rabbitmq.config。可以在节点启动日志中看到 rabbitmq.config 文件在哪(我这里显示配置文件不存在),如下图。不过,文件位置可以通过 rabbitmq-server 脚本对CONFIG_FILE环境变量进行设置。

启动日志中的rabbitmq.config文件位置

RabbitMQ配置文件事实上是一个包含了嵌套哈希表(字典或者命名数组)的数组,如下图所示:


rabbitmq.config数据结构

第一行和第四行分别开启和关闭了配置数组。通过外部配置数组,每个 Erlang 应用程序会有自己的哈希表来配置选项,每个选项都表达为这种形式:{[option_name],[option_value]}。此处我们有两个应用:

  • mnesia指的是Mnesia数据库配置选项(Mnesia是RabbitMQ用来存储交换器和队列元数据的)。

  • rabbit指的是RabbitMQ特定的配置选项。

注意:RabbitMQ 中的每个队列、交换器和绑定的元数据(除了消息的内容)都是保存到 Mnesia 的。Mnesia 是内建在 Erlang 的非 SQL 型数据库。Mnesia 通过将 RabbitMQ 元数据首先写入一个仅限追加的日志文件,以确保其完整性。然后,它再定期将日志内容转储到真实的 Mnesia 数据库文件中。
Mnesia 配置选项
| 选项名称 | 值类型 | 默认值 | 描述 |
| :------------------------------ | :----------: | :------------------: | :----------------------------------------------------------- |
| dump_log_write_threshold | 整型 | 100 | 将仅限追加的日志内容转储至真实数据库文件的频度。它明确指定了在转储操作发生前,必须有多少个条目存储在日志中。设置更高的数值将减少 I/O 负载并增加持久化消息的性能。 |
| tcp_listeners | 数组 | [{"0.0.0.0", 5672},] | 定义了 RabbitMQ 应该监听的非 SSL 加密通信的 IP 地址和端口。 |
| ssl_listeners | 数组 | 空 | 定义了 RabbitMQ 应该监听的 SSL 加密通信的 IP 地址和端口。 |
| ssl_options | 数组 | 空 | 指定 SSL 相关的选项。有效的选项有 cacertfile(CA证书文件)、certfile(服务器证书文件)、keyfile(服务器密钥文件)和 fail_if_no_peer_cert(需要客户端安装有效证书:True/False)。 |
| vm_memory_high_watermark | 十进制百分数 | 0.4 | 控制 RabbitMQ 允许消耗的内存。它以十进制数值的形式明确了 Rabbit 运行使用的安装内存百分比(0.4=40%)。 |
| msg_store_file_size_limit | 整型(字节) | 16777216 | RabbitMQ 垃圾收集存储内容之前,消息存储数据库的最大大小。 |
| queue_index_max_journal_entries | 整型 | 262144 | 在转储到消息存储数据库并提交之前,消息存储日志里的最大条目数。 |

请求许可

RabbitMQ 的权限系统像大多数权限系统那样,首先创建用户,然后为其赋予权限,如下图所示:


RabbitMQ权限示意图

RabbitMQ 权限系统一个好的地方在于单个用户可以跨越多个 vhost 进行授权,这对于当应用程序需要跨越多个安全域进行通信时是极其方便的。

管理用户

在 RabbitMQ 中,用户是访问控制的基本单元。针对一到多个 vhost,其可以被赋予不同级别的访问权限,并使用标准的用户名/密码对来认证用户。

从 RabbitMQ 安装目录下的./sbin运行如下命令:

  # 创建一个名为lance,密码为123456的用户
$ ./rabbitmqctl add_user lance 123456
  # 删除名为lance的用户
$ ./rabbitmqctl delete_user lance
  # 查询 RabbitMQ 服务器上有哪些用户
$ ./rabbitmqctl list_users
  # 修改lance的密码为abcdef
$ ./rabbitmqctl change_password lance abcdef

注意:当你删除用户的时候,任何引用该用户的访问控制条目都会从Rabbit权限数据库中自动删除。同时,rabbitmqctl也不会警告你与用户相关的访问控制条目也会一并被删除。所以请谨慎删除用户;否则你会发现不得不重建一大堆访问控制条目。

Rabbit 的权限系统

从1.6.0版本开始,RabbitMQ实现了一套访问控制列表(ACL)风格的权限系统。新的权限系统允许大量细粒度控制,同时可以授予用户读、写和配置权限。那么这三者之间有何差异?

  • 读——有关消费消息的任何操作,包括“清除”整个队列(同样需要绑定操作的成功)
  • 写——发布消息(同样需要绑定操作的成功)
  • 配置——队列和交换器的创建和删除

下面是各 AMQP 命令与权限的对应关系:


AMQP 命令与权限的对应关系

每一条访问控制条目由以下四部分组成:

  • 被授予访问权限的用户。
  • 权限控制应用的vhost。
  • 需要授予的读/写/配置权限的组合。
  • 权限范围——客户端命名意味着由你的应用程序设置了交换器/队列的名称;服务器端命名意味着你的应用程序不提供名字而是让服务器随机指派。

谨记:访问控制条目是无法跨越vhost的。


假设你有名为 sycamore 的 vhost,你想要授予 lance 完全的访问权限(配置、写和读权限)。你需要 rabbitmqctl 的 set_permissions 命令来完成:

$ ./rabbitmqctl set_permissions -p sycamore lance ".*" ".*" ".*"

现在把 set_permissions 命令分解开来,一块块分开看:
■-p sycamore——这告诉了set_permissions条目应该应用到哪个vhost上。
■ cashing-tier——被授予权限的用户。
■ "." "." ".*"——这是授予的权限。三个值中的每一个都是正则表达式。这些值分别映射到配置,以及写和读。


假设你为 lance 授予在 oak vhost 上的权限。你想要允许该用户对任何队列或者交换器可执行读操作,同时限制其只能对名字以 checks- 开始的队列和交换器允许写操作。同时,你想要完全阻止配置操作。为达目的,你需要设计三个正则表达式:

  • ".*"匹配任何队列和交换器
  • "checks-.*"只匹配名字以“checks-”开头的队列和交换器
  • ""不匹配队列和交换器(这就是如何对用户拒绝指定的权限)

把所有整合起来,像这样执行 set_permissions:

$ ./rabbitmqctl set_permissions -p oak lance "" "checks-.*" ".*"

如果想要删除这些权限控制,该怎么办呢?你可以通过使用rabbitmqctlclear_permissions命令移除一个用户在任何vhost上的权限:

$ ./rabbitmqctl clear_permissions -p oak lance

注意:clear_permissions命令会移除用户在指定 vhost 上的所有权限。如果你只想要修改用户现存的权限,则只需设置新的权限值并执行set_permissions即可。如果你想要查看用户在 RabbitMQ 服务器所有 vhost 上的权限,那么请使用rabbitmqctllist_user_permissions命令。

相关文章

网友评论

      本文标题:八、运行和管理Rabbit

      本文链接:https://www.haomeiwen.com/subject/pxzuyctx.html