在上文中我们已经简单的介绍了AMQP消息通信的基本概念,并对运行环境进行了安装,但是当我们将RabbitMQ部署在线上的时候,有涉及到了RabbitMQ的优化,在本节中我们 着重讲解RabbitMQ的管理
服务器的管理
RabbitMQ为erlang语言编写,由于erlang语言的特性很好的实现简单的分布式,但是我们以前并没有接触过Erlang语言,因此很多的优化也会有着不同。
启动节点
在本节中我们使用术语节点来代替RabbitMQ,Erlang语言与JAVA语言相似,同样有着虚拟机JVM,不同于JAVA虚拟机的是,多个Erlang程序可以运行在一个相同的虚拟机上面,同样我们也把Erlang虚拟机的实例称之为节点,Erlang程序更为特殊的是当两个不同的JVM运行在不同的机子上面时,两者之间可以进行本地通信,如果运行在Erlang虚拟机上面的程序崩溃了,那么Erlang虚拟机会自动尝试启动应用程序。
启动节点:
rabbitmq-serer
//参数
-detached //以后台守护进程的方式启动
查看日志文件:
cat /var/log/rabbitmq/rabbit@[hostname].log
停止节点
rabbitmqctl是RabbitMQ提供的解决方案,他可以用来显示出所欲的vhost,并且用来 创建vhost或者用户,同时也能停止RabbitMQ
rabbitmqctl stop -n rabbit@[hostname]
如果我们采用包管理安装RabbitMQ同样可以采用服务的方式
service rabbitmq-servver stop
关闭和重启应用程序
上面我们所讲述的启动节点以及关闭节点都是伴随着Erlang的虚拟机节点进行启动和关闭,但是有时候我们的Erlang节点还运行这其他应用程序,我们只能通过停止RabbitMQ应用程序,而不是也停止Erlang虚拟机节点的运行,我们只需要运行:
rabbitmqctl stop_app
rabbitmqctl start_app
RabbitMQ的配置文件
配置文件位置:
/usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example
简单的启动RabbitMQ并不需要配置文件,但是复杂的RabbitMQ则需要配置文件。
RabbitMQ的配置文件,我把它理解为JSON文件,RabbitMQ,Mnesia是用来存储RabbitMQ队列元数据以及交换器信息的,每个表达式的形式都是:
{[option_name],[option_vavlue]}
//多个配置采用 逗号进行分割
RabbitMQ中的每个队列、交换器以及绑定的元数据(除了消息内容)都是保存在Mnesia的,Mnesia是内建在Erlang的非SQL型数据库,Mnesia通过将RabbitMQ的元数据保存在一个仅限追加的日志文件中,然后在定期的将日志文件中的内容保存为Mnesia数据的格式。
dump_log_write_threshold 100
即为当日志文件中有100个条目的时候发生转储,当把此值提高的时候,可以减少IO负载并增加持久化消息的性能
RabbitMQ的配置选项:
选项名称 | 默认值 | 描述 |
---|---|---|
tcp_listeners{“ip地址”,”监听的端口号”} | [{“0.0.0.0”,5672}] | 定义了RabbitMQ应该监听的非SSL加密通信的IP地址以及端口号 |
ssl_listeners{“ip地址”,”监听的端口号”} | 空 | 定义了RabbitMQ应该监听SSL加密的通信地址以及端口号 |
ssl_options{“键”,”值”} | 空 | 指定SSL的相关选项,有效的选项有cacertfile(CA证书文件),certfile(服务器证书文件),keyfile(服务器密钥文件),fail_if_no_peer_cert(需要客户端安装证书true/false) |
vm_memory_high_watermark百分数 | 0.4 | 定义了RabbitMQ允许消耗的内存 |
msg_store_file_size_limit整型字节 | 1073741824 | 定义了RabbitMQ垃圾收集之前,消息存储数据库的最大大小 |
queue_index_max_journal_entries整型 | 262144 | 定义了RabbitMQ转储到消息存储库并提交之前,消息存储日志文件的最大条目数 |
请求许可—权限系统
管理用户
在RabbitMQ中,用户为访问的基本单元,针对一个至多个vhost。
创建用户:
rabbitmqctl add_user username password
删除用户:
rabbitmqctl delete_user username
当我们删除用户的时候,任何与该用户访问控制的条目都会被删除,因此删除用户时需要特别谨慎。
查看所有用户:
rabbitmqctl list_users
更改用户的密码:
rabbitmqctl change_password username newpassword
权限系统
权限系统允许大量细粒度控制,同时可以授予用户读、写和配置权限。
- 读:有关消费信息的任何操作,包括“清除”整个队列(同样需要绑定操作的成功)
- 写:发布信息(同样需要绑定操作的成功)
- 配置:队列和交换器的创建以及删除
每条访问控制条目组成:
- 被授予访问权限的用户
- 权限控制应用的vhost
- 需要授予的读/写/配置权限的组合
- 权限范围—-权限控制仅应用于客户端命名的队列或者交换器还是服务器随机命名的。
每条访问控制条目是无法跨越vhost的,如果一个用户想要在多个vhost上赋予想用的权限,那么必须创建相应个访问控制条目。
例子:
假设名为sycmore的vhost,我们想要赋予test用户完全的访问权限:
rabbitmqctl set_permission -p sycmore\ test ".*" ".*" ".*"
//-p sycmore为应用在那个vhost上面
// test 为指定的用户
//第一个.*为用户在此vhost的配置权限
//第二个.*为用户再次vhost的写权限
//第三个.*为用户再次vhost的读权限
那我们假设配置test用户在sycmore的vhost上面,没有配置的权限,拥有vhost的读权限以及以checks-开始队列的写权限
rabbitmqctl set_permission -p sycmore\ test "" "check-.*" ".*"
设置完成之后我们可以通过:
rabbitmqctl list_permission -p sycmore
//查看交换器上面配置的权限
移除权限:
rabbitmqctl clear_permission -p sycmore test
//移除test用户在sycmore交换器上面的权限
查看用户在所有vhost上面的权限:
rabbitmqctl list_user_permission test
//显示出用户test在所有vhost上面的权限
检查
查看数据统计
查看vhost上面的所有队列:
rabbitmqctl list_queues -p vhostname
//如果不加-p参数,为默认的vhost/的所有队列
rabbitmqctl list_queues [-p <vhostPath> [<QueueInfoItem>]]
我们已经知道了vhostpath的含义,那么QueueInfoItem为返回队列的具体参数信息
rabbitmqctl list_queues -p test name messages consumers memory
//此命令表示显示出名称为test的vhost上面所有队列的名称、消息数目、消费者数目、以及内存的使用情况
检查队列声明时的具体属性:
rabbitmqctl list_queues name durable auto-delete
//durable为可持久化的
//自动删除属性
查看交换器的信息:
rabbitmqctl list_exchanges//默认情况下返回交换器的名称以及类型
我们发现第一个交换器没有名称,此为匿名交换器,每个队列都会默认绑定到该交换器上面
查看交换器详细信息
rabbitmqctl list_exchanges name type durable auto-delete
//此参数为查看交换器的名称、类型、可持久化以及自动删除
查看绑定信息:
rabbitmqctl list_bindings
该命令不接收-p以外的参数,每行包含了交换器名称、队列名称、路由键和参数。最开始的几行看起来比较特殊,因为匿名交换器的原因。
理解RabbitMQ日志
日志文件存储在:
/var/log/rabbitmq/
//目录中默认有两个文档
其中sasl日志文档,存储的为Erlang的相关信息,举例来说,我们可以在这个文件中找到Erlang的崩溃信息。
rabbit.log则是存储的RabbitMQ的日志信息,我们可以从其中查看到服务器正在发生的事件。