集群的设计
设计目标: 允许消费者和生产者在节点崩溃时继续运行; 通过添加节点线性扩展消息通信的吞吐量。
能保证消息万无一失吗? 不,当一个节点崩溃时,该节点上的队列消息也会消失,rabitmq默认不会将队列消息复制到整个集群中。队列
集群中的队列信息只在队列的所有者节点中保存队列的所有信息,其他节点只知道队列的元数据和指向所有者节点的指针。当节点崩溃时,节点的队列 上述绑定信息都消失了。
为什么集群不将队列内容和状态复制到所有节点?主要考虑存储空间和性能。如果消息需要复制到集群中的每个节点,网络成本是不可避免的,持久消息也是如此 需要写磁盘。 因此,当其他节点收到不属于节点的队列的消息时,它们会将消息传递给队列的所有者节点。交换器
本质上是这个交换器的名称和队列的绑定列表,可以看作是类似的 hashmap 交换器将在整个集群上复制映射表。元数据
元数据主要包括: 队列元数据:队列名称和属性(是否可持续,是否自动删除) 。 交换器元数据:交换器名称、类型和属性 。 绑定元数据:交换器和队列的绑定列表 。 vhost元数据:vhost 安全属性等相关属性 。
元数据也将在整个集群中复制。节点
将队列、交换器、用户等信息按节点保存的位置可分为以下两种类型: 内存节点 磁盘节点
RabitMQ只要求集群中至少有一个磁盘节点。从高可用性的角度来看,每个集群至少应配备两个磁盘节点。因为当磁盘节点只有一个时 当磁盘节点崩溃时,集群可以保持运行,但不能进行任何修改操作,如创建队列、交换器、添加和删除集群节点。
如果所有的集群都是磁盘节点,当声明队列、交换器等时,RabitMQ必须将数据保存在所有节点后才能表示操作完成。集群
的构建
RabitMQ集群对延迟非常敏感,只能在本地局域网中使用。
主机规划:
主机名
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 node05192.168.80.2060 node06192.168.80.2070 node07 Erlang Cookie文件:/var/lib/rabbitmq/.erlang.cookie。将node05的文件复制到node06、node07,因为这个文件的权限是400,需要先修改 node06、 该文件在node07中的权限为777,然后将该文件复制到node06、node07最终修改了权限和用户组。 运行各节点 ,systemctl restart rabbitmq-server 在node06运行: # rabbitmqctl stop_app# rabbitmqctl reset# rabbitmqctl join_cluster rabbit@node05# rabbitmqctl start_app 在node07上运行 : # rabbitmqctl stop_app# rabbitmqctl reset# rabbitmqctl join_cluster rabbit@node05 --ram# rabbitmqctl start_app 检查集群的状态 # rabbitmqctl cluster_status
如需移除集群中的节点,可使用以下命令: # rabbitmqctl stop_app# rabbitmqctl reset# rabbitmqctl start_app
严格来说,rabbitmqctl reset 不属于集群命令。reset的功能是将node节点恢复到空白状态,包括但不限于用户信息、虚拟主机信息和所有信息 持久消息。在集群下,节点可以通过这个命令离开集群。
磁盘节点应记录元数据的变化。当节点离开集群时,所有磁盘节点都应记录此信息。如果磁盘节点离开集 当组不需要命令时,它会导致集群认为节点出现故障,并将等待节点恢复,以允许新节点添加。因此,当磁盘节点被暴力从集群中分离时,就会有 可能会导致集群永久性无法改变(不仅仅是添加新节点,包括申报队列、交换器等操作)。RabitMQ常用命令管理虚拟主机 rabbitmqctl add_vhost [vhost_name] rabbitmqctl delete_vhost [vhost_name] rabbitmqctl list_vhosts 用户管理 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)
例如,赋予xxxadministrator角色
rabbitmqctl set_user_tags xxx administrator
查看队列 rabbitmqctl list_queues 查看交换器 rabbitmqctl list_exchanges 查看绑定 rabbitmqctl list_bindings