原文:(十)RabbitMQ消息队列-高可用集群部署实战

前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ。

RabbitMQ集群基本概念

Rabbit模式大概分为以下三种:单主机模式、普通集群模式、镜像集群模式。

  • 单主机模式:

    • RabbitMQ服务运行在单独的一台主机中,通常生产环境不使用该模式,性能有限,并且如果服务器宕机服务将完全不可用。
  • 普通集群模式

    • 一说到集群问题瞬间变得复杂多了。首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。

    • 当消息进入A节点的Queue中后,Consumer从B节点拉取消息时,RabbitMQ会临时在两个节点间进行消息传输,把A中的消息实体取出并经过B发送给Consumer。所以Consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立Queue。否则Consumer如果只连接一个节点区消息会造成该节点的性能瓶颈。

    • 该模式存在一个问题就是当其中一个节点故障后,其他节点无法取到故障节点中还未消费的消息。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,那就杯具了!

  • 镜像集群模式

    • 前面讲到RabbitMQ的普通集群模式不同节点间只同步队列结构不同步消息。镜像模式会把队列结构和消息都存在于多个节点,属于RabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大量消耗。所以这种模式应用于可靠性要求较高的场合中。
  • 内存节点与磁盘节点

    • RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是会放在磁盘。原则上一个集群至少有一个磁盘节点。在实际使用中会发现所谓的磁盘节点是只用来存储集群的配置信息,也就是说如果集群中没有磁盘节点,当所有节点关机后集群的配置信息就会丢失。在进行性能测试时两个模式的节点订阅发布消息的性能没有太大差距。
  • 多节点负载分发

    • RabbitMQ集群模式是没有中心节点的,并且在连接集群的时候实际上Consumer是连接其中某一台节点,连接方法和单主机模式一致。那就遇到一个尴尬的问题,怎么保证Consumer均匀的连接到多个节点。以下是我的一些思考,提供了两个思路。

      • 1、通过负载均衡设备来实现流量分发。可以使用F5硬件负载均衡,如果没有F5的硬件负载均衡设备也可以使用想LVS等服务,当Consumer连接集群时实际是先经过负载均衡。

      • 2、虽然负载均衡设备通常都很稳定,但这样一来RabbitMQ的集群就有了中心节点。我们在使用的时候是这样的,首先将集群中所以节点的IP放在一个数组中,app在连接RabbitMQ的时候会从数组中随机选择一个IP来连接,然后把连接的节点的IP缓存到服务器,如果连接超时则重新随机选择其他节点来连接。通过这种方式来实现app流量的分发。

现在对集群的基本概念都有了了解,下面我们一起来搭建一个普通模式的集群。

RabbitMQ集群部署

我用5台服务器来搭建一个5个节点的集群,其中10.99.121.150为磁盘节点,其他服务器为内存节点。对服务器的命名如下:

10.99.121.150 RMQ_D_150

10.99.121.151 RMQ_M_151

10.99.121.152 RMQ_M_152

10.99.121.153 RMQ_M_153

10.99.121.154 RMQ_M_154

在前面第三章讲过单主机的RabbitMQ如何安装http://blog.csdn.net/super_rd/article/details/70241007

先安装好5台单主机的RabbitMQ。

修改每一台主机的host文件:

vi /etc/hosts
10.99.121.150 RMQ_D_150
10.99.121.151 RMQ_M_151
10.99.121.152 RMQ_M_152
10.99.121.153 RMQ_M_153
10.99.121.154 RMQ_M_154

修改每一台主机的主机名:(我没有一一列出)

vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME= RMQ-M-154

打开每一台主机的相应端口:

firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=4369/tcp
systemctl restart firewalld.service

同步每个节点Cookie(在150执行)

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。

scp /root/.erlang.cookie root@10.99.121.151:/root/
scp /root/.erlang.cookie root@10.99.121.152:/root/
scp /root/.erlang.cookie root@10.99.121.153:/root/
scp /root/.erlang.cookie root@10.99.121.154:/root/

所以节点重启

rabbitmqctl stop
rabbitmq-server -detached

连接集群

rabbitmqctl stop_app(注意硬盘节点先不要执行)
rabbitmqctl join_cluster --ram rabbit@RMQ_D_150(连接到任意一个已经加入集群的节点均可)
rabbitmqctl start_app
rabbitmqctl cluster_status //查看集群状态
//磁盘节点,join_cluster 命令去掉--ram参数即可。
//在RabbitMQ集群里,必须至少有一个磁盘节点存在(磁盘节点用来存储集群状态)。

远程访问配置

配置集群之后需要重新添加账号

默认网页是不允许访问的,需要增加一个用户修改一下权限,代码如下:

rabbitmqctl add_user superrd superrd  //添加用户
rabbitmqctl set_permissions -p / superrd ".*" ".*" ".*" //添加权限
rabbitmqctl set_user_tags superrd administrator //修改用户角色

