目录
MQ简介:
核心功能
MQ的分类
P2P模式(安全)
Pub/Sub模式(并发)
同类产品
RabbitMQ详解
RabbitMQ简介
RabbitMQ特点:
***RabbitMQ架构图示***
***RabbitMQ常用术语 ***
1.Message:
2.Publisher:
3.Exchange:
4.Queue:
5.Bingding:
6.Virtual Host:
7.Broker:
8.Connection:
9.Channel:
10.Consumer:
Rabbit MQ的通信过程
单机部署RabbitMQ
环境
安装Erlang
安装RabbitMQ
修改配置文件
安装插件并启动服务
访问测试
客户端介绍
RabbitMQ集群部署
原理介绍
内存节点和磁盘节点
普通模式和镜像模式
环境要求
部署过程(每个节点都配置)
1、所有节点配置 vim /etc/hosts
2、所有节点安装erLang和rabbitmq
3、导入rabbitmq 的管理界面
4、设置erlang运行节点
5、添加用户并设置密码
6、访问测试
组成集群
1、将node2、node3加入到node1中组成集群
2、在任意节点上查看集群状态
3、在任意节点上设置镜像队列策略
Rabbitmq+HAproxy
1、安装HAProxy
2、修改配置文件
3、重启HAProxy
4、登录浏览器输入地址
MQ简介:
MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间,通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。队列的使用除去了接收和发送应用程序,同时执行的要求。
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式,大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
核心功能
解耦(将不同的系统分离开)
冗余(存储)
扩展性
削峰
可恢复性
顺序保证
缓冲
异步通信
MQ的分类
P2P模式(安全)
P2P模式包含三个角色:
1.消息队列(Queue)、
2.发送者(Sender)、
3.接收者(Receiver)。
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。
P2P的特点如下:
• 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
• 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
• 接收者在成功接收消息之后,需向队列应答成功。
• 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式
Pub/Sub模式(并发)
Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点如下:
• 每个消息可以有多个消费者
• 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
• 为了消费消息,订阅者必须保持运行的状态
• 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
同类产品
Kafka
RabbitMQ
RocketMQ
RabbitMQ详解
RabbitMQ简介
RabbitMQ是一个在AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统,各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、Actionscript、XMPP、STOMP等,支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。它同时实现了一个Broker构架,这意味着消息在发送给客户端时先在中心队列排队,对路由(Routing)、负载均衡(Load balance)或者数据持久化都有很好的支持。
RabbitMQ特点:
可靠性
灵活的路由
扩展性
高可用性
多种协议
多语言客户端
管理界面
插件机制
***RabbitMQ架构图示***
***RabbitMQ常用术语 ***
1.Message:
消息,是有消息头和消息体组成的。消息体是不透明的,消息体是由一些可选属性组成的,包括路由键(routing-key)、优先级(priority)、持久性存储(delivery-mode)等
2.Publisher:
消息生产者,是向交换器发送消息的客户端程序,我们可以简单理解为就是一个Java程序
3.Exchange:
交换器,用来接收生产者发送的消息,并将这些消息路由发送给服务器中的队列。消息要先经过交换器(exchange),再到队列中去。
4.Queue:
消息队列,用来保存消息,直到发送给消费者,是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一致在队列里面,等待消费者连接到这个队列将其取走。
5.Bingding:
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键,将交换器和消息队列连接起来的路由规则,所以可以将交换器理解为一个由绑定构成的路由表
6.Virtual Host:
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器区域。// 也就是说虚拟主机、交换器、队列、绑定等是通过虚拟机来实现的
vhost是AMQP概念的基础,必须再连接时指定,RabbitMQ默认的vhost是"/"
7.Broker:
可以理解为rabbitmq的服务器实体,可以理解为在Linux上创建的虚拟机实体
8.Connection:
连接,我们可以理解为:rabbitmq服务器和app服务建立的TCP的连接。
9.Channel:
信道,也可以成为管道。是TCP里的虚拟连接。一条TCP连接,可以包含很多条的Channel。
例如:电缆相当与TCP,信道是一条独立光纤束,一条TCP连接上创建多少条信道是没有限制的
TCP一旦打开,就会创建AMQP信道
无论是发布消息、接收消息、订阅消息,这些动作都是通过信道完成的
10.Consumer:
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序,和Producer类似,我们可以简单理解为就是一个Java程序
Rabbit MQ的通信过程
1. P1生产消息,发送给服务器端的Exchange
2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
3. Queue1收到消息,将消息发送给订阅者C1
4. C1收到消息,发送ACK给队列确认收到消息
5. Queue1收到ACK,删除队列中缓存的此条消息
单机部署RabbitMQ
环境
192.168.31.194 设置主机名和域名解析 rabbitmq1
192.168.31.195 设置主机名和域名解析 rabbitmq2
192.168.31.196 设置主机名和域名解析 rabbitmq3
vim /etc/hosts
hostnamectl set-hostname rabbitmq1
安装Erlang
链接: https://pan.baidu.com/s/132_OsuvlaO8xUt_x7Yk35w?pwd=4fcf 提取码: 4fcf 复制这段内容后打开百度网盘手机App,操作更方便哦
# unzip rabbitmq.zip
# yum -y install erlang-21.3.8.1-1.el7.x86_64.rpm
安装RabbitMQ
链接里的安装包里有
# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm
修改配置文件
#cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# vim /etc/rabbitmq/rabbitmq.config
把第61行的注释去掉
安装插件并启动服务
# rabbitmq-plugins enable rabbitmq_management web管理界面工具
# systemctl restart rabbitmq-server
# rabbitmqctl cluster_status 查看节点状态
访问测试
192.168.31.194:15672
默认账号密码:guest/guest
客户端介绍
****命令行添加用户,设置tags***
(开发者)查看所有的队列:rabbitmqctl list_queues
(开发者)清除所有的队列:rabbitmqctl reset
添加用户:rabbitmqctl add_user xxx mima
分配角色:rabbitmqctl set_user_tags xxx administrator
新增虚拟主机:rabbitmqctl add_vhost xxx
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username ".*" ".*" ".*"(后面三个”*”代表用户拥有配置、写、读全部权限)
用户角色
1. 超级管理员administrator:可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2. 监控者monitoring:可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3. 策略制定者policymaker:可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4. 普通管理者management:仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。无法登陆管理控制台,通常就是普通的生产者和消费者。
RabbitMQ集群部署
原理介绍
cookie
cookie
RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang cookie和节点名称,Erlang节点通过交换Erlang cookie以获得认证来实现分布式,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie复制到另外的节点。
内存节点和磁盘节点
RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般都建立为磁盘节点,为了防止机器重启后的消息消失
普通模式和镜像模式
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队列进行消息队列实体复制。
普通模式
普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式
镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
环境要求
1、所有节点需要再同一个局域网内;
2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。
3、准备三台虚拟机,配置相同
4、集群中所有节点都需要hosts文件解析
部署过程(每个节点都配置)
1、所有节点配置 vim /etc/hosts
192.168.31.194 rabbitmq1
192.168.31.195 rabbitmq2
192.168.31.196 rabbitmq3
2、所有节点安装erLang和rabbitmq
192.168.31.194 rabbitmq1 192.168.31.195 rabbitmq2 192.168.31.196 rabbitmq3
2、所有节点安装erLang和rabbitmq
部署过程等同于单机部署
3、导入rabbitmq 的管理界面
# rabbitmqctl-plugins enable rabbitmq_management
4、设置erlang运行节点
一定要保证三台机器的cookie内容一致
找到erlang cookie文件的位置,源码包部署一般会存在.erlang.cookie文件;rpm包部署一般是在/var/lib/rabbitmq/.erlang.cookie。将 node1 的该文件使用rsync或者是scp复制到 node2、node3,文件权限需要是400。
# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
# cat /var/lib/rabbitmq/.erlang.cookie
# systemctl restart rabbitmq-server
rabbitmq2和rabbitmq3
# rabbitmqctl stop
关闭rabbitmq2和rabbitmq3的服务(不要关rabbitmq1)如果2,3节点没有启动服务,会提示错误
#rabbitmq-server -detached 2.3 独立运行节点,warning提示不用理会
# rabbitmqctl cluster_status
5、添加用户并设置密码
由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问
# rabbitmqctl add_user admin admin
# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
# rabbitmqctl set_user_tags admin administrator
6、访问测试
http://ip:15672
账号:admin
密码admin
此时每个节点是单独的一台RabbitMQ,下面来将他们组成集群。
组成集群
rabbitmq-server 启动时,会一起启动:节点和应用,它预先设置RabbitMQ应用为standalone(脱机)模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。(停应用,不停止节点)
1、将node2、node3加入到node1中组成集群
磁盘节点
第二台节点
rabbitmq2# rabbitmqctl stop_app
rabbitmq2# rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmq2# rabbitmqctl start_app
第三台节点
rabbitmq3# rabbitmqctl stop_app
rabbitmq3# rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmq3# rabbitmqctl start_app
内存节点(了解)
rabbitmq2 # rabbitmqctl join_cluster --ram rabbit@rabbitmq1
2、在任意节点上查看集群状态
# rabbitmqctl cluster_status
有这一行
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
3、在任意节点上设置镜像队列策略
在web界面登陆,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
然后在linux中设置镜像队列策略:
语法介绍:
# rabbitmqctl set_policy -p vhost1 ha-all "^" '{"ha-mode":"all"}'
"coresystem" vhost名称,此处应该填写“qianfeng”
ha-all 策略名称
"^" queue的匹配模式为匹配所有的队列
{ }
为镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode
指明镜像队列的模式,有效值为 all/exactly/nodes
all
表示在集群中所有的节点上进行镜像,包含新增节点
exactly
(可选)表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes
(可选)表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-sync-mode
(可选)进行队列中消息的同步方式,有效值为automatic和manual
Rabbitmq+HAproxy
环境:haproxy 1台 192.168.31.197
三台已经部署rabbitmq集群
1、安装HAProxy
# yum -y install haproxy
2、修改配置文件
# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 120s
srvtimeout 120s
listen rabbitmq_cluster 0.0.0.0:80 #作为代理的服务器的IP和端口
mode tcp
balance roundrobin
server rabbit1 192.168.31.194:15672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.31.195:15672 check inter 5000 rise 2 fall 2
server rabbit3 192.168.31.196:15672 check inter 2000 rise 2 fall 3
listen monitor
bind 0.0.0.0:8100 #监控页面的访问端口
mode http
option httplog
stats enable
stats uri /rabbitmq_stats
stats refresh 30s
3、重启HAProxy
# systemctl restart haproxy
4、登录浏览器输入地址
高可用使用rabbitmq http://192.168.31.197:80/
账号:admin
密码:admin
查看HAProxy的状态 http://192.168.31.197:8100/rabbitmq_stats



