Centos 7 RabbitMQ + Haproxy 集群高可用部署
一、 功能和原理介绍
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),具体的实现策略如下所示:

语法讲解:
在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


d、RABBITMQ页面(web)管理
management plugin默认就在RabbitMQ的发布版本中,
启用web插件
# rabbitmq-plugins enable rabbitmq_management

关闭web插件
# rabbitmq-plugins disable rabbitmq_management
浏览器访问:http://rabbitmq-server-IP:15672 如下图,账号密码随后创建。

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

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

3、CLI创建登录账号
# rabbitmqctl add_user username RABBIT_PASS (语法)
4、 设置账号的属性
# rabbitmqctl set_user_tags username administrator #用户设置为管理员角色

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

5、登录

f、查看端口

--------------------到此,单节点配置完成。
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

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

可以看出,加入集群后默认均为 disc node
f、修改 disc node 到 ram node
# rabbitmqctl stop_app
# rabbitmqctl change_cluster_node_type ram #(需要修改那个节点便在那个节点执行操作)
# rabbitmqctl start_app

g、web 查看状态

如果需要在web 看到从节点信息,需要在从节点上也开启web插件。
--------到此,默认集群配置完成。
维护:
如果要退出集群
1、从节点:(ceph3 为例)
#rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl start_app

2、在集群主节点查看:
# rabbitmqctl cluster_status

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
谢谢
Centos 7 RabbitMQ + Haproxy 集群高可用部署的更多相关文章
- Rabbitmq集群高可用部署详细
序言 清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣.无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下 ...
- 原创hadoop2.6.4 namenode HA+Federation集群高可用部署
今天下午刚刚搭建了一个高可用hadoop集群,整理如下,希望大家能够喜欢. namenode HA:得有两个节点,构成一个namenode HA集群 namenode Federation:可以有 ...
- Rabbitmq集群高可用测试
Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...
- RabbitMQ从零到集群高可用(.NetCore5.0) -高可用集群构建落地
系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...
- RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列
系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...
- openstack pike 集群高可用 安装 部署 目录汇总
# openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...
- bitmq集群高可用测试
Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...
- 浅谈MySQL集群高可用架构
前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...
- Eureka 集群高可用配置.
SERVER:1 server: port: 1111 eureka: instance: hostname: ${spring.cloud.client.ip-address} instance-i ...
随机推荐
- Git安装和基本使用(1)
参考廖雪峰GIt教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137 ...
- delphi多语言
LoadLangFromStrings http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.Types.TLang http://blog.c ...
- UICollectionView setPrefetchingEnabled
UICollectionView 开启是否开启预加载,如果开启,cell在没显示的时候就回去调用cellForIndex…方法,如果没开启,cell只有在显示的时候才会去调用cellForIndex… ...
- delphi异常捕获try except语句 和 try finally语句用法
原文地址:delphi try except语句 和 try finally语句用法以及区别作者:1865898133 一直写程序都没管他们,也尽量很少用,今天终于想把他给弄个明白,在网上找来,记下! ...
- 【357】sorted 函数高级用法
参考:Python 内置函数sorted()在高级用法 - Brad1994 - 博客园 sorted 函数主要实现的就是对于可迭代对象进行排序,对于一维数据排序很好理解与实现,直接调用即可,本文主要 ...
- python小实例一:简单爬虫
本文所谓的爬虫就是通过本地远程访问url,然后将url的读成源代码形式,然后对源代码进行解析,获取自己需要的数据,相当于简单数据挖掘.本文实现的是将一个网页的图片爬出保存到本地的过程,例子很简单,用的 ...
- 如何將字串yyyyMMddHHmmss轉成Datetime呢?
有朋友在FB上問到,他們將日期的分隔符號都置換成空字串後的字串,要如何將它再轉回成DateTime呢? 例如日期 2013/04/02 14:08:37 會轉成 20130402140837 . 要如 ...
- zTree插件 角色、部门、人员分类选择
// 传参数调用 function test(){roleOrOrgSelect(3,function(data){console.log(data);});} /** * * @param type ...
- Module build failed: Error: Cannot find module 'url-loader' 的坑
本文地址:http://www.cnblogs.com/jying/p/8280956.html 开发环境:react.webpack.es5 引用图片报错:Module build failed: ...
- 3D模板阴影原理
3D模板阴影原理 1:先从3dsMax中导出一个简单的场景,一个园环,球,平面. 2:园环直接面向光源,园环对球体来说是一个光线的阻挡物,园环在它上面形成阴影,同时,园环和球体对平面来说是光线的阻挡物 ...