在浏览器输入任意一个节点的WEB管理插件http://ip:15672,在Overviem视图找到Nodes选项卡可以看到所有的节点。

删除节点:

修改host和主机名,同之前的步骤。

在要脱离集群的节点执行:

rabbitmqctl  stop_app
rabbitmqctl rest
rabbitmqctl start_app

或者在其他节点执行:(例如删除RMQ_M_154节点)

rabbitmqctl stop_app
rabbitmqctl forget_cluster_node rabbit@RMQ_M_154

增加节点:

在已有节点复制cookies到新的节点

scp /root/.erlang.cookie root@10.99.121.155:/root/  //在已有节点执行。
//以下在要新增的节点执行。
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@RMQ_M_154
rabbitmqctl start_app

查看集群状态:

rabbitmqctl cluster_status

RabbitMQ镜像集群配置

尽管我们部署好了普通模式的集群,但因为节点间只同步队列结构并不进行消息的同步,对于一些可靠性要求较高的场景需要对队列中的消息也同步到所以节点。

使用Rabbit镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。

策略的修改可以通过命令也可以通过WEB,如果我是通过WEB来修改的,非常简单。

Pattern:“^” 表示所有匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。

ha-mode:“all”代表同步到所以节点。

填写好后点击“Add policy”应用配置策略。可以看到已经新建的策略。

新建一个队列,然后查看队列列表。可以看到一个“+4”说明数据被保存了四份。

点击队列查看队列详情。可以看到队列是在150节点创建的,但是同步到了其余四个节点。

RabbitMQ技术交流QQ群:327034977(添加时请备注RabbitMQ)

(十)RabbitMQ消息队列-高可用集群部署实战的更多相关文章

  1. RabbitMQ消息队列(十)-高可用集群部署实战

    前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. RabbitMQ集群基本概念 Rabbit模式大概分为以下三种 ...

  2. RabbitMQ的高可用集群部署

    RabbitMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RabbitMQ部署的三种模式 1.1 单一模式 单机情况下不做集群, 仅仅运行一个RabbitMQ. # docker-c ...

  3. RocketMQ的高可用集群部署

    RocketMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RocketMQ 集群物理部署结构 Rocket 物理部署结构 Name Server: 单点,供Producer和Cons ...

  4. rocketmq高可用集群部署(RocketMQ-on-DLedger Group)

    rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...

  5. hbase高可用集群部署(cdh)

    一.概要 本文记录hbase高可用集群部署过程,在部署hbase之前需要事先部署好hadoop集群,因为hbase的数据需要存放在hdfs上,hadoop集群的部署后续会有一篇文章记录,本文假设had ...

  6. MySQL MHA 高可用集群部署及故障切换

    MySQL MHA 高可用集群部署及故障切换 1.概念 2.搭建MySQL + MHA 1.概念: a)MHA概念 : MHA(MasterHigh Availability)是一套优秀的MySQL高 ...

  7. rabbitmq+ keepalived+haproxy高可用集群详细命令

    公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...

  8. RabbitMQ系列之高可用集群

    为了实现高可用,我采用LVS+双节点RabbitMq , 架构图如下: 在RabbitMQ之前放了LVS, LVS 采用 rr 轮询算法 , 目的是将请求平均分配到两个真实节点,并配置5672端口监控 ...

  9. Kubernetes容器集群 - harbor仓库高可用集群部署说明

    之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...

随机推荐

  1. 洛谷 P1757 通天之分组背包

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

  2. 信号 signal sigaction补充

    目前linux中的signal()是通过sigation()函数实现的. 由signal()安装的实时信号支持排队,同样不会丢失. 先看signal 和 sigaction 的区别: 关键是 stru ...

  3. 开源性能测试工具——jemeter介绍+安装说明

    一. Apache JMeter介绍 1. Apache JMeter是什么 Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量. ...

  4. JS错误记录 - To-do List

    var data = (localStorage.getItem('todolist'))? JSON.parse(localStorage.getItem('todolist')) : { todo ...

  5. django-rest-framework框架 第四篇 认证Authentication

    认证Authentication 什么是身份认证 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或与其签名的令牌)关联的机制. 视图的最开始处运行身份验证 在权限和限制检查发生之前,以及在允许 ...

  6. [Vue + TS] Create Type-Safe Vue Directives in TypeScript

    Directives allow us to apply DOM manipulations as side effects. We’ll show you how you can create yo ...

  7. Windows下编译OpenSSL(使用VS2013)

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  8. vue项目在其他电脑运行报错

    解决方法1.先删除node_modules文件夹2.$ cnpm cache clean 命令清除掉cache缓存3.cnpm install4.npm run dev

  9. GO语言学习(四)GO语言语言结构

    Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello ...

  10. <九度 OJ>题目1012:畅通project

    题目描写叙述: 某省调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.省政府"畅通project"的目标是使全省不论什么两个城镇间都能够实现交通(但不一定 ...