引用
https://www.rabbitmq.com/clustering.html#cluster-formation
节点数量
奇数,最少3个,不建议超过7个。
节点名
节点启动的时候,rabbitmq通过RABBITMQ_NODENAME
来获取节点名,如果没有获取到,则通过自动生成rabbit@hostname
的节点名
💥如果hostname
是FQDN,则rabbitmq需要将环境变量RABBITMQ_USE_LONGNAME
设定为true
。
如果是CLI,则也可以通过--longnames
来设定。
配置文件~/.erlang.cookie确保信息一致。
节点名解析检查
https://www.rabbitmq.com/networking.html#dns-verify-resolution
将node2.cluster.local.svc解析为ipv4
rabbitmq-diagnostics resolve_hostname node2.cluster.local.svc --address-family IPv4 --offline
数据复制
虚拟主机、交换器、用户和权限会自动复制到集群中的所有节点都在节点之间复制。但默认情况下,消息队列只会驻留在一个节点上,不过其它节点依然可以访问这个消息队列。
共享密钥
集群之间以及客户端访问通过共享密钥erlang.cookie
来确定是否允许互相访问。共享密钥文件权限为600
✨不通的部署方式,其密钥文件的路径不一样。
通过包管理器部署
通常位于/var/lib/rabbitmq/.erlang.cookie(由服务器使用)和$HOME/.erlang.cookie(由 CLI 工具使用)
通过docker
使用环境变量RABBITMQ_ERLANG_COOKIE
定义
通过kubernetes
暂无
认证失败
以下信息均为cookie认证失败
Connection attempt from node 'rabbitmqcli-99391-rabbit@warp10' rejected. Invalid challenge reply
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* suggestion: hostname mismatch?
* suggestion: is the cookie set correctly?
* suggestion: is the Erlang distribution using TLS?
* connected to epmd (port 4369) on warp10
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* Authentication failed (rejected by the remote node), please check the Erlang cookie
检查cookie信息
-> rabbitmq-diagnostics erlang_cookie_sources
Cookie File
Effective user: antares
Effective home directory: /home/cli-user
Cookie file path: /home/cli-user/.erlang.cookie
Cookie file exists? true
Cookie file type: regular
Cookie file access: read
Cookie file size: 20
Cookie CLI Switch
--erlang-cookie value set? false
--erlang-cookie value length: 0
Env variable (Deprecated)
RABBITMQ_ERLANG_COOKIE value set? false
RABBITMQ_ERLANG_COOKIE value length: 0
节点类型
节点之间是平等的,没有领导者和追随者。
客户端访问
大多数客户端库都应该接受端点列表(主机名或 IP 地址)作为连接选项。因为节点是平等的,所以客户端可以任意访问端点列表里的节点,而节点会将操作路由到仲裁队列领导者或队列领导者副本。这是对客户端透明的。
关于这个客户端透明,在经典镜像队列中,某些情况下不生效。
指令范围
在集群中,一些非特意返回本地数据的指令均会返回集群范围的数据。例如:
rabbitmqctl list_connections
、rabbitmqctl list_mqtt_connections
、rabbitmqctl list_stomp_connections
、rabbitmqctl list_users
、 rabbitmqctl list_vhosts
而rabbitmq-diagnostics environment
和rabbitmq-diagnostics status
则会返回当前节点的数据,毕竟主机名是不一致的。
因此,以一些监控API为例,无需向每一个节点发出请求,接收http api请求的节点会将请求散布到其它节点并最终将响应数据聚合在一起。
如果多个节点均启用了管理插件,则管理员可以通过任意节点访问管理UI。
三节点集群部署
- 正常方式启动三节点服务
# on rabbit1
rabbitmq-server -detached
# on rabbit2
rabbitmq-server -detached
# on rabbit3
rabbitmq-server -detached
- 节点2加入
💥任何节点加入之前,都需要先reset
# on rabbit2
rabbitmqctl stop_app
# => Stopping node rabbit@rabbit2 ...done.
rabbitmqctl reset
# => Resetting node rabbit@rabbit2 ...
rabbitmqctl join_cluster rabbit@rabbit1
# => Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbitmqctl start_app
# => Starting node rabbit@rabbit2 ...done.
- 节点3加入
# on rabbit3
rabbitmqctl stop_app
# => Stopping node rabbit@rabbit3 ...done.
# on rabbit3
rabbitmqctl reset
# => Resetting node rabbit@rabbit3 ...
rabbitmqctl join_cluster rabbit@rabbit2
# => Clustering node rabbit@rabbit3 with rabbit@rabbit2 ...done.
rabbitmqctl start_app
# => Starting node rabbit@rabbit3 ...done.