RabbitMQ管理+构建集群
RabbitMQ常用端口
client端通信端口: 5672
管理端口 : 15672
server间内部通信端口: 25672
可能的问题
如端口出现不能访问,考虑是否防火墙问题,可以使用形如以下命令开启或直接关闭防火墙:
firewall-cmd --add-port=15672/tcp --permanent
运行rabbitmqctl status出现Error: unable to connect to node : nodedown之类问题考虑如下几种解决办法:
1、重启服务
service rabbitmq-server stop
service rabbitmq-server start
2、检查/var/lib/rabbitmq中是否存在.erlang.cookie,没有则新建一个,里面随便输入一段字符串
3、重新安装服务
4、百度或者Google一下
管理RabbitMQ
管理
日志一般存放位置
管理虚拟主机
rabbitmqctl add_vhost [vhost_name]
rabbitmqctl list_vhosts
启动和关闭rabbitmq
以服务方式
service rabbitmq-server stop
service rabbitmq-server start
service rabbitmq-server status
以应用程序方式
rabbitmq-server会启动Erlang节点和Rabbitmq应用
rabbitmqctl stop会关闭Erlang节点和Rabbitmq应用
rabbitmqctl status 可以检查消息节点是否正常
Rabbitmq配置文件放在 /etc/rabbitmq 下,名为rabbitmq.config,没有且需要使用则可以自己新建一个
单独关闭RabbitMQ应用
rabbitmqctl stop_app关闭Rabbitmq应用
rabbitmqctl start_app启动Rabbitmq应用
用户管理
rabbitmqctl add_user [username] [pwd]
rabbitmqctl delete_user [username]
rabbitmqctl change_password Username Newpassword
rabbitmqctl list_users
用户权限控制
guest用户
guest是默认用户,具有默认virtual host "/"上的全部权限,仅能通过localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users来取消其本地访问的限制:[{rabbit, [{loopback_users, []}]}]
用户权限
用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。比如:
exchange和queue的declare与delete分别需要:exchange和queue上的配置权限
queue的bind与unbind需要:queue写权限,exchange的读权限
发消息(publish)需exchange的写权限
获取或清除(get、consume、purge)消息需queue的读权限
对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
如用户Mark在虚拟主机logHost上的所有权限:
rabbitmqctl set_permissions –p logHost Mark ‘.*‘ ‘.*‘ ‘.*‘
设置用户角色:
rabbitmqctl set_user_tags User Tag
User为用户名, Tag为角色名(对应于下面的administrator,monitoring,policymaker,management)
RabbitMQ的用户角色分类
none、management、policymaker、monitoring、administrator
none
不能访问 management plugin,通常就是普通的生产者和消费者
management
普通的生产者和消费者加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
policymaker
management可以做的任何事加:
查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections
查看
查看队列
rabbitmqctl list_queues
查看交换器
rabbitmqctl list_exchanges
查看绑定
rabbitmqctl list_bindings
RabbitMQ集群
RabbitMQ內建集群
內建集群的设计目标
1、允许消费者和生产者在节点崩溃的情况下继续运行;2、通过添加节点线性扩展消息通信的吞吐量。
可以保证消息的万无一失吗?
不行,当一个节点崩溃时,该节点上队列的消息也会消失,rabbitmq默认不会将队列的消息复制到整个集群上。
集群中的队列和交换器
队列
集群中队列信息只在队列的所有者节点保存队列的所有信息,其他节点只知道队列的元数据和指向所有者节点的指针,节点崩溃时,该节点的队列和其上的绑定信息都消失了。
为什么集群不复制队列内容和状态到所有节点:1)存储空间;2)性能,如果消息需要复制到集群中每个节点,网络开销不可避免,持久化消息还需要写磁盘。
所以其他节点接收到不属于该节点的队列的消息时会将该消息传递给该队列的所有者节点上。
交换器
本质上是个这个交换器的名称和队列的绑定列表,可以看成一个类似于hashmap的映射表,所以交换器会在整个集群上复制。
元数据
队列元数据:队列名称和属性(是否可持久化,是否自动删除)
交换器元数据:交换器名称、类型和属性
绑定元数据:交换器和队列的绑定列表
vhost元数据:vhost内的相关属性,如安全属性等等
集群中的节点
要么是内存节点,要么是磁盘节点。怎么区分?就是节点将队列、交换器、用户等等信息保存在哪里?单节点肯定是磁盘类型。集群中可以有内存节点,为了性能的考虑,全部是磁盘节点,当声明队列、交换器等等时,rabbitmq必须将数据保存在所有节点后才能表示操作完成。
Rabbitmq只要求集群中至少有一个磁盘节点,从高可用的角度讲每个集群应该至少配备两个磁盘节点。因为只有一个磁盘节点的情况下,当这个磁盘节点崩溃时,集群可以保持运行,但任何修改操作,比如创建队列、交换器、添加和删除集群节点都无法进行。
构建我们自己的集群
集群常用命令
rabbitmqctl join_cluster []将节点加入集群
rabbitmqctl cluster_status 查询集群状态
rabbitmqctl reset 严格来说,不属于集群命令,reset的作用是将node节点恢复为空白状态,包括但不限于,比如,用户信息,虚拟主机信息,所有持久化的消息。在集群下,通过这个命令,可以让节点离开集群。