Rabbitmq集群

1、 rabbitmq介绍
RabbitMQ是一个开源的靠AMQP协议结束的服务,服务器端用Erlang言语编写,支撑多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支撑AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
AMQP,即Advanced Message Queuing Protocol,高级消息队伍协议,是运用层协议的一个打开标准,为面向消息的中间件规划。消息中间件大多数都用在组件之间的解耦,消息的发送者无需知道消息运用者的存在,反之亦然。
它能够使对应的客户端(client)与对应的消息中间件(broker)进行交互。消息中间件从发布者(publisher)那里收到消息(发布消息的运用,也称为producer),然后将他们转发给顾客(consumers,处理消息的运用)。因为AMQP是一个网络协议,所以发布者、顾客以及消息中间件能够安置到不同的物理机器上面
2、 消息队伍的概念
消息就是信息的载体。为了让消息发送者和消息接收者都能够了解消息所承载的信息(消息发送者需求知道怎样结构消息;消息接收者需求知道怎样解析消息),它们就需求按照一种一同的格式描绘消息,这种一同的格式称之为消息协议。所以,有用的消息必定具有某一种格式;而没有格式的消息是没有意义的。
3、 消息队伍运用的场景
消息队伍在实践运用中常用的运用场景。异步处理,运用解耦,流量削锋和消息通讯四个场景
3.1异步处理
场景说明:如用户注册后,需求发送邮件和注册短信,传统的做法有两种
1)串行办法:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部结束后,回来给客户端。
2)并行办法:将注册信息写入数据库成功后,发送注册邮件的一同,发送注册短信。以上三个任务结束后,回来给客户端。与串行的差别是,并行的办法能大大的进步处理的时间。
假定三个业务节点每个运用50毫秒钟,不考虑网络等其他开支,则串行办法的时间是150毫秒,并行的时间或许是100毫秒。
如以上案例描绘,传统的办法系统的功用(并发量,吞吐量,照应时间)会有瓶颈。怎样处理这样的一个问题呢?
引入消息队伍,将不是有必要的业务逻辑,异步处理。改造后的架构如下:
按照以上约好,用户的照应时间恰当所以注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队伍后,直接回来,因此写入消息队伍的速度很快,底子能够忽略,因此用户的照应时间或许是50毫秒。
3.2运用解耦
场景说明:用户下单后,订单系统需求告知库存系统。传统的做法是,订单系统调用库存系统的接口
Rabbitmq集群
传统方式的缺点:假定库存系统无法访问,则订单减库存将失利,然后导致订单失利,订单系统与库存系统耦合
怎样处理以上问题呢?引入运用消息队伍后的方案,如下图:
Rabbitmq集群
订单系统:用户下单后,订单系统结束耐久化处理,将消息写入消息队伍,回来用户订单下单成功
库存系统:订阅下单的消息,选用拉/推的办法,获取下单信息,库存系统根据下单信息,进行库存操作
假定:在下单时库存系统不能正常运用。也不影响正常下单,因为下单后,订单系统写入消息队伍就不再关心其他的后续操作了。结束订单系统与库存系统的运用解耦
3.3、流量削峰
流量削锋也是消息队伍中的常用场景,一般在秒杀或团抢活动中运用广泛
运用场景:秒杀活动,一般会因为流量过大,导致流量暴增,运用挂掉。为处理这样的一个问题,一般需求在运用前端参与消息队伍。
a、能够控制活动的人数
b、能够缓解短时间内高流量压垮运用
Rabbitmq集群
用户的央求,服务器接收后,首要写入消息队伍。假定消息队伍长度逾越最大数量,则直接丢掉用户央求或跳转到差错页面。秒杀业务根据消息队伍中的央求信息,再做后续处理
3.4、日志处理
日志处理是指将消息队伍用在日志处理中,比如Kafka的运用,处理许多日志传输的问题。架构简化如下
Rabbitmq集群
日志搜集客户端,担任日志数据搜集,守时写受写入Kafka队伍
Kafka消息队伍,担任日志数据的接收,存储和转发
日志处理运用:订阅并消费kafka队伍中的日志数据
3.5、消息通讯
消息通讯是指,消息队伍一般都内置了高效的通讯机制,因此也能够用在纯的消息通讯。比如结束点对点消息队伍,或许聊天室等
点对点通讯:
Rabbitmq集群
客户端A和客户端B运用同一队伍,进行消息通讯。
聊天室通讯:
Rabbitmq集群
客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。结束类似聊天室作用
4、 常见的消息队伍产品
4.1、redis
是一个Key-Value的NoSQL数据库,开发维护很生动,虽然它是一个Key-Value数据库存储系统,但它本身支撑MQ功用,所以结束可当作一个轻量级的队伍服务来运用。关于RabbitMQ和Redis的入队和出队操作,各实行100万次,每10万次记载一次实行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验标明:入队时,当数据比较小时,Redis的功用要高于RabbitMQ,而如否数据大小逾越了10K,Redis则慢的无法忍受;出队时,不论数据大小,Redis都表现出非常好的功用,而RabbitMQ的出队功用则远低于Redis。
4.2、 mecahceq
耐久化消息队伍(简称mcq)是一个轻量级的消息队伍,特性如下:
简略易用
处理速度快
多条队伍
并发功用好
与memcache的协议兼容。意味着只需装了前者的extension即可不需求额外的插件
在zend framework中运用很便当 php开发结构
4.3、 MSMQ
这是微软的产品里唯一被认为有价值的东西关键是它并不凌乱,除了接收和发送,没有其他,它有一些硬性束缚,比如最大消息体积是4MB。
4.4、 ZeroMQ
ZeroMQ是一个非常轻量级的消息系统,宣称最快的消息队伍系统,专门为高吞吐量/低推延的场景开发,在金融界的运用中经常能够发现它。
与RabbitMQ比较,ZeroMQ支撑许多高级消息场景,能够结束RabbitMQ不拿手的高级/凌乱的队伍,但是你有必要结束ZeroMQ结构中的各个块(比如Socket或Device等)。
ZeroMQ具有一个一同的非中间件的方式
你不需求设备和工作一个消息服务器或中间件,因为你的运用程序将扮演这个服务人物。你只需求简略地引用ZeroMQ程序库,能够正常的运用NuGet设备(微软开发的.Net途径),然后你就能够愉快地在运用程序之间发送消息了。
但是ZeroMQ仅供应非耐久性的队伍,即没有当地能够查询它是否有问题出现,也就是说假设down机,数据将会丢掉。
4.5、 Jafka/Kafka
Jafka/Kafka(能将消息松散到不同的节点上)是LinkedIn于2010年12月开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目,是一个高功用跨言语分布式Publish/Subscribe消息队伍系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:
1)快速耐久化,能够在O(1)的系统开支下进行消息耐久化;
2)高吞吐,在一台一般的服务器上既能够打到10W/s的吞吐速率;
3)彻底的分布式系统,Broker、Producer、Consumer都原生自动支撑分布式,自动结束凌乱均衡;
4)支撑Hadoop数据并行加载,一同了在线和离线的消息处理,关于像Hadoop相同的日志数据和离线分析系统,但又要求实时处理的束缚,这是一个可行的处理方案。
5)相关于ActiveMQ是一个非常轻量级的消息系统,除了功用非常好之外,仍是一个作业出色的分布式系统
4.6、 Apache ActiveMQ
ActiveMQ居于(RabbitMQ&ZeroMQ)之间,类似于ZemoMQ,支撑高级消息场景,支撑数据的耐久化
ActiveMQ被称为Java世界的中坚力量。它有很长的前史,且被广泛运用。它仍是跨途径的,给那些非微软途径的产品供应了一个天然的集成接入点。
但是它只需跑过了MSMQ才有或许被考虑。如需配备ActiveMQ则需求在政策机器上设备Java环境。
类似于RabbitMQ,它易于结束高级场景,而且只需付出低消耗。它被称为消息中间件的“瑞士军刀”。
4.7、 RabbitMQ
RabbitMQ是运用Erlang编写的一个开源消息队伍,本身支撑许多的协议:AMQP(高级消息队伍协议), XMPP(可扩展消息处理现场协议), SMTP(简略邮件传输协议), STONP(简略文本定向消息协议),也正是如此,使的它变的非常重量级,更适合于企业级的开发。
它结束了署理(Broker)架构,意味着消息在发送到客户端之前能够在中心节点上排队。此特性使得RabbitMQ易于运用和安置,适宜于许多场景如路由、负载均衡或消息耐久化等,用消息队伍只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中心节点添加了推延,消息封装后也比较大。如需配备RabbitMQ则需求在政策机器上设备Erlang环境
毕竟,上述同种类型的产品:
1. 都有各自客户端API或支撑多种编程言语
2. 都有许多的文档
3. 都供应了活泼的支撑
4. ActiveMQ、RabbitMQ、MSMQ、Redis都需求发起服务进程,这些都能够监控 和配备,其他几个就有问题了
5. 都相对供应了出色的可靠性(一同性)、扩展性和负载均衡,当然还有功用

