Ubuntu 系统安装 RabbitMQ
写在前面 链接rabbitMQ官网 php教程。
1.关于RabbitMQ安装
由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令:
sudo apt-get install erlang-nox
安装rabbitMQ
sudo apt-get update sudo apt-get install rabbitmq-server
2.RabbitMQ基本操作
启动:sudo rabbitmq-server start 关闭: sudo rabbitmq-server stop 重启: sudo rabbitmq-server restart 查看状态:sudo rabbitmqctl status
3.RabbitMQ功能
1.路由 2.队列 3.持久性 4.广播 5.任务确认 6.负载均衡 参见官网手册 写的非常具体详细。4.RabbitMQ集群
1.主机名解析 RabbitMQ节点使用域名相互寻址,因此所有集群成员的主机名必须能够从所有集群节点解析,可以修改hosts文件或者使用DNS解析。 如果要使用节点名称的完整主机名(RabbitMQ默认为短名称),并且可以使用DNS解析完整的主机名,则可能需要调查设置环境变量 RABBITMQ_USE_LONGNAME = true2.集群节点
RAM节点和disk节点 disk持久化 ram非持久队列down掉后数据消失 RAM节点是一种特殊情况,可用于改善高排队,交换或绑定流失的性能集群。 变更当前节点类型需要关闭当前节点 rabbitmqctl stop_app 使用 rabbitmqctl change_cluster_node_type disc3.集群节点验证
RabbitMQ节点和CLI工具(例如rabbitmqctl)使用cookie来确定它们是否被允许相互通信,要使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang Cookie. Cookie只是一个字符串,最多可以有255个字符。它通常存储在本地文件中。该文件必须只能由所有者访问(400权限)。每个集群节点必须具有相同的 cookie,文件位置/var/lib/rabbitmq/.erlang.cookie, 把rabbit2、rabbit3设置成和rabbit2一样的即可,权限是4004.正常方式启动所有节点
rabbitmq-server -detached rabbitmq-server -detached rabbitmq-server -detached
5.集群中MQ的操作
1.查看集群状态[root@rabbit1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]}]}, {running_nodes,[rabbit@rabbit1]}, {cluster_name,<<"rabbit@rabbit1">>}, {partitions,[]}, {alarms,[{rabbit@rabbit1,[]}]}]
2.加入一个集群
1)停止要加入的mq应用程序 rabbitmqctl stop_app 2)加入目标mq集群 rabbitmqctl join_cluster rabbit@rabbit1 3)启动要加入的mq应用程序 rabbitmqctl start_app注意:加入集群会隐式重置节点,从而删除此节点上以前存在的所有资源和数据 加入后查看状态[root@rabbit1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}, {cluster_name,<<"rabbit@rabbit1">>}, {partitions,[]}, {alarms,[{rabbit@rabbit2,[]},{rabbit@rabbit1,[]}]}]
通过遵循上述步骤,我们可以在集群正在运行的同时随时向集群添加新节点
已加入群集的节点可随时停止。他们也可以崩溃。在这两种情况下,群集的其余部分都会继续运行,并且节点在再次启动时会自动“跟上”(同步)其他群集节点。*当整个集群关闭时,最后一个关闭的节点必须是第一个要联机的节点。
如果要脱机的最后一个节点无法恢复,可以使用forget_cluster_node命令将其从群集中删除 如果所有集群节点同时停止并且不受控制(例如断电),则可能会留下所有节点都认为其他节点在其后停止的情况。在这种情况下,您可以在一个节点上使用force_boot命令使其再次可引导 *3.集群移除节点
当节点不再是节点的一部分时,需要从集群中明确地删除节点。我们首先从集群中删除rabbit@rabbit3,并将其返回到独立操作 1)我们停止RabbitMQ应用程序 rabbitmqctl stop_app 2)重置节点 rabbitmqctl reset 3)重新启动RabbitMQ应用程序 rabbitmqctl start_app4.远程删除节点(处理节点无响应时)
1)关闭要删除的节点rabbitmqctl stop_app
2)远程其他服务器使用 rabbitmqctl forget_cluster_node rabbit@rabbit1
请注意,rabbit1仍然认为它与rabbit2集群 ,并试图启动它将导致错误。我们需要重新设置才能重新启动。 3) 被删除的节点 rabbitmqctl reset #必须要重置 4)被删除节点重启 单独使用 rabbitmqctl start_app 6.主机名更改
RabbitMQ节点使用主机名相互通信。因此,所有节点名称必须能够解析所有集群对等体的名称。对于像rabbitmqctl这样的工具也是如此。
除此之外,默认情况下,RabbitMQ使用系统的当前主机名命名数据库目录。如果主机名更改,则会创建一个新的空数据库。为避免数据丢失,设置固定且可解析的主机名至关重要。每当主机名更改时,必须重新启动RabbitMQ节点。
使用rabbit @ localhost 作为代理节点名称可以实现类似的效果。此解决方案的影响是群集不起作用,因为所选主机名不会从远程主机解析为可路由地址。从远程主机调用时,rabbitmqctl命令同样会失败。没有这种弱点的更复杂的解决方案是使用DNS,例如,如果在EC2上运行,则使用 Amazon Route 53。如果要使用nodename的完整主机名(RabbitMQ默认为短名称),并且可以使用DNS解析该完整主机名,则可能需要调查设置环境变量 RABBITMQ_USE_LONGNAME = true。
集群手册链接