(十)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消息队列-高可用集群部署实战的更多相关文章
- RabbitMQ消息队列(十)-高可用集群部署实战
前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. RabbitMQ集群基本概念 Rabbit模式大概分为以下三种 ...
- RabbitMQ的高可用集群部署
RabbitMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RabbitMQ部署的三种模式 1.1 单一模式 单机情况下不做集群, 仅仅运行一个RabbitMQ. # docker-c ...
- RocketMQ的高可用集群部署
RocketMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RocketMQ 集群物理部署结构 Rocket 物理部署结构 Name Server: 单点,供Producer和Cons ...
- rocketmq高可用集群部署(RocketMQ-on-DLedger Group)
rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...
- hbase高可用集群部署(cdh)
一.概要 本文记录hbase高可用集群部署过程,在部署hbase之前需要事先部署好hadoop集群,因为hbase的数据需要存放在hdfs上,hadoop集群的部署后续会有一篇文章记录,本文假设had ...
- MySQL MHA 高可用集群部署及故障切换
MySQL MHA 高可用集群部署及故障切换 1.概念 2.搭建MySQL + MHA 1.概念: a)MHA概念 : MHA(MasterHigh Availability)是一套优秀的MySQL高 ...
- rabbitmq+ keepalived+haproxy高可用集群详细命令
公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...
- RabbitMQ系列之高可用集群
为了实现高可用,我采用LVS+双节点RabbitMq , 架构图如下: 在RabbitMQ之前放了LVS, LVS 采用 rr 轮询算法 , 目的是将请求平均分配到两个真实节点,并配置5672端口监控 ...
- Kubernetes容器集群 - harbor仓库高可用集群部署说明
之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...
随机推荐
- 【习题 8-2 UVA-1610】Party Games
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 字符串排序后 显然是n/2-1和n/2这两个字符串进行比较. 设为a,b 找到第一个不相同的位置. 即0..i-1是相同的前缀,然后 ...
- IOS越狱开发错误解决
Questions: haseScriptExecution Run\ Script /Users/jun/Library/Developer/Xcode/DerivedData/ButtonMa ...
- Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
- gullo.me 的 natvps
gullo.me 的 natvps 1. 在下面的地址中输入内网 IP,查看许可的网络资源 https://hosting.gullo.me/plugin/support_manager/knowle ...
- opera mini 改服
opera mini 改服 下载 opera 和 opera mini ftp://ftp.opera.com/pub/opera/android/mini/ ftp://ftp.opera.com/ ...
- 36.intellij idea 如何一键清除所有断点
转自:https://www.cnblogs.com/austinspark-jessylu/p/7799212.html 1.在idea左下方找到"View Breakpoints&quo ...
- python 新模块或者包的安装方法
主要介绍通过pip自动工具来安装需要的包. 1,先安装pip 下载pip的包(包括setup.py文件) cmd载入到pip本地文件所在路径,使用命令进行安装. python setup.py ins ...
- python 时间合集 一
**以下内容均为我个人的理解,如果发现错误或者疑问可以联系我共同探讨**#### python中4种时间表示形式:1.格式化时间字符串 2.时间戳 3.时间元祖 4.时间对象- string_time ...
- 支持10W高并发请求的IIS Web服务器常用设置
支持高并发的IIS Web服务器常用设置 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows ...
- 3.阿里巴巴dubbo分布式rpc框架详细使用教程
dubbo是阿里巴巴开源的分布式服务框架,致力于提供高性能和透明化的rpc远程服务调用方案,以及soa服务治理方案,如果没有分布式需求,是不需要dubbo的,分布式环境dubbo的使用架构官方给出了一 ...