5、Rabbitmq基础概念
运用场景结构
Rabbitmq集群
RabbitMQ Server:也叫broker server,它不是运送食物的卡车,而是一种传输服务。原话是RabbitMQ isn’t a food truck, it’s a delivery service. 他的人物就是维护一条从Producer到Consumer的路途,保证数据能够按照指定的办法来进行传输。但是这个保证也不是100%的保证,但是关于一般的运用来说这现已满意了。当然关于商业系统来说,能够再做一层数据一同性的guard(监控是否实行成功),就能够彻底保证系统的一同性了。
Client A & B:也叫Producer,数据的发送方。Create messages and Publish (Send) them to a broker server (RabbitMQ)。一个Message有两个部分:Payload(有用载荷)和Label(标签)。Payload断章取义就是传输的数据,Label是Exchange的名字或许说是一个tag,它描绘了payload,而且RabbitMQ也是通过这个label来抉择把这个Message发给哪个Consumer。AMQP毁灭描绘了label,而RabbitMQ抉择了怎样运用这个label的规则。
Client 1,2,3:也叫Consumer,数据的接收方。Consumers attach to a broker server (RabbitMQ) and subscribe to a queue。把queue比作是一个有名字的邮箱。当有Message抵达某个邮箱后,RabbitMQ把它发送给它的某个订阅者即Consumer。当然或许会把同一个Message发送给许多的Consumer。在这个Message中,只需payload,label现已被删掉了。关于Consumer来说,它是不知道谁发送的这个信息的。就是协议本身不支撑。但是当然了假设Producer发送的payload包括了Producer的信息就另当别论了。
关于一个数据从Producer到Consumer的正确传递,还有三个概念需求明晰:exchanges, queues and bindings。
Exchanges:消息交换机,它指定消息按什么规则,路由到哪个队伍
Queues:消息队伍载体,每个消息都会被投入到一个或多个队伍
Bindings:它的作用就是把exchange和queue按照路由规则绑定起来
Routing Key:路由关键字,exchange根据这个关键字进行消息投递
Connection:就是一个TCP的联接。
Producer和Consumer都是通过TCP联接到RabbitMQ Server的。往后我们你们能够正常的看到,程序的开端处就是建立这个TCP联接。
Channel:虚拟联接。它建立在上述的TCP联接中。数据活动都是在Channel中进行的。也就是说,正常的情况是程序开端建立TCP联接,第二步就是建立这个Channel。
Vhost:虚拟主机,一个broker里能够开设多个vhost,用作不同用户的权限分别。每个virtual host本质上都是一个RabbitMQ Server,具有它自己的queue,exchagne,和bings rule等等。这保证了你能够在多个不同的application中运用RabbitMQ。
6、Channel的选择
那么,为什么运用Channel,而不是直接运用TCP联接?
关于OS来说,建立和关闭TCP联接是有价值的,一再的建立关闭TCP联接关于系统的功用有很大的影响,而且TCP的联接数也有束缚,这也束缚了系统处理高并发的才干。但是,在TCP联接中建立Channel是没有上述价值的。关于Producer或许Consumer来说,能够并发的运用多个Channel进行Publish或许Receive。
7、消息队伍实行进程
客户端联接到消息队伍服务器,翻开一个Channel。
客户端声明一个Exchange,并设置相关特色。
客户端声明一个Queue,并设置相关特色。
客户端运用Routing key,在Exchange和Queue之间建立好绑定联络。
客户端投递消息到Exchange。
Exchange接收到消息后,就根据消息的key和现已设置的Binding,进行消息路由,将消息投递到一个或多个队伍里。
8、消息耐久化
RabbitMQ支撑消息的耐久化,也就是数据写在磁盘上,为了数据安全考虑,大多数用户都会选择耐久化。消息队伍耐久化包括3个部分:
Exchange耐久化,在声明时指定durable => 1
Queue耐久化,在声明时指定durable => 1
消息耐久化,在投递时指定delivery_mode => 2(1对错耐久化)
若Exchange和Queue都是耐久化的,那么它们之间的Binding也是耐久化的;而Exchange和Queue两者之间有一个耐久化,一个非耐久化,就不容许建立绑定。
Consumer从durable queue中取回一条消息之后并发回了ack消息,RabbitMQ就会将其符号,便当后续废物回收。假设一条耐久化的消息没有被consumer取走,RabbitMQ重启之后会自动重建exchange和queue(以及bingding联络),消息通过耐久化日志重建再次进入对应的queues,exchanges。
9、设备rabbitmq

