1.RabbitMQ节点标识
RabbitMQ节点通过节点名称来标识,每个节点名称包含两个部分:前缀和主机名。
例如:rabbit@node1.message.svc.local。rabbit是前缀,node1.message.svc.local是主机名。
集群中的每个节点的名称必须是唯一的。如果有多个节点运行在同一台机器上(一般开发环境为了节省资源会部署在同一台机器上),可以通过前缀来进行区分,例如:rabbit1@hostname, rabbit2@hostName
在集群中依赖阶段名称来进行标识和互相通讯,所以每个节点的主机名必须要正常解析,通常是由DNS解析或者本地hosts文件配置。当节点启动的时候,会检查当前节点是否标识了节点名称(配置RABBITMQ_NODENAME环境变量),如果没有配置节点名称,当前节点会解析他的hostname拼上rabbit来计算出他的节点名称。例如:rabbit@6018822f21e7
2.RabbitMQ访问端口
- 4369 epmd端口,其他rabbitMQ节点和命令行用来查询服务端口的守护进程
- 5672,5671 AMQP协议端口,就是提供给客户端连接访问的服务端口,5671支持TLS安全访问
- 25672 集群中节点间通讯端口,动态分配,value = AMQP端口 + 20000,如非必要该端口不会暴露出来
- 35672-35682 客户端工具和节点间的通讯端口 value = 集群通讯端口 + 10000
- 15672 后台管理页面端口,也是HTTP API访问端口
- 61613,61614 STOMP协议端口,61614是TLS端口
- 1883,8883 MQTT协议端口,8883是TLS端口
- 15674 STOMP websocket端口
- 15675 MQTT websocket端口
- 15692 Prometheus监控端口
AMQP协议: 即Advanced Message Queuing Protocol, 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
STOMP协议,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。由于其设计简单,很容易开发客户端,因此在多种语言和多种平台上得到广泛应用。
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议
3.EPMD和内部节点通讯
EPMD:一个小的额外的守护进程,运行在每个rabbitMQ节点旁边,用来发现运行的节点监听哪个端口。可以被集群中的其他节点和客户端工具访问,默认端口是4369,可以通过ERL_EPMD_PORT环境变量来配置。集群中的所有主机必须使用相同的EPMD端口。
节点和客户端工具访问特点节点步骤:
1. 把hostname解析成IPV4或IPV6地址
2. 访问上面解析出来的地址上的epmd端口号
3. 查询EPMD所在节点的rabbitmq提供的访问端口(默认5672)
4. 通过解析出来的IP地址和epmd查询出来的端口连接rabbitmq服务节点
5. 处理节点通讯
4.集群副本
集群中的数据和操作状态是所有节点共享的,但是消息队列默认只会存在其中某一个节点上,虽然可以通过所有节点来访问和修改任何一个队列。在集群中想要某个队列在多个节点上存在副本,可以考虑集群队列和镜像队列。
rabbitMQ不像zookeeper这种分布式集群,存在leader和follower节点,它的所有节点的角色都是平等的,没有特殊节点。
5.Erlang cookie
rabbitMQ节点之间或者节点和客户端工具之间互相通讯需要相同的共享密钥,称之为Erlang Cookie。Erlang Cookie是一个由字母、数字、字符组成的长度为255的字符串,通常存在在本地文件中,需要授权rabbitMQ进程访问。集群中的所有节点必须有相同的Erlang Cookie。如果文件不存在,rabbitMQ服务器启动的时候会创建一个随机值。通常只有开发环境会使用这种随机生成的cookie。
Linux系统 Cookie文件存储在/var/lib/rabbitmq/.erlang.cookie中