热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Centos7RabbitMQ+Haproxy集群高可用部署

一、  功能和原理介绍RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、

一、   功能和原理介绍

  RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

  AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

  AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

  1、设计集群的目的

    a、  允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 

    b、  通过增加更多的节点来扩展消息通信的吞吐量

  2、  集群配置方式

    RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel

    cluster:  不支持跨网段,用于同一个网段内的局域网,  可以随意的动态增加或者减少,  节点之间需要运行相同版本的RabbitMQ和Erlang

    federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列。

    shovel:连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网。

  3、 节点类型

      RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。

      Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

  4、  Erlang COOKIE

    保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang COOKIE。具体的目录存放在/var/lib/rabbitmq/.erlang.COOKIE

    RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang COOKIE和节点名称,Erlang节点通过交换Erlang COOKIE以获得认证。

  5、集群模式

      RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。

        普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

        镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

        镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:

        Centos 7 RabbitMQ + Haproxy 集群高可用部署

      语法讲解:

        在cluster中任意节点启用策略,策略会自动同步到集群节点

        #rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'    # 应用于说有的队列,所以表达式为“^”

  6、端口

      TCP 4369:用于集群邻居发现;

      TCP 5671、5672:用于AMQP clients使用;

      TCP 15672:用于http api与rabbitadmin访问,后者仅限在management plugin开启时;

      TCP 25672:用于erlang分布式节点/工具通信

 

二、部署

   1、单节点部署

    a、包安装
      #   yum install rabbitmq-server.noarch

      #   配置文件在:  /etc/rabbitmq/rabbitmq.config 配置文件使用 “%%” 注释配置

    b、启动服务,设置开机自启动

      #  systemctl enable rabbitmq-server.service

      #   systemctl start rabbitmq-server.service

    c、查看状态

      #  systemctl status rabbitmq-server.service -l

      Centos 7 RabbitMQ + Haproxy 集群高可用部署

      Centos 7 RabbitMQ + Haproxy 集群高可用部署

     d、RABBITMQ页面(web)管理

 

         management plugin默认就在RabbitMQ的发布版本中,

       启用web插件

        # rabbitmq-plugins enable rabbitmq_management

        Centos 7 RabbitMQ + Haproxy 集群高可用部署

 

       关闭web插件

        # rabbitmq-plugins disable rabbitmq_management

       浏览器访问:http://rabbitmq-server-IP:15672  如下图,账号密码随后创建。

      Centos 7 RabbitMQ + Haproxy 集群高可用部署

 

     e、Management plugin登录账号管理   (如果是集群,在一个节点修改,便可以全部生效,配置文件不会同步)

      1、查看用户

        #  rabbitmqctl list_users

          Centos 7 RabbitMQ + Haproxy 集群高可用部署

      2、  guest账号

          rabbit默认只有guest账号,可以使用guest:guest 登录web

         Centos 7 RabbitMQ + Haproxy 集群高可用部署

      3、CLI创建登录账号

         #   rabbitmqctl add_user username RABBIT_PASS   (语法)

      4、  设置账号的属性

         #    rabbitmqctl set_user_tags username administrator    #用户设置为管理员角色  

          Centos 7 RabbitMQ + Haproxy 集群高可用部署

         #    rabbitmqctl set_permissions username ".*" ".*" ".*"    #分配权限

           Centos 7 RabbitMQ + Haproxy 集群高可用部署

       5、登录

        Centos 7 RabbitMQ + Haproxy 集群高可用部署

     f、查看端口

      Centos 7 RabbitMQ + Haproxy 集群高可用部署

    --------------------到此,单节点配置完成。

 

  2、集群部署--普通模式

    a、环境

      三台主机。系统: CentOS Linux release 7.4.1708 (Core)

      主机名      IP                      节点类型

         cehp1  10.6.32.20       Master-Disk node

      ceph2  10.6.32.21    slave-RAM node

      ceph3  10.6.32.22    slave-RAM node

    b、关闭从节点服务 (ceph2 、ceph3)

      # rabbitmqctl stop

      # systemctl stop rabbitmq-server.service

    c、设置不同节点间同一认证的Erlang COOKIE 

      采用从主节点copy的方式保持COOKIE的一致性

      # scp /var/lib/rabbitmq/.erlang.COOKIE root@ceph2:/var/lib/rabbitmq/.erlang.COOKIE

      # scp /var/lib/rabbitmq/.erlang.COOKIE root@ceph3:/var/lib/rabbitmq/.erlang.COOKIE

    d、启用节点,并查询状态

      # rabbitmq-server -detached

      # rabbitmqctl cluster_status

        Centos 7 RabbitMQ + Haproxy 集群高可用部署

    e、组建集群(ceph2、cehp3)

      # rabbitmqctl stop_app

      # rabbitmqctl join_cluster rabbit@ceph1     (rabbit代表集群名,ceph1代表集群节点,如果需要使用内存节点,增加一个”--ram“的参数即可,例:" rabbitmqctl join_cluster --ram rabbit@ceph1")

      # rabbitmqctl start_app

      # rabbitmqctl cluster_status

      Centos 7 RabbitMQ + Haproxy 集群高可用部署

      可以看出,加入集群后默认均为 disc node

    f、修改 disc node 到 ram node 

      # rabbitmqctl stop_app

      # rabbitmqctl change_cluster_node_type ram         #(需要修改那个节点便在那个节点执行操作)

      # rabbitmqctl start_app

        Centos 7 RabbitMQ + Haproxy 集群高可用部署

    g、web 查看状态

       Centos 7 RabbitMQ + Haproxy 集群高可用部署

      如果需要在web 看到从节点信息,需要在从节点上也开启web插件。

       --------到此,默认集群配置完成。

     维护:  

      如果要退出集群

        1、从节点:(ceph3 为例)

          #rabbitmqctl stop_app

          # rabbitmqctl reset

          # rabbitmqctl start_app

          Centos 7 RabbitMQ + Haproxy 集群高可用部署

 

        2、在集群主节点查看:

          #  rabbitmqctl cluster_status

          Centos 7 RabbitMQ + Haproxy 集群高可用部署

 

   3、镜像集群

     在集群中执行即可

      # rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'       #  #所有队列都进行镜像

  4、rabbitmq-web Haproxy 配置    

#---------------------------------------------------------------------
# listen Rabbitmq-cluster-web server
#---------------------------------------------------------------------
listen rabbitmq-web
    mode tcp
    bind 10.6.32.254:15671
    balance roundrobin
    server controller1 10.6.32.20:15672 check inter 2000 rise 2 fall 5
    server controller2 10.6.32.21:15672 check inter 2000 rise 2 fall 5
    server controller3 10.6.32.22:15672 check inter 2000 rise 2 fall 5  

 

    openstack nova 调用 openstack

      # vim /etc/nova/nova.conf

      [DEFAULT]

       transport_url = rabbit://rabbitmq-username:RABBIT_PASS@controller1:5672,rabbitmq-username:RABBIT_PASS@controller2:5672,rabbitmq-username:RABBIT_PASS@controller3:5672

 

 谢谢

 


推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 消息中间件RabbitMQ 高级特性之消费端ACK与重回队列
    什么是消费端的ACK和重回队列?消费端的手工ACK和NACK消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕机等严重问题 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
alxg
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有