Rabbitmq集群
24 yum -y localinstall erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm (设备rabbitmq)
22 chkconfig --add rabbitmq-server (参与开机自启)
25 chkconfig rabbitmq-server on (打开rabbitmq开机自启)
26 /etc/init.d/rabbitmq-server start (打开rabbitmq)
查看rebbitmq是否工作
27 ps -ef | grep rabbitmq
Rabbitmq集群
30 rabbitmq-plugins enable rabbitmq_management
Rabbitmq集群
#打开rabbitmq的web处理插件,用户都能够通过浏览器进行访问
31 rabbitmqctl add_user admin 123.com
Rabbitmq集群
#创建登录用户admin 暗码123.com
32 rabbitmqctl set_user_tags admin administrator
Rabbitmq集群
#将admin用户添加到处理员组傍边

Rabbitmq集群
查看端口netstat -anpt | grep 15672

浏览器访问IP地址:15672
Rabbitmq集群
Rabbitmq集群
10、Rabbitmq集群
(1.40-1.60的操作)
集群办法
Rabbitmq集群大约分为二种办法:

  1. 一般方式:默许的集群方式。消息的实体只存在一个节点上
  2. 镜像方式:把需求的队伍做成镜像队伍,存在于多个节点。
    ha-mode:all 列队到全部节点上
    exatly:随机镜像到其他节点上
    nodes:镜像到指定节点上
    集群节点方式:
    1、 内存节点:作业在内存上
    2、 磁盘节点:作业在磁盘上
    破例:内存节点和磁盘节点一同存在,进步了访问速度有添加了耐久化
    比较内存节点虽然不写入磁盘,但是它实行比磁盘节点要好。集群中,只需求一个磁盘节点来保存情况 就满意了假设集群中只需内存节点,那么不能间断它们,否则全部的情况,消息等都会丢掉。
    设备rabbitmq
    Rabbitmq集群
    24 yum -y localinstall erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm (设备rabbitmq)
    22 chkconfig --add abbitmq-server (参与开机自启)
    25 chkconfig rabbitmq-server on (打开rabbitmq开机自启)
    26 /etc/init.d/rabbitmq-server start (打开rabbitmq)
    查看rebbitmq是否工作
    27 ps -ef | grep rabbitmq
    Rabbitmq集群
    [root@localhost ~]# vim /etc/hosts (四台主机都要操作)
    192.168.1.30 rabbitmq1
    192.168.1.40 rabbitmq2
    192.168.1.50 rabbitmq3
    192.168.1.60 rabbitmq4
    ##不想每台都手写能够正常的运用scp
    [root@rabbitmq1 ~]# scp /etc/hosts root@192.168.1.40:/etc/hosts ##提示输入yes

