Rabbitmq 基础

一、概述
什么是MQ?
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息

1、队列、生产者、消费者
队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。
Rabbitmq 基础
多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

2、Exchange、Binding
生产者将消息投递到队列中,实际上在RabbitMQ中这种事情永远都不会发生。生产者将消息发送到Exchange(交换器,下图中的X),再通过Binding将Exchange与Queue关联起来
Rabbitmq 基础

3、Exchange Type、Bingding key、routing key
在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key。在绑定多个Queue到同一个Exchange的时候,这些Binding 允许使用相同的 binding key。
生产者 将消息发送给Exchange时,一般会指定一个routing key;当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。

RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。
(1) fanout: 不处理Routing Key。只需要简单的将队列绑定到Exchange上,然后本类型 把所有发送到该Exchange的消息投递到所有与它绑定的队列中。也就是一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。 很像子网广播,每台子网内的主机(每个绑定本exchange的queue)都获得了一份复制的消息。Fanout 转发消息最快
Rabbitmq 基础

(2) direct: 处理Routing key。把消息投递到那些binding key与routing key完全匹配的队列中。 需要将队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。 例如一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。

Rabbitmq 基础

(3) topic:将路由键和某模式进行匹配。将消息路由到binding key与routing key模式匹配的队列中。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。 例如“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。 

Rabbitmq 基础

二、安装
Yum配置并安装如下所示:

[root@vm2 ~]# wget  https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/noarch/rabbitmq-server-3.7.5-1.el7.noarch.rpm
[root@vm2 ~]# rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
[root@vm2 yum.repos.d]# cat erlang.repo 
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
[root@vm2 ~]# yum install erlang
或者 wget https://github.com/rabbitmq/erlang-rpm/releases/download/v20.3.6/erlang-20.3.6-1.el7.centos.x86_64.rpm && rpm -ivh  erlang-20.3.6-1.el7.centos.x86_64.rpm
[root@vm2 ~]# yum localinstall rabbitmq-server-3.7.5-1.el7.noarch.rpm
[root@vm2 ~]# vim /usr/lib/systemd/system/rabbitmq-server.service 
[root@vm2 ~]# grep LimitNO /usr/lib/systemd/system/rabbitmq-server.service 
LimitNOFILE=65535
[root@vm2 ~]#
[root@vm2 ~]# systemctl daemon-reload
[root@vm2 ~]# systemctl restart rabbitmq-server

启动RabbitMQ服务命令

/sbin/service rabbitmq-server start
或
systemctl restart rabbitmq-server

查看RabbitMQ服务状态命令

/sbin/service rabbitmq-server status

三、配置网页访问RabbitMQ
1、查看RabbitMQ中用户命令
rabbitmqctl list_users
2、创建用户命令
rabbitmqctl add_user user_name password
3、赋予用户权限命令
rabbitmqctl set_permissions -p "/" user_name '.*' '.*' '.*'
4、赋予用户角色命令
rabbitmqctl set_user_tags user_name administrator
5、开启rabbitmq管理控制台命令
rabbitmq-plugins enable rabbitmq_management
6、访问 http://ip:15672/

删除用户(删除guest用户)
[root@v01-app-rabbitmq01 rabbitmq]# rabbitmqctl delete_user guest
Deleting user "guest"
#rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。

修改用户的密码
rabbitmqctl change_password Username Newpassword

[root@vm2 ~]# rabbitmqctl change_password admin 0GM1aol4z8GeSZY99
Changing password for user "admin"

日志跟踪插件
rabbitmq-plugins enable rabbitmq_tracing #rabbitmq启用trace插件
rabbitmqctl trace_on #打开trace的开关
rabbitmqctl trace_on -p test #打开trace的开关(test为需要日志追踪的vhost)
rabbitmqctl trace_off #关闭trace的开关

防火墙开放端口

firewall-cmd --zone=public --add-port={5672/tcp,15672/tcp}  --permanent
firewall-cmd --reload

Rabbitmq-server 的相关命令请参考:
http://www.rabbitmq.com/rabbitmqctl.8.html

四、RabbitMQ cluster

Rabbitmq集群是依附于erlang集群来工作的, 所以必须先构建erlang集群。Erlang集群中各节点的验证是经由一个magic cookie来实现的, 这个cookie存放在 $home/.erlang.cookie 中;如果rpm安装, .erlang.cookie存储在/var/lib/rabbitmq中。
erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400, 否则节点之间就无法通信。
首先打开文件,然后需要先把其中一台服务器的.erlang.cookie内容复制到别的服务器上,推荐复制内容,因为如果文件权限不正常会导致一些问题,最后退出保存时使用wq! (用!来进行强制保存) 即可。也可是直接使用scp传过去,但必须设置文件权限和属主属组。
注:RabbitMQ Cluster依赖hostname,所以一定要修改/etc/hosts ,实现本地解析。

