rabbitmq有几种rabbitmq 集群模式式

RabbitMQ两种集群模式配置管理_服务器应用_Linux公社-Linux系统门户网站
你好,游客
RabbitMQ两种集群模式配置管理
作者:彭东稳
RabbitMQ集群的两种模式1)普通模式:默认的集群模式。
2)镜像模式:把需要的队列做成镜像队列。
普通模式:默认的集群模式
RabbitMQ集群中节点包括内存节点、磁盘节点。内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘上。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。一个rabbitmq集群中可以共享user,vhost,exchange等,所有的数据和状态都是必须在所有节点上复制的,对于queue根据集群模式不同,应该有不同的表现。在集群模式下只要有任何一个节点能够工作,RabbitMQ集群对外就能提供服务。
默认的集群模式,queue创建之后,如果没有其它policy,则queue就会按照普通模式集群。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构,但队列的元数据仅保存有一份,即创建该队列的rabbitmq节点(A节点),当A节点宕机,你可以去其B节点查看,./rabbitmqctl list_queues发现该队列已经丢失,但声明的exchange还存在。
当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer应平均连接每一个节点,从中取消息。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了队列持久化或消息持久化,那么得等A节点恢复,然后才可被消费,并且在A节点恢复之前其它节点不能再创建A节点已经创建过的持久队列;如果没有持久化的话,消息就会失丢。这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。
为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。当然RabbitMQ新版本集群也支持队列复制(有个选项可以配置)。比如在有五个节点的集群里,可以指定某个队列的内容在2个节点上进行存储,从而在性能与高可用性之间取得一个平衡(应该就是指镜像模式)。
镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案
该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据&队列名称&自动设置是普通集群模式或镜像队列。具体如下:
队列通过策略来使能镜像。策略能在任何时刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺乏额外的镜像基础设施,没有任何slave,因此会运行得更快。
为了使队列称为镜像队列,你将会创建一个策略来匹配队列,设置策略有两个键&ha-mode和 ha-params(可选)&。ha-params根据ha-mode设置不同的值,下面表格说明这些key的选项。
语法讲解:
在cluster中任意节点启用策略,策略会自动同步到集群节点
1 rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'
这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 &^& 表示所有匹配所有队列名称。例如:
1 rabbitmqctl set_policy-p/ha-all"^message"'{"ha-mode":"all"}'
注意:&^message& 这个规则要根据自己修改,这个是指同步&message&开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为&^&
RabbitMQ普通集群配置1)RabbitMQ集群搭建
环境:有三台主机,主机名和IP如下:
live-mq-01:172.18.8.157live-mq-02:172.18.8.158live-mq-03:172.18.8.161
同步主机的/etc/hosts文件。
172.18.8.157live-mq-01172.18.8.158live-mq-02172.18.8.161live-mq-03
在三个节点分别安装rabbitmq-server,如果是使用yum即可,如果是Debian使用apt-get即可。
1 $apt-getinstall rabbitmq-server
在三个节点分别启动rabbitmq-server
$service rabbitmq-server start
$rabbitmq-server-detached
同步erlang.cookie文件,通过Erlang的分布式特性(通过magic cookie认证节点)进行RabbitMQ集群,各RabbitMQ服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
root@live-mq-01:~# cat /var/lib/rabbitmq/.erlang.cookie WJLPTHZIMFLJRTOGPYNAroot@live-mq-02:~# cat /var/lib/rabbitmq/.erlang.cookie WJLPTHZIMFLJRTOGPYNAroot@live-mq-03:~# cat /var/lib/rabbitmq/.erlang.cookie WJLPTHZIMFLJRTOGPYNA
在live-mq-01节点上查看集群信息,此时集群中应只有自己。
root@live-mq-01:~# rabbitmqctl cluster_statusCluster status of node'rabbit@live-mq-01'...[{nodes,[{disc,['rabbit@live-mq-01']}]},#集群中的节点,disc表示为磁盘模式,ram表示为内存模式{running_nodes,['rabbit@live-mq-01']},#正在运行的集群节点{cluster_name,&&"rabbit@live-mq-01"&&},#集群的名称{partitions,[]}]...done.
下面将live-mq-01、live-mq-02、live-mq-03组成集群:
live-mq-02加入live-mq-01节点。
root@live-mq-02:~# rabbitmqctl stop_approot@live-mq-02:~# rabbitmqctl join_cluster rabbit@live-mq-01root@live-mq-02:~# rabbitmqctl start_app
live-mq-03加入live-mq-01节点。
root@live-mq-03:~# rabbitmqctl stop_approot@live-mq-03:~# rabbitmqctl join_cluster rabbit@live-mq-01 --ramroot@live-mq-03:~# rabbitmqctl start_app
此时live-mq-02与live-mq-03也会自动建立连接,上面我的两个节点,其中live-mq-02是磁盘节点,live-mq-03是内存节点,但live-mq-01节点默认是磁盘节点(一个集群中最少要有一个磁盘节点)。如果想把live-mq-02由磁盘节点改成内存节点,使用如下change_cluster_node_type命令修改即可,但要先stop:
root@live-mq-02:~# rabbitmqctl stop_appStopping node'rabbit@live-mq-02'......done.root@live-mq-02:~# rabbitmqctl change_cluster_node_type ramTurning'rabbit@live-mq-02'intoaram node......done.root@live-mq-02:~# rabbitmqctl start_appStarting node'rabbit@live-mq-02'......done.
查看集群信息
root@live-mq-01:~# rabbitmqctl cluster_statusCluster status of node'rabbit@live-mq-01'...[{nodes,[{disc,['rabbit@live-mq-01']},{ram,['rabbit@live-mq-03','rabbit@live-mq-02']}]},{running_nodes,['rabbit@live-mq-02','rabbit@live-mq-03','rabbit@live-mq-01']},{cluster_name,&&"rabbit@live-mq-01"&&},{partitions,[]}]...done.
我们可以看到三个节点都加入了集群中,两个ram节点、一个disc节点。其中三个节点都在运行中,以及集群名称显示。
2)允许远程用户访问
第一、添加mq用户并设置密码
1 root@live-mq-01:~# rabbitmqctl add_user mq 123456
第二、设置mq用户为管理员
1 root@live-mq-01:~# rabbitmqctl set_user_tags mq administrator
第三、设置mq用户的权限,指定允许访问的vhost以及write/read
root@live-mq-01:~# rabbitmqctl set_permissions -p "/" mq ".*" ".*" ".*"Setting permissions foruser"live"invhost"/"......done.
第四、查看vhost(/)允许哪些用户访问
root@live-mq-01:~# rabbitmqctl list_permissions -p /Listing permissions invhost"/"...mq.*.*.*...done.
第五、配置允许远程访问的用户,rabbitmq的guest用户默认不允许远程主机访问。
root@live-mq-01:~# cat /etc/rabbitmq/rabbitmq.config [& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
{rabbit,[{tcp_listeners,[5672]},{loopback_users,["mq"]}]}].
ps:主机1设置完以上这些之后,在集群内的机器都会同步此配置,但是/etc/rabbitmq/rabbitmq.config文件不会同步。
root@live-mq-02:~# rabbitmqctl list_usersListing users...mq[administrator]...done.
最后,可以选择删除默认guest用户(密码也是guest)
1 root@live-mq-01:~# rabbitmqctl delete_user guest
3)RabbitMQ退出集群
假设要把rabbit@live-mq-02退出集群,在rabbit@live-mq-02上执行:
$rabbitmqctl stop_app$rabbitmqctl reset$rabbitmqctl start_app
在集群主节点上执行
&$rabbitmqctl forget_cluster_node rabbit@live-mq-02
4)RabbitMQ集群重启
集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:
先在一个节点上执行
$rabbitmqctl force_boot$service rabbitmq-server start
在其他节点上执行
$service rabbitmq-server start
查看cluster状态是否正常(要在所有节点上查询)。
rabbitmqctl cluster_status
如果有节点没加入集群,可以先退出集群,然后再重新加入集群。
上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。
5)RabbitMQ开启图形化页面
RabbitMQ提供了一个非常友好的图形化监控页面插件(rabbitmq_management),让我们可以一目了然看见Rabbit的状态或集群状态。
分别在三个节点上执行开启rabbitmq_management插件的命令,注意开启几个节点在监控页面就可以看见几个节点:
root@live-mq-01:~# rabbitmq-plugins enable rabbitmq_managementroot@live-mq-01:~# rabbitmq-plugins list
查看监听端口(插件监控的端口是15672)
root@live-mq-01:~# netstat -npltActive Internet connections(only servers)Proto Recv-QSend-QLocal Address& & & & &
Foreign Address& & & &
State& & &
PID/Program nametcp& & & & 0& & & 00.0.0.0:4369& & & & & & 0.0.0.0:*& & & & & & &
LISTEN& & & 617/epmd& & & & tcp& & & & 0& & & 00.0.0.0:22& & & & & & & 0.0.0.0:*& & & & & & &
LISTEN& & & 484/sshd& & & & tcp& & & & 0& & & 00.0.0.0:15672& & & & &
0.0.0.0:*& & & & & & &
LISTEN& & & 2220/beam.smp&
tcp& & & & 0& & & 00.0.0.0:10050& & & & &
0.0.0.0:*& & & & & & &
LISTEN& & & 595/zabbix_agentdtcp& & & & 0& & & 00.0.0.0:25672& & & & &
0.0.0.0:*& & & & & & &
LISTEN& & & 2220/beam.smp&
0& & & 0:::10050& & & & & & & & :::*& & & & & & & & & & LISTEN& & & 595/zabbix_agentdtcp6& & &
0& & & 0:::5672& & & & & & & &
:::*& & & & & & & & & & LISTEN& & & 2220/beam.smp
打开浏览器,直接访问IP:15672即可看到RabbitMQ的监控画面(输入mq用户和密码),如下:
从图中可以看出集群中的三个节点信息,其中两个内存节点,一个磁盘节点。另外,在memory字段显示了当前内存的使用情况和最高可以使用的内存量,同样在Disk space字段显示了磁盘空间和最低可用的磁盘空间。基于这两点,下面说一下RabbitMQ对内存和磁盘的控制。
一、内存控制
vm_memory_high_watermark该值为内存阈值,默认为0.4。意思为物理内存的40%。40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC。最坏的情况是使用内存80%。如果把该值配置为0,将关闭所有的publishing 。
root@live-mq-01:~# rabbitmqctl set_vm_memory_high_watermark 0
Paging内存阈值,该值为默认为0.5,该值为vm_memory_high_watermark的20%时,将把内存数据写到磁盘。
如机器内存16G,当RABBITMQ占用内存1.28G(16*0.4*0.2)时把内存数据放到磁盘。
二、硬盘控制
当RabbitMQ的磁盘空闲空间小于50M(默认),生产者将被BLOCK。
如果采用集群模式,磁盘节点空闲空间小于50M将导致其他节点的生产者都被block。可以通过disk_free_limit来对进行配置。
如果要从远程登录怎么做呢?处于安全考虑,guest这个默认的用户只能通过http://localhost:15672来登录,其他的IP无法直接用这个guest帐号。这里我们可以通过配置文件来实现从远程登录管理界面,只要编辑/etc/rabbitmq/rabbitmq.config文件(没有就新增),添加以下配置就可以了。
[& {rabbit,[{tcp_listeners,[5672]},{loopback_users,["mq"]}]}& ].
这个操作在上面配置中都已经做过了。
6)注意事项
cookie在所有节点上必须完全一样,同步时一定要注意。erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。RabbitMQ镜像集群配置上述配置的RabbitMQ默认集群模式,但并不包管队列的高可用性,尽管互换机、绑定这些可以复制到集群里的任何一个节点,然则队列内容不会复制。固然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能守候重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,须要创建镜像队列。
镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
我是通过上面开启的网页的管理端来设置的镜像队列,也可以通过命令,这里先说其中的网页设置方式:
1、点击admin菜单&&右侧的Policies选项&&左侧最下下边的Add/update a policy。
2、按照图中的内容根据自己的需求填写。
3、点击Add policy添加策略。
此时你就会来你的两台rabbitmq服务器的网页管理端amind菜单下看见刚才创建的队列了,下面我们来添加一个queues队列来看看效果,这里只是测试结果,其它的先不填写。
设置镜像队列策略
在任意一个节点上执行:
1 root@live-mq-01:~# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。
我们去live-mq-02上查看策略。
root@live-mq-02:~# rabbitmqctl list_policiesListing policies.../ha-allall^{"ha-mode":"all"}0...done.
此时镜像集群就已经完成了,可以在任意节点上创建队列,看看其他两个节点是否会同步。
CentOS 7.2 下 RabbitMQ 集群搭建
CentOS7环境安装使用专业的消息队列产品RabbitMQ
RabbitMQ入门教程&
在CentOS7上安装RabbitMQ 详解&
NServiceBus 结合 RabbitMQ 使用教程&
CentOS 7下RabbitMQ集群安装配置&
RabbitMQ实战:高效部署分布式消息队列 中文PDF扫描版&
RabbitMQ 的详细介绍:RabbitMQ 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (05月12日)
& (10/28/:40)
& (12/01/:28)
& (04/25/:30)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款RABBITMQ集群及HA、LB
时间: 18:50:23
&&&& 阅读:1162
&&&& 评论:
&&&& 收藏:0
标签:RABBITMQ集群及HA、LB一、Rabbitmq简介RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。AMQP,即Advanced&message&Queuing&Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。rabbitmq是使用erlang开发的,集群非常方便,且天生就支持并发分布式,但自身并不支持负载均衡.&常规的博客介绍都是说rabbitmq有几种部署模式,其中最常用的也就两种:1,单一模式:&就是不做ha...2,镜像模式模式:&active/active模式的ha,当master挂掉了,按照策略选择某个slave(其实就是最先加入集群的那个slave)来担当master的角色。&1.&Rabbitmq系统架构RabbitMQ&Server:&也叫broker&server,是一种传输服务,负责维护一条从Producer到consumer的路线,保证数据能够按照指定的方式进行传输。Producer,数据的发送方。Consumer,数据的接收方。Exchanges&接收消息,转发消息到绑定的队列。主要使用3种类型:direct,&topic,&fanout。Queue&RabbitMQ内部存储消息的对象。相同属性的queue可以重复定义,但只有第一次定义的有效。Bindings&绑定Exchanges和Queue之间的路由。Connection:&就是一个TCP的连接。Producer和consumer都是通过TCP连接到RabbitMQ&Server的。Channel:虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。二、&Rabbitmq安装1.&安装&erlang&虚拟机###安装&erlang&虚拟机,Rabbitmq&基于&erlang&语言开发,所以需要安装&erlang&虚拟机。wget&http://www.erlang.org/download/otp_src_R15B01.&tar&.gztar&-xvf&otp_src_R15B01.tar&.gz&cdotp_src_R15B01&yum&install&make&gcc&gcc-c++&kernel-devel&m4&ncurses-devel&openssl-devel&unixODBC&unixODBC-devel&./configure&--prefix=/usr/local/erlang&--enable-hipe&--enable-threads&--enable-smp-support&--enable-kernel-pollmake&&make&install2.&安装&rabbitmqwget&/releases/rabbitmq-server/v3.5.6/rabbitmq-server-generic-unix-3.5.6.&tar&.gztar&-xvf&rabbitmq-server-generic-unix-3.2.1.&tar&.gzmv&rabbitmq_server-3.2.1&/usr/local/rabbitmq&cd&/usr/local/rabbitmq/&rm&LICENSE*&-rf&#&sbin/rabbitmqctl&&&&#&--提示没找到&虚拟机sbin/rabbitmqctl:&line&29:&exec:&erl:&not&found##建立软连接,解决&虚拟机路径问题ln&-s&/usr/local/erlang/bin/erl&/usr/local/bin/mkdir&/data/rabbitmq/data&/data/rabbitmq/log&&&&-p&&&&#&--建立存放数据日志目录#&vim&/usr/local/rabbitmq/etc/rabbitmq/rabbitmq-env&.conf&RABBITMQ_NODE_IP_ADDRESS=10.168.185.96&RABBITMQ_MNESIA_BASE=/data/rabbitmq/data&RABBITMQ_LOG_BASE=/data/rabbitmq/log&#&vim&/usr/local/rabbitmq/etc/rabbitmq/rabbitmq&&&&#&--设置日志级别[&{rabbit,&[{log_levels,&[{connection,&error}]}]}&].&启动&&/usr/local/rabbitmq/sbin/rabbitmq-server&&–启后默认端口是:&&的&&默认端口是&停止程序:/usr/local/rabbitmq/sbin/rabbitmqctl&stop&#若单机有多个实例,则在&后加–指定名称3.&RABBITMQ页面(web)管理启用&管理插件/usr/local/rabbitmq/sbin/rabbitmq-plugins&enable&rabbitmq_management&关闭&管理插件:/usr/local/rabbitmq/sbin/rabbitmq-plugins&disable&rabbitmq_management列出所有插件:/usr/local/rabbitmq/sbin/rabbitmq-plugins&list4.&Rabbitmq创建用户如果是集群的话,只要在一台主机设置即可,其它会自动同步。#rabbitmqctl&add_user&admin&123456&&–admin为新建的用户,123456为密码#rabbitmqctl&&set_user_tags&admin&administrator&–将用户设置为管理员角色#rabbitmqctl&set_permissions&-p&/&admin&".*"&".*"&".*"–在&/&虚拟主机里设置iom用户配置权限,写权限,读权限。.*是正则表达式里用法。rabbitmq的权限是根据不同的虚拟主机(virtual&hosts)配置的,同用户在不同的虚拟主机(virtual&hosts)里可能不一样。5.&Rabbitmq安全特性(1)publish消息确认机制如果采用标准的&AMQP&协议,则唯一能够保证消息不会丢失的方式是利用事务机制&—&令&channel&处于&transactional&模式、向其&publish&消息、执行&commit&动作。在这种方式下,事务机制会带来大量的多余开销,并会导致吞吐量下降&250%&。为了补救事务带来的问题,引入了&confirmation&机制(即&Publisher&Confirm)。confirm&机制是在channel上使用&confirm.select方法,处于&transactional&模式的&channel&不能再被设置成&confirm&模式,反之亦然。在&channel&被设置成&confirm&模式之后,所有被&publish&的后续消息都将被&confirm(即&ack)&或者被&nack&一次。但是没有对消息被&confirm&的快慢做任何保证,并且同一条消息不会既被&confirm&又被&nack&。RabbitMQ&将在下面的情况中对消息进行&confirm&:RabbitMQ发现当前消息无法被路由到指定的&queues&中;非持久属性的消息到达了其所应该到达的所有&queue&中(和镜像&queue&中);持久消息到达了其所应该到达的所有&queue&中(和镜像&queue&中),并被持久化到了磁盘(被&fsync);持久消息从其所在的所有&queue&中被&consume&了(如果必要则会被&acknowledge)。(2)consumer消息确认机制为了保证数据不被丢失,RabbitMQ支持消息确认机制,即acknowledgments。如果没启动消息确认机制,RabbitMQ在consumer收到消息后就会把消息删除。启用消息确认后,consumer在处理数据后应通过回调函数显示发送ack,&RabbitMQ收到ack后才会删掉数据。如果consumer一段时间内不回馈,RabbitMQ会将该消息重新分配给另外一个绑定在该队列上的consumer。另一种情况是consumer断开连接,但是获取到的消息没有回馈,则RabbitMQ同样重新分配。注意:如果consumer&没调用basic.qos&方法设置prefetch_count=1,那即使该consumer有未ack的messages,RabbitMQ仍会继续发messages给它。(3)消息持久化消息确认机制确保了consumer退出时消息不会丢失,但如果是RabbitMQ本身因故障退出,消息还是会丢失。为了保证在RabbitMQ出现意外情况时数据仍没有丢失,需要将queue和message都要持久化。queue持久化:channel.queue_declare(queue=’hello’,&durable=True)message持久化:channel.basic_publish(exchange=”,routing_key=”task_queue”,body=message,properties=pika.BasicProperties(delivery_mode&=&2,)&&#消息持久化)即使有消息持久化,数据也有可能丢失,因为rabbitmq是先将数据缓存起来,到一定条件才保存到硬盘上,这期间rabbitmq出现意外数据有可能丢失。网上有测试表明:持久化会对RabbitMQ的性能造成比较大的影响,可能会下降10倍不止。三、Rabbitmq集群1.&RABBITMQ集群基本概念一个RABBITMQ集&群中可以共享user,virtualhosts,queues(开启Highly&Available&Queues),exchanges等。但message只会在创建的节点上传输。当message进入A节点的queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。RABBITMQ的集群节点包括内存节点、磁盘节点。内存节点的元数据仅放在内存中,性能比磁盘节点会有所提升。不过,如果在投递message时,打开了message的持久化,那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual&hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。2.&RABBITMQ搭建集群(1)&部署网络环境:有三台机器(mq-cluster1,2,3)&rabbitmq的执行用户为rabbitmq,所属组rabbitmq。直接将以下内容其加到/etc/hosts文件中其中mq-cluster1为master,其余的为slave(2)&同步erlang.cookie文件我是以mq-cluster1为master的,所以需要将其内容覆盖到mq-cluster2和mq-cluster3中杀掉rabbitmq2和rabbitmq3的rabbitmq进程:#ps&–ef|grep&rab|awk&‘{print&$2}’|xargs&kill&-9。–用service&rabbitmq-servier&stop停止会有遗留进程。scp&同步完成后,启动mq_cluster2和mq_cluster3的rabbitmq服务(3)&设置ha模式rabbitmqctl&set_policy&[-p&&vhostpath&]&[--priority&&priority&]&[--apply-to&&apply-to&]&&name&&&pattern&&&definition&&&name&策略名称pattern&正则表达式,用来匹配资源,符合的就会应用设置的策略definition&是json格式设置的策略。apply-to&表示策略应用到什么类型的地方,一般有queues,exchange和all,默认是allpriority&是个整数优先级其中ha-mode有三种模式:all:&同步至所有的.exactly:&同步最多N个机器.&当现有集群机器数小于N时,同步所有,大于等于N时则不进行同步.&N需要额外通过ha-params来指定.nodes:&只同步至符合指定名称的nodes.&N需要额外通过ha-params来指定.#&这里设置的是同步全部的queue,&可以按需自己选择指定的queue&rabbitmqctl&set_policy&ha-all&‘.*‘&‘{"ha-mode":"all"}‘(4)&cluster2,3加入集群在mq-cluster2和mq-cluster3中分别执行:rabbitmqctl&stop_apprabbitmqctl&join_cluster&rabbitmqctl&start_app加入之后,&可以通过rabbitmqctl&cluster_status来查看cluster状态.ps:默认加入是一disc模式加入,可以执行rabbitmqctl&change_cluster_node_type&&ram|disc&进行模式的修改(5)&更改节点属性#rabbitmqctl&stop_app&&–停止rabbitmq服务#rabbitmqctl&change_cluster_node_type&disc/ram&–更改节点为磁盘或内存节点#rabbitmqctl&start_app&–开启rabbitmq服务在rabbitmq&2.中使用:#rabbitmqctl&stop_app#rabbitmqctl&force_cluster&&&#不加自己的node_name,是ram模式#rabbitmqctl&force_cluster&&&#加自己的node_name&是disk模式3.&RABBITMQ退出集群假设要把rabbitmq2退出集群在rabbitmq2上执行#rabbitmqctl&stop_app#rabbitmqctl&reset#rabbitmqctl&start_app&在集群主节点上执行#&rabbitmqctl&forget_cluster_node&mq-cluster24.&RABBITMQ集群重启集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:先在一个节点上执行#rabbitmqctl&force_boot#service&rabbitmq-server&–detached&在其他节点上执行#service&rabbitmq-server&–detached&查看cluster状态是否正常(要在所有节点上查询)。#rabbitmqctl&cluster_status如果有节点没加入集群,可以先退出集群,然后再重新加入集群。上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。5.&注意事项§&cookie在所有节点上必须完全一样,同步时一定要注意。§&erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。§&如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。§&在集群元数据有变动的时候需要有disk&node在线,但是在节点加入或退出的时候所有的disk&node必须全部在线。如果没有正确退出disk&node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。四、Rabbitmq&HA1.&镜像队列概念可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列。镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。2.&配置镜像队列沿用3.2的环境,现在我们把名为“hello”的队列设置为同步给所有节点#rabbitmqctl&set_policy&&ha-all&‘hello’&‘{“ha-mode”:”all”}’ha-all&是同步模式,指同步给所有节点,还有另外两种模式ha-exactly表示在指定个数的节点上进行镜像,节点的个数由ha-params指定,ha-nodes表示在指定的节点上进行镜像,节点名称通过ha-params指定;hello&是同步的队列名,可以用正则表达式匹配;{“ha-mode”:”all”}&表示同步给所有,同步模式的不同,此参数也不同。执行上面命令后,可以在web管理界面查看queue&页面,里面hello队列的node节点后会出现+2标签,表示有2个从节点,而主节点则是当前显示的node(xf7021是测试用的名字,按4-2应该为rabbitmq(1-3))。3.&测试rabbitmq的ha测试的python代码,依次发送消息到三个rabbitmq-server中,可以随机的操作去关闭任意一个mq-cluster上的rabbitmq-server服务,&再通过rabbitmqctl&list_queues来查看消息的数量.&可以看到,尽管master挂了,消息依然能够发送成功,且当挂掉的机器(master或者slave)重新起起来之后,消息会马上同步过去.4.&搭建haproxy安装和初始配置haproxy此处从略.在配置好的/etc/haproxy/haproxy.cfg尾端加上以下内容接着启动haproxyhaproxy&-f&/etc/haproxy/haproxy.cfg&-D5.&测试rabbitmq的haproxy下的lb将之前的测试代码中的mq_servers&=&[‘10.22.129.57‘,&‘10.22.129.58‘,&‘10.22.129.59‘]改成mq_servers&=&[‘10.22.129.53‘,&‘10.22.129.53‘,&‘10.22.129.53‘]执行测试代码,发现三个消息均发送成功,然后即使手动关闭其中一台mq,消息依然发送成功,通过rabbitctl&list_queues也依然可以看到消息是成功收到3条的.至此,可以看到rabbitmq-server成功的解除了single-point状态。&&本文出自 “” 博客,请务必保留此出处标签:
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 docker rabbitmq 集群 的文章

 

随机推荐