在rabbitmq1上查看cookie节点信息并拷贝
##设备集群的时分需求节点cookie信息一同
Rabbitmq集群

rabbitmq2,3和4大将文件cookie信息和rabbitmq1改成相同
[root@rabbitmq2 ~]# echo MIIPQWTLIDGVGKMDWQFX > /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq3 ~]#echo MIIPQWTLIDGVGKMDWQFX > /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq4 ~]#echo MIIPQWTLIDGVGKMDWQFX > /var/lib/rabbitmq/.erlang.cookie

配备结束后reboot重启虚拟机,
##留心:2和3需求手动重启,重启结束后主机名会变为rabbitmq1、2、3,发起不了的开机界面会一贯停留在这个当地5-6分钟恢复,能够再次手动重启一下就不会这样了
Rabbitmq集群
[root@rabbitmq1 ~]# ps -ef | grep rabbit ##重启结束后查看是否发起
Rabbitmq集群
在rabbitmq1上操作
45 rabbitmqctl stop_app
Rabbitmq集群
46 rabbitmqctl reset
Rabbitmq集群
47 rabbitmqctl start_app
Rabbitmq集群
##设置结束后会提示节点称谓并拷贝

在rabbitmq2、3,4上参与节点(2,3和4操作相同)
[root@rabbitmq2 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq2 ...
[root@rabbitmq2 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq2 ...
[root@rabbitmq2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 ...
##-join_cluter参与集群 --ram 以内存节点办法参与后边跟节点名rabbit@rabbitmq1
[root@rabbitmq2 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq2 ...
[root@rabbitmq2 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@rabbitmq2... started 6 plugins.
##打开rabbitmq插件,不翻开的话,就不能运用浏览器访问rabbit页面进行处理

回到rabbitmq1上创建处理用户和查看集群情况
[root@rabbitmq1 ~]# rabbitmqctl add_user admin redhat
Creating user "admin" ...
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
##创建用户admin暗码为redhat,并参与到处理员组中
[root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management
Plugin configuration unchanged.

Applying plugin configuration to rabbit@rabbitmq1... nothing to do.
[root@rabbitmq1 ~]# rabbitmqctl cluster_status ##查看节点情况

##rabbit1作业方式为磁盘节点 rabbit2、3,4为ram内存节点方式
##running_nodes:正在工作的节点
##cluster_name:节点称谓
##alarms:发生问题时rabbit1、2、3,4会进行报警
Rabbitmq集群
浏览器访问进行处理:
http://192.168.1.30:15672 用户名为admin暗码redhat
Rabbitmq集群
Rabbitmq集群
点击vxgp后在下面找到premissions选项设置为admin用户权限访问
Rabbitmq集群
设置结束后再次查看
Rabbitmq集群
设置匹配战略
Rabbitmq集群
发布消息:
Rabbitmq集群
Rabbitmq集群

设置发布消息内容
Rabbitmq集群
Rabbitmq集群
能够正常的看到现已有告知了
Rabbitmq集群

添加rabbitmq节点:rabbitmq4 192.168.83.4
rabbitmq1、2、3添加hosts主机都添加192.168.83.4 rabbitmq4
rabbitmq4设备同上面设备相同
[root@localhost ~]# chkconfig rabbitmq-server on
[root@localhost ~]# /etc/init.d/rabbitmq-server start
[root@localhost ~]# echo MIIPQWTLIDGVGKMDWQFX > /var/lib/rabbitmq/.erlang.cookie
[root@localhost ~]# reboot
[root@rabbitmq4 ~]# rabbitmqctl stop_app
[root@rabbitmq4 ~]# rabbitmqctl reset
[root@rabbitmq4 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1

删去节点:
##在rabbitmq4上先间断节点
[root@rabbitmq1 ~]# rabbitmqctl stop_app
回到主节点上rabbitmq1
[root@rabbitmq1 ~]# rabbitmqctl -n rabbit@rabbitmq1 forget_cluster_node rabbit@rabbitmq4
Removing node rabbit@rabbitmq4 from cluster ...
##-n 指定节点称谓
#=forget_cluster_node 后边跟要删去的节点称谓
Rabbitmq集群