例:

[root@vm1 ~]# ls /var/lib/rabbitmq/
config  mnesia  schema
[root@vm1 ~]#
[root@vm1 ~]# cat /var/lib/rabbitmq/.erlang.cookie 
XFPDRSDKRKPHENWCULHM[root@vm1 ~]# 
[root@vm1 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 20 2018/05/23 00:00:00 /var/lib/rabbitmq/.erlang.cookie
[root@vm1 ~]# scp /var/lib/rabbitmq/.erlang.cookie vm2:/var/lib/rabbitmq/.erlang.cookie 
The authenticity of host 'vm2 (192.168.40.206)' can't be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'vm2,192.168.40.206' (ECDSA) to the list of known hosts.
root@vm2's password: 
.erlang.cookie                                                               100%   20    28.7KB/s   00:00    
[root@vm1 ~]#
[root@vm1 ~]# firewall-cmd --zone=public --add-port={4369/tcp,25672/tcp} --permanent
success
[root@vm1 ~]# firewall-cmd --reload
success
[root@vm1 ~]# 

[root@vm2 ~]# firewall-cmd --zone=public --add-port={4369/tcp,25672/tcp} --permanent
success
[root@vm2 ~]# firewall-cmd --reload
success
[root@vm2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@vm2 ...
[root@vm2 ~]# rabbitmqctl reset
Resetting node rabbit@vm2 ...
[root@vm2 ~]# rabbitmqctl join_cluster rabbit@vm1
Clustering node rabbit@vm2 with rabbit@vm1
[root@vm2 ~]# rabbitmqctl start_app
Starting node rabbit@vm2 ...
 completed with 3 plugins.
[root@vm2 ~]# 
[root@vm2 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@vm2 ...
[{nodes,[{disc,[rabbit@vm1,rabbit@vm2]}]},
 {running_nodes,[rabbit@vm1,rabbit@vm2]},
 {cluster_name,<<"rabbit@vm1">>},
 {partitions,[]},
 {alarms,[{rabbit@vm1,[]},{rabbit@vm2,[]}]}]
[root@vm2 ~]#           

然后在浏览器中http://ip:15672 访问rabbitmq的管理页面

如果需要将一个node脱离cluster,可以使用以下命令:
rabbitmqctl -n cluster_name forget_cluster_node node_name
但必须先在被移除的rabbitmq-server上执行 rabbitmqctl stop_app
例:
rabbitmqctl -n rabbit@vm1 forget_cluster_node rabbit@vm2

五、镜像队列概念
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。
镜像队列是基于普通的集群模式的,所以必须先配置普通集群,然后才能设置镜像队列。
镜像队列设置后,各node role 将区分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。
queue和message虽然会存在所有镜像队列中,但客户端读取时不论连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。

设置镜像队列策略
在普通集群的中任意节点启用策略,策略会自动同步到集群节点。语法如下:

set_policy [-p vhostpath] {name} {pattern} {definition} [priority]

例:在任意一个节点上执行

[root@node1 ~]# rabbitmqctl set_policy -p / ha-allqueue "^message" '{"ha-mode":"all"}'
Setting policy "ha-allqueue" for pattern "^message" to "{\"ha-mode\":\"all\"}" with priority "0"

注意:"^message" 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,配置时使用的应用于所有队列,所以表达式为"^" 。如果没有指定优先级默认为0,优先级数字越大越优先。
rabbitmqctl set_policy -p / ha-allqueue "^" '{"ha-mode":"all"}' 把所有队列都镜像到所有node
ha-mode 有如下三种:all、exactly、nodes。
当然也可以在Web界面设置镜像策略,如下所示:
Rabbitmq 基础
name: 为策略名称  ,我命名为  winy-ha
Pattern: 为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue,这里我设置为匹配全部
Apply to:使用对象
Priority:配置了多个策略时候的优先级,值越大,优先级越高。(单个策略配置意义不大)
注意:没有指定优先级的消息会将优先级以0对待。 对于超过优先级队列所定最大优先级的消息,优先级以最大优先级对待
Definition: 为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["rabbit@vm1","rabbit@vm2"]这样指定为vm1与vm2这2台机器)。

六、集群重启
集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:
先在一个节点上执行

$ rabbitmqctl force_boot
$ service rabbitmq-server start

在其他节点上执行

$ service rabbitmq-server start

查看cluster状态是否正常(要在所有节点上查询)。

$ rabbitmqctl cluster_status

转载于:https://blog.51cto.com/caiyuanji/2120018

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值