RabbitMQ管理与集群
Vhost虚拟机
创建vhost:rabbitmqctl add_vhost {vhost}
所有vhost:rabbitmqctl list_vhosts [vhostinfoitem…]
删除vhost:rabbitmqctl delete_vhost {vhost}
权限
授权权限:rabbitmqctl set_permissions [-p vhost] {user}{conf}{write}{read}
vhost:授权用户访问指定的vhost
user:可以访问指定vhost的用户名
conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式
write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式
read:一个用于匹配用户在哪些资源上拥有可读权限的正则表达式
收回权限:rabbitmqctl clear_permissions [-p vhost] {username}
虚拟主机权限列表:rabbitmqctl list_permissions [-p vhost]
用户权限列表:rabbitmqctl list_user_permissions {username}
用户管理
创建用户:rabbitmqctl add_user {username} {password}
修改密码:rabbitmqctl change_password {username} {password}
清除密码:rabbitmqctl clear_password {username}
验证用户:rabbitmqctl authenticate_user {username} {password}
删除用户:rabbitmqctl delete_user {username}
用户列表:rabbitmqctl list_users
角色分配:rabbitmqctl set_user_tags {username} {tag…}
角色分5种类型:
- none:无任何角色,新创建的用户默认角色为none
- management:可以访问web管理页面
- policymaker:包含management的所有权限,并可以管理策略(Policy)和参数(Parameter)
- monitoring:包含management的所有权限,并可以看到所有连接、信道及节点相关信息
- administartor:包含minitoring的所有权限,并可以管理用户、虚拟主机、权限、策略、参数等
Web管理端
- 启动:
rabbitmq-server -detached
service rabbitmq-server start - 停止:
rabbitmqctl stop
service rabbitmq-server stop - 查看状态:
rabbitmqctl status
service rabbitmq-server status
服务端状态管理
查看队列列表
rabbitmqctl list_queues[-p vhost][queueinfoitem…]
name:队列名称
durable:队列会否持久化
auto_delete:队列是否自动删除
arguments:队列参数
policy:应用到队列上的策略名称
pid:队列关联的Erlang进程ID
owner_pid:处理排他队列连接的进程ID
exclusive:队列是否排他
查看交换器列表
rabbitmqctl list_exchanges [-p vhost][exchangeinfoitem…]
name:交换器名称
type:交换器类型
durable:交换器是否持久化
auto_delete:交换器是否自动删除
internal:是否是内置交换器
arguments:交换器的参数
policy:交换器的策略
查看绑定关系列表
rabbitmqctl list_bindings [-p] [bindinginfoitem…]
source_name:绑定中消息来源的名称
source_kind:绑定中消息来源的类别
destination_name:绑定中消息目的地的名称
destination_kind:绑定种消息目的地的种类
routing_key:绑定的路由键
argumenets:绑定的参数
查看连接信息列表
rabbitmqctl list_connections [connectioninfoitem …]
pid:与连接相关的进程ID
name:连接名称
port:服务器端口
host:服务器主机名
peer_port:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peer_port
peer_host:服务器对端主机名称,或IP,或未启用
ssl:是否启用SSL
state:连接状态,包括starting\tuning\opening\running\flow\blocking\blocked\closing\closed
channels:连接中的信道个数
protocol:使用的AMQP协议版本
user:与连接相关的用户名
vhost:与连接相关的vhost名称
timeout:连接超时/协商的心跳间隔,单位s
查看信道列表
rabbitmqctl list_channels [channelinfoitem…]
pid:与连接相关的进程ID
connection:信道所属连接的进程ID
name:信道名称
number:信道的序号
user:与连接相关的用户名
vhost:与连接相关的vhost名称
transactional:信道是否处于事务模式
confirm:信道是否处于 publisher confirm模式
consumer_count:信道中的消费者个数
messages_unacknowledged:已投递但是还未被ack的消息个数
messages_uncommitted:已接收但是还未提交事务的消息个数
acks_uncommitted:已ack收到但是还未提交事务的消息个数
messages_unconfirmed:已发送但是还未确认的消息个数
perfetch_count:新消费者的Qos个数限制,0表示无上限
global_prefetch_count:整个信道的Qos个数限制
查看消费者列表
rabbitmqctl list_consumers [-p vhost]
vhost:与连接相关的vhost名称
Http API接口管理
描述整个系统的各种信息:/api/overview;
集群的名称:/api/cluster-name;
集群中节点的信息:/api/nodes;
所有的连接信息:/api/connections;
所有信道的信息:/api/channels;
所有的消费者信息:/api/consumers;
所有交换器信息:/api/exchanges;
列出所有的队列信息:/api/queues;
列出所有绑定关系的信息:/api/bindings;
列出所有vhost的信息:/api/vhosts;
列出所有的用户信息:/api/usres;
RabbitMQ集群
集群那些事儿
为什么需要集群?
使客户端在节点崩溃的情况下依然可以运行,避免单节点故障,提高可用性;
线性扩展也可以提高吞吐量。
有了集群就可以保证消息万无一失吗?
当某个节点崩溃时,节点上所有队列的消息都会丢失。默认情况不会将队列的消息在集群中进行复制存储。
队列在集群中是如何存在的?
队列默认不会在集群中复制,其他节点只会保存队列所处的节点和元数据,消息传递给队列的所有者节点。
交换器在集群中是如何存在的?
交换器会进行复制,因为交换器本质上是一个类似于HashMap的映射表,并不需要存储数据。
集群中节点有什么要求?
集群中的节点分为内存节点和磁盘节点两种,RabbitMQ要求集群中至少存在一个磁盘节点。
内存节点是为了保证MQ的性能,但如果将所有的消息、队列、交换器、绑定关系、用户、权限等都保存在内存中,则可能在服务重启的清下丢失这些重要配置,以及消息。
集群配置
- 设置hosts
vi /etc/hosts - 设置RabbitMQ的Cookie,集群内节点的cookie值要求相同
vi /var/lib/rabbitmq/.erlang.cookie - 配置集群
①启动节点;
② 以一个节点为基准,将其他节点加入到基准节点的集群中:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl start_app
③ 查看集群状态:rabbitmqctl cluster_status
④ RabbitMQ节点数据文件存放目录:/var/lib/rabbitmq/mnesia/
集群管理
#将节点加入指定集群中
rabbitmqctl join_cluster {cluster_node} [–ram]
#显示集群的状态
rabbitmqctl cluster_status
#修改集群节点类型
rabbitmqctl change_cluster_node_type {disc|ram}
#将节点从集群中删除
rabbitmqctl forget_cluster_node rabbit@node2
#设置集群名称
rabbitmqctl set_cluster_name {name}