标签:用户 有一个 良好的 hadoop 转发 业务 端口 starting 文本
1、 rabbitmq介绍5、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
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
30 rabbitmq-plugins enable rabbitmq_management
#开启rabbitmq的web管理插件,用户可以通过浏览器进行访问
31 rabbitmqctl add_user admin 123.com
#创建登录用户admin 密码123.com
32 rabbitmqctl set_user_tags admin administrator
#将admin用户添加到管理员组当中
查看端口netstat -anpt | grep 15672
浏览器访问IP地址:15672
10、Rabbitmq集群
(1.40-1.60的操作)
集群方式
Rabbitmq集群大概分为二种方式:
在rabbitmq1上查看cookie节点信息并复制
##安装集群的时候需要节点cookie信息一致
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分钟恢复,可以再次手动重启一下就不会这样了
[root@rabbitmq1 ~]# ps -ef | grep rabbit ##重启完成后查看是否启动
在rabbitmq1上操作
45 rabbitmqctl stop_app
46 rabbitmqctl reset
47 rabbitmqctl start_app
##设置完成后会提示节点名称并复制
在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会进行报警
浏览器访问进行管理:
http://192.168.1.30:15672 用户名为admin密码redhat
点击vxgp后在下面找到premissions选项设置为admin用户权限访问
设置完成后再次查看
设置匹配策略
发布消息:
设置发布消息内容
可以看到已经有通知了
添加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 后面跟要删除的节点名称
标签:用户 有一个 良好的 hadoop 转发 业务 端口 starting 文本
原文地址:https://blog.51cto.com/14320361/2452643