集群的设计
设计目标:
-
允许消费者和生产者在节点崩溃的情况下继续运行; -
通过添加节点线性扩展消息通信的吞吐量。
可以保证消息的万无一失吗? 不行,当一个节点崩溃时,该节点上队列的消息也会消失,rabbitmq默认不会将队列的消息复制到整个集群上。
队列
集群中队列信息只在队列的所有者节点保存队列的所有信息,其他节点只知道队列的元数据和指向所有者节点的指针,节点崩溃时,该节点的队列 和其上的绑定信息都消失了。
为什么集群不复制队列内容和状态到所有节点?主要考虑存储空间和性能,如果消息需要复制到集群中每个节点,网络开销不可避免,持久化消息还 需要写磁盘。 所以其他节点接收到不属于该节点的队列的消息时会将该消息传递给该队列的所有者节点上。
交换器
本质上是个这个交换器的名称和队列的绑定列表,可以看成一个类似于 hashmap 的映射表,交换器会在整个集群上复制。
元数据
元数据主要包括:
元数据也会在整个集群进行复制。
节点
根据节点将队列、交换器、用户等信息保存的位置可以将节点分为以下两种类型:
RabbitMQ只要求集群中至少有一个磁盘节点,从高可用的角度讲每个集群应该至少配备两个磁盘节点。因为只有一个磁盘节点的情况下,当这个磁 盘节点崩溃时,集群可以保持运行,但任何修改操作,比如创建队列、交换器、添加和删除集群节点都无法进行。
如果集群中全部是磁盘节点,当声明队列、交换器等等时,RabbitMQ必须将数据保存在所有节点后才能表示操作完成。
集群
的构建
RabbitMQ集群对延迟非常敏感,只能在本地局域网内使用。
主机规划:
主机名 | IP地址 | 节点类型 |
---|
node05 | 192.168.80.205 | 磁盘节点 | node06 | 192.168.80.206 | 磁盘节点 | node07 | 192.168.80.207 | 内存节点 |
- 在node05、node06、node07三台主机的
/etc/hosts 分别添加如下内容:
192.168.80.205 node05
192.168.80.206 node06
192.168.80.207 node07
-
Erlang Cookie文件:/var/lib/rabbitmq/.erlang.cookie。将node05的该文件复制到node06、node07,由于这个文件权限是400,所以需要先修改 node06、 node07中的该文件权限为777,然后将node05中的该文件拷贝到node06、node07,最后将权限和所属用户组修改回来。 -
运行各节点 ,systemctl restart rabbitmq-server -
在node06运行:
- node07上运行
:
--ram
- 查看集群的状态
如果要将集群中的节点移除,可以使用下面的命令:
严格来说,rabbitmqctl reset 不属于集群命令,reset的作用是将node节点恢复为空白状态,包括但不限于,比如,用户信息,虚拟主机信息,所有 持久化的消息。在集群下,通过这个命令,可以让节点离开集群。
元数据的变更这些消息都要记录在磁盘节点上。当有节点离开集群时,所有的磁盘节点上都要记录这个信息。如果磁盘节点在离开集 群时不用reset命令,会导致集群认为该节点发生了故障,并会一直等待该节点恢复才允许新节点加入,所以,当磁盘节点是被暴力从集群中脱离时,有 可能导致集群永久性的无法变更(不单单是加入新节点,包括申明队列,交换器等操作)。
RabbitMQ常用命令
管理虚拟主机
用户管理
-
rabbitmqctl add_user [username] [pwd] -
rabbitmqctl delete_user [username] -
rabbitmqctl change_password [username] [newpwd] -
rabbitmqctl list_users
用户权限
- rabbitmqctl set_permissions [-p ]
可以针对virtual host中所有资源的配置、写、读权限进行配置权限。
注意在win上,字符全部使用双引号,linux上使用单引号
windows上 : rabbitmqctl set_permissions -p / xxx"." "." “.*”
linux上 :rabbitmqctl set_permissions -p / xxx ‘.’ '.’ ‘.*’
其中.*是正则表达式,表示全部
- rabbitmqctl set_user_tags User Tag
User为用户名, Tag为角色名(对应于下面的administrator,monitoring,policymaker,management,none)
例子:赋予xxx为administrator角色
rabbitmqctl set_user_tags xxx administrator
查看队列
查看交换器
- rabbitmqctl list_exchanges
查看绑定
- rabbitmqctl list_bindings
|