
内建集群

目的
- 一个节点挂了, 还能继续运行
- 增加吞吐量
复制元数据:
队列名称和属性(是否持久化自动删除)
交换器的名称类型属性
绑定
弱点
但是, 挂了的那个节点, 里面的信息就丢脸
因为集群不复制队列内容和状态
为了节约空间和性能: 网络开销 持久化写磁盘
磁盘节点
高可用最好还是持久化
节点分为2种:
- 磁盘节点(高可用)
- 内存节点
集群, 至少要有一个磁盘节点, 就是说 如果单节点 一定是磁盘节点
为了高可用, 至少要有2个磁盘节点
因为, 只有一个磁盘节点的情况下, 这个节点崩溃, 任何修改元数据的操作(创建队列交换器)都无法进行了
其他
如果节点1收到了 原来发给节点2的信息 会转个节点2


节点1会把数据给节点2 还是走老路

镜像队列 (高可用队列)

引入 RabbitMQ 的镜像队列机制,将 queue 镜像到 cluster 中其他的节点之上。
在该实现下,如果集群中的一个节点失效了,queue 能自动地切换到镜像中的另一个节点以保证服务的可用性。

在通常的用法中,针对每一个镜像队列都包含一个 master 和多个 slave,分别对应于不同的节点。
slave 会准确地按照 master 执行命令的顺序进行命令执行,故 slave 与 master 上维护的状态应该是相同的。
除了 publish 外所有动作都只会向 master 发送,然后由 master将命令执行的结果广播给 slave 们,故看似从镜像队列中的消费操作实际上是在 master 上执行的。
代码设置

只连集群中的一个节点: 节点1
队列声明的时候, 加上高级属性
all的意思是 每个节点都有这个队列
只生产3条消息到这个队列, 不消费
看节点1: 队列里面有3条消息

看另外一台服务器 节点2: 队列里面同样3条消息

这都因为 队列声明了 属性: x-ha-policy
------all
也可以不这么彻底, 只镜像指定几台
不用all 指定镜像这2台:

控制台配置(管理命令完成)
就是添加 policy

一般是这个 代码的角色一般权限不高 没有配置的权力
因为集群会复制元数据, 随便去哪个节点配都一样
例如,对队列名称以“queue_”开头的所有队列进行镜像,在集群的两个节点上完成进行,
policy 的设置 命令为:
rabbitmqctl set_policy ha-queue-two"^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'



镜像有2个, 自动备份


使用 HAProxy
处理节点选择,故障服务器检测和负载分布可以使用 HAProxy
就是加一个中间层
客户端不再连其中一个节点,而是连中间层
HAProxy里面配置
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
balance roundrobin
server rabbit01 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbit02 node2:5672 check inter 5000 rise 2 fall 3
意思是 客户端连 0.0.0.0:5670就行了
会轮询访问下面2个节点
心跳:
check inter 5000
:5秒一次心跳
rise 2
:2次成功变活
fall 3
:3次失败变死
网友评论