RabbitMQ消息队列的用处
对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:
1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据会不会丢失?
2)如何降低发送者和接收者的耦合度?
3)如何让Priority高的接收者先接到数据?
4)如何做到load balance?有效均衡接收者的负载?
5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 处理不同的数据,如何做有效的filter。
6)如何做到可扩展,甚至将这个通信模块发到cluster上?
7)如何保证接收者接收到了完整,正确的数据? AMQP协议解决了以上的问题,而RabbitMQ实现了AMQP。
单机部署RabbitMQ
1,安装erlang
[root@localhost ~]# vim /etc/yum.repos.d/erlang.repo #写一个relang的repo的源文件
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
[root@localhost ~]# yum -y install erlang #安装
2,安装RabbitMQ
[root@localhost ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.13/rabbitmq-server-3.7.13-1.el7.noarch.rpm
[root@localhost ~]# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm #直接下载rpm包,大家直接安装即可
3,修改配置文件
[root@localhost ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@localhost ~]# vim /etc/rabbitmq/rabbitmq.config
//打开配置文件,61行 去掉注释%%和逗号
4,安装插件并启动服务
[root@localhost ~]# abbitmq-plugins enable rabbitmq_management #web管理界面工具
[root@localhost ~]# systemctl restart rabbitmq-server #启动
[root@localhost ~]# rabbitmqctl cluster_status #查看节点状态。(下图是node1节点)
Cluster status of node rabbit@rabbitmq1 …
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<“rabbit@rabbitmq1”>>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]}]}]
5,访问测试
http://127.0.0.1:15672
默认账号密码:guest/guest
RabbitMQ集群部署
简介
消息中间件RabbitMQ,一般以集群方式部署,
主要提供消息的接受和发送,实现各微服务之间的消息异步。
以下将介绍RabbitMQ+HA方式进行部署。
原理介绍
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,准备三台虚拟机,配置相同
192.168.101.11 设置主机名 rabbitmq1
192.168.101.12 设置主机名 rabbitmq2
192.168.101.13 设置主机名 rabbitmq3
操作系统:centos7.2以上
2,集群中所有节点都需要hosts文件解析
[root@rabbitmq1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.135.184 rabbitmq1
192.168.135.185 rabbitmq2
192.168.135.192 rabbitmq3
3,所有节点安装erLang和rabbitmq
见linux系统中单机部署rabbitmq
4,导入rabbitmq 的管理界面
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management
5、设置erlang运行节点
一定要保证三台机器的cookie内容一致
找到erlang cookie文件的位置,源码包部署一般会存在.erlang.cookie文件;rpm包部署一般是在/var/lib/rabbitmq/.erlang.cookie。将 node1 的该文件使用rsync或者是scp复制到 node2、node3,文件权限需要是400。
[root@localhost ~]# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
[root@localhost ~]# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
[root@localhost ~]# cat /var/lib/rabbitmq/.erlang.cookie #查看三台机器的cookie是否一致
[root@localhost ~]# systemctl restart rabbitmq-server #启动
6,rabbitmq2和rabbitmq3
[root@localhost ~]# rabbitmqctl stop
关闭rabbitmq2和rabbitmq3的服务(不要关rabbitmq1)
如果2,3节点没有启动服务,会提示关闭错误。
7,rabbitmq2和rabbitmq3
[root@localhost ~]# rabbitmq-server -detached
2.3 独立运行节点,warning提示不用理会
Warning: PID file not written; -detached was passed.
8,查看各个节点状态。
[root@localhost ~]# rabbitmqctl cluster_status #查看各个节点状态。(下图是node1节点)
Cluster status of node rabbit@rabbitmq1 …
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<“rabbit@rabbitmq1”>>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]}]}]
Cluster status of node rabbit@rabbitmq1
每台主机看到的只有一个的server信息。目前尚未组合成集群
9,添加用户并设置密码
由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问,三个节点都要添加
[root@localhost ~]# rabbitmqctl add_user admin admin #设置账户和密码
[root@localhost ~]# rabbitmqctl set_permissions -p “/” admin “." ".” “.*” #给这个账户读,写,执行 的权限
[root@localhost ~]# rabbitmqctl set_user_tags admin administrator #给这个用户管理员的权限
10,访问测试
http://ip:15672
账号:admin
密码admin
此时每个节点是单独的一台RabbitMQ,下面来将他们组成集群。
11、在任意节点上设置镜像队列策略
在web界面登陆,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
12,然后在linux中设置镜像队列策略:
语法介绍
[root@localhost ~]# rabbitmqctl set_policy -p vhost1 ha-all “^” ‘{“ha-mode”:“all”}’
案例中的命令
[root@localhost ~]# rabbitmqctl set_policy -p qianfeng 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
提示
此时镜像队列设置成功。队列会被复制到各个节点,各个节点状态保持一致(这里的虚拟主机vhost1 。是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息队列进行隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)