rabbitmq-集群简要

阅读量: zyh 2020-01-02 11:12:58
Categories: > Tags:

引用

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_connectionsrabbitmqctl list_mqtt_connectionsrabbitmqctl list_stomp_connectionsrabbitmqctl list_usersrabbitmqctl list_vhosts

rabbitmq-diagnostics environmentrabbitmq-diagnostics status则会返回当前节点的数据,毕竟主机名是不一致的。

因此,以一些监控API为例,无需向每一个节点发出请求,接收http api请求的节点会将请求散布到其它节点并最终将响应数据聚合在一起。

如果多个节点均启用了管理插件,则管理员可以通过任意节点访问管理UI。

三节点集群

  1. 正常方式启动三节点服务
# on rabbit1
rabbitmq-server -detached
# on rabbit2
rabbitmq-server -detached
# on rabbit3
rabbitmq-server -detached
  1. 节点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.
  1. 节点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.