2024-01-14  阅读(7)
原文作者:Java充电社 原文地址: http://www.itsoku.com/course/22/392

相关视频地址:https://www.bilibili.com/video/BV1cb4y1o7zz?p=83

14.1、clustering

1)使用集群的原因

最开始我们介绍了如何安装及运行 RabbitMQ 服务,不过这些是单机版的,无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 RabbitMQ服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个RabbitMQ 集群才是解决实际问题的关键。

2)搭建步骤

  1. 修改 3 台机器的主机名称
        vim /etc/hostname
  1. 配置各个节点的 hosts 文件,让各个节点都能互相识别对方
        vim /etc/hosts
        10.211.55.74 node1
        10.211.55.75 node2
        10.211.55.76 node3
  1. 以确保各个节点的 cookie 文件使用的是同一个值,在 node1 上执行远程操作命令
        scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
        scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
  1. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以下命令)
        rabbitmq-server -detached
  1. 在节点 2 执行
        # rabbitmqctl stop 会将 Erlang 虚拟机关闭, rabbitmqctl stop_app 只关闭 RabbitMQ 服务
        rabbitmqctl stop_app
        rabbitmqctl reset
        rabbitmqctl join_cluster rabbit@node1
        # 只启动应用服务
        rabbitmqctl start_app
  1. 在节点 3 执行
        rabbitmqctl stop_app
        rabbitmqctl reset
        rabbitmqctl join_cluster rabbit@node2
        rabbitmqctl start_app
  1. 集群状态
        rabbitmqctl cluster_status
  1. 需要重新设置用户
        # 创建账号
        rabbitmqctl add_user admin 123
        # 设置用户角色
        rabbitmqctl set_user_tags admin administrator
        # 设置用户权限
        rabbitmqctl set_permissions -p "/" admin "." "." ".*"
  1. 解除集群节点(node2 和 node3 机器分别执行)
        rabbitmqctl stop_app
        rabbitmqctl reset
        rabbitmqctl start_app
        rabbitmqctl cluster_status
        # node1 机器上执行
        rabbitmqctl forget_cluster_node rabbit@node2

14.2、镜像队列

1)使用镜像的原因

如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过 publisherconfirm 机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此, 一般不希望遇到因单点故障导致的服务不可用。

引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

2)搭建步骤

  1. 启动三台集群节点
  2. 随便找一个节点添加 policy

202401142236573871.png

  1. 在 node1 上创建一个队列发送一条消息,队列存在镜像队列

202401142236578552.png

  1. 停掉 node1 之后发现 node2 成为镜像队列

202401142236583253.png

  1. 就算整个集群只剩下一台机器了,依然能消费队列里面的消息,说明队列里面的消息被镜像队列传递到相应机器里面了

Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文