热门标签 | 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

 

 谢谢

 


推荐阅读
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 在数据库设计中,谨慎使用外键至关重要。本文探讨了九个关键原因,包括数据完整性的维护、性能优化、系统复杂性的管理、数据迁移的灵活性以及对外部系统的依赖性控制。通过深入分析这些因素,可以帮助开发人员和架构师做出更明智的设计决策,确保数据库系统的高效与稳定。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
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社区 版权所有