安装rabbitMQ
方法一:使用.rpm文件进行安装,比较简单
1.需要3个rpm文件
下载地址:https://download.csdn.net/download/axq19910228/10391844
2.将文件放到linux系统上任意文件夹中(这里新建了user文件夹)
cd到该文件夹下(user文件夹下)
3.使用命令进行安装
看一下是否安装过rabbit.....
rpm -qa | grep rabbit
先安装erlang文件,执行
rpm -Uvh erlang-20.2.2-1.el6.x86_64.rpm
继续安装rabbitMQ
rpm -Uvh rabbitmq-server-3.7.4-1.el6.noarch.rpm
如不报错,直接跳过
期间可能会报错
或者报
Requires: socat
的错误,都是因为没有socat或者socat版本不对造成的
执行
rpm -Uvh socat-1.7.1.3-1.el6.rf.x86_64.rpm
安装成功后在执行刚才安装rabbitMQ的命令
rpm -Uvh rabbitmq-server-3.7.4-1.el6.noarch.rpm
成功,不在报错,这时候rabbitMQ就已经安装完成了
方法二:命令安装,比较复杂
命令安装比较复杂,等心情好了再更新吧
启动rabbitMQ,并启动管理平台插件
执行
whereis rabbitmq
执行
cd /usr/lib/rabbitmq/bin
启动方式二选一
前台运行,执行(不建议)
rabbitmq-server start
后台运行,执行
rabbitmq-server -detached
无报错跳过
报错了....是host名不对造成的,需要修改etc/hosts文件里的参数
文件修改前
修改后
就好了
继续执行
成功启动,但是能够看到,启动了0个插件,我们的管理系统平台并没有被启动
ctrl+c打断出来
继续执行
rabbitmq-plugins enable rabbitmq_management
ps -ef |grep rabbitmq
这样就成功启动了平台插件,访问15672端口就能出现
我们需要创建用户
rabbitmqctl add_user admin 123456
继续给用户授权
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
用户授权完成
登陆
成功登陆进来了
rabbitMQ和管理平台成功启动
ps:如果是外网登陆,需要将防火墙关掉
/etc/init.d/iptables stop
centOS7.2关闭防火墙
关闭防火墙:
systemctl stop firewalld.service
开启防火墙:
systemctl start firewalld.service
关闭开机启动:
systemctl disable firewalld.service
开启开机启动:
systemctl enable firewalld.service
rabbitMQ集群搭建
(一) 功能和原理
设计集群的目的
允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
通过增加更多的节点来扩展消息通信的吞吐量
1 集群配置方式
RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel
cluster:
不支持跨网段,用于同一个网段内的局域网
可以随意的动态增加或者减少
节点之间需要运行相同版本的RabbitMQ和Erlang
federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列。
shovel:连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网。
2 节点类型
RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。
问题说明: RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
解决方案:设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。3 Erlang Cookie
Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。
说明: 这就要从rabbitmqctl命令的工作原理说起,RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证。
4 镜像队列
功能和原理 RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。
普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
实现机制 镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:
ha-mode
ha-params
功能
all
空
镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly
count
镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
nodes
node name
镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。
实例列举:
queue_args("x-ha-policy":"all") //定义字典来设置额外的队列声明参数
channel.queue_declare(queue="hello-queue",argument=queue_args)
如果需要设定特定的节点(以rabbit@localhost为例),再添加一个参数
queue_args("x-ha-policy":"nodes",
"x-ha-policy-params":["rabbit@localhost"])
channel.queue_declare(queue="hello-queue",argument=queue_args)
可以通过命令行查看那个主节点进行了同步
rabbitmqctl list_queue name slave_pids synchronised_slave_pids
在启动RabbitMQ节点之后,服务器默认的节点名称是Rabbit和监听端口5672,如果想在同一台机器上启动多个节点,那么其他的节点就会因为节点名称和端口与默认的冲突而导致启动失败,可以通过设置环境变量来实现,具体方法如下:
rabbitmqctl stop //先停止运行节点,再进行集群部署
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit //设置环境变量指定端口和节点名称
rabbitmq-server -detached //后台启动节点
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_01 //设置环境变量指定端口和节点名称
rabbitmq-server -detached //后台启动节点
或者通过添加/etc/rabbitmq/rabbitmq-env.conf文件来进行设置:
NODE_PORT=5672
NODENAME=rabbit
NODE_PORT=5673
NODENAME=rabbit_01
rabbitmqctl -n rabbit_01@localhost stop_app //停止rabbit_01节点的应用
rabbitmqctl -n rabbit_01@localhost join_cluster rabbit@localhost //将rabbit_01添加到集群节点rabbit中去
rabbitmqctl cluster_status //查看集群节点的状态
rabbitmqctl -n rabbit_01@localhost start_app //启动rabbit_01节点的应用
//可以看到如下信息,说明节点添加成功,表明都是磁盘类型的节点
Cluster status of node rabbit@localhost ...
[{nodes,[{disc,[rabbit@localhost,rabbit_01@localhost]}]},
{running_nodes,[rabbit@localhost]},
{cluster_name,<<"rabbit@localhost">>},
{partitions,[]},
{alarms,[{rabbit@localhost,[]}]}]
不同于单机多节点的情况,在多机环境,如果要在cluster集群内部署多个节点,需要注意两个方面:
环境介绍:
RabbitMQ节点 | IP地址 | 工作模式 | 操作系统 |
---|---|---|---|
rabbitmqCluster | 11.11.231.9 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster01 | 11.11.231.10 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster02 | 11.11.231.11 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster03 | 11.11.231.12 | RAM | CentOS 7.0 - 64位 |
rabbitmqCluster04 | 11.11.231.13 | RAM | CentOS 7.0 - 64位 |
rabbitmqCluster05 | 11.11.231.14 | RAM | CentOS 7.0 - 64位 |
cluster部署过程:
11.11.231.9 rabbitmqCluster 11.11.231.10 rabbitmqCluster01 11.11.231.11 rabbitmqCluster02
11.11.231.12 rabbitmqCluster03
11.11.231.13 rabbitmqCluster04
11.11.231.14 rabbitmqCluster05
在11.11.231.9服务器上执行,复制.erlang.cookie,使集群中全部服务器cookie一致
期间需要按照要求操作,yes,密码.....
scp /var/lib/rabbitmq/.erlang.cookie 11.11.231.10:/var/lib/rabbitmq
.
.
.
.
scp /var/lib/rabbitmq/.erlang.cookie 11.11.231.14:/var/lib/rabbitmq
rabbitmqctl stop
rabbitmq-server -detached
[root@rabbitmqCluster]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl cluster_status
[root@rabbitmqCluster02]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl stop_app
[root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@VM-YHBOSBR01
或者
[root@rabbitmqCluster01]#rabbitmqctl join_cluster --ram rabbit@VM-YHBOSBR01
[root@rabbitmqCluster01]#rabbitmqctl start_app
[root@rabbitmqCluster]#rabbitmqctl cluster_status
设计架构可以如下:在一个集群里,有4台机器,其中1台使用磁盘模式,另2台使用内存模式。2台内存模式的节点,无疑速度更快,因此客户端(consumer、producer)
连接访问它们。而磁盘模式的节点,由于磁盘IO相对较慢,因此仅作数据备份使用,另外一台作为反向代理。
一、4台机器如下(通过/etc/sysconfig/network修改主机名):
192.168.36.217 M-zhutianwei-A (Rabbit)
192.168.36.102 M-zhutianwei-C (Rabbit)
192.168.36.136 S-zhutianwei-B (Rabbit)
192.168.36.127 zhutianwei (负载均衡)
将上面的Rabbit主机解析都加入到每个Rabbit主机的/etc/hosts中
二、在rabbit机器上部署RabbitMq,并可以正常启动,参考:http://blog.csdn.net/zhu_tianwei/article/details/40832185
三、设置每个节点Cookie
关闭所有rabbit服务,将M-zhutianwei-A 节点的/root/.erlang.cookie内容复制到其他两台机器。
#chmod 777 /root/.erlang.cookie
复制内容
#chmod 400 /root/.erlang.cookie
保持文件权限一致。
四、使用detached参数独立运行启动服务
nohup /usr/local/rabbitmq/sbin/rabbitmq-server –detached &
查看节点下的集群:/usr/local/rabbitmq/sbin/rabbitmqctl cluster_status
Cluster status of node 'rabbit@m-zhutianwei-a' ...
[{nodes,[{disc,['rabbit@m-zhutianwei-a']}]},
{running_nodes,['rabbit@m-zhutianwei-a']},
{cluster_name,<<"rabbit@M-zhutianwei-A">>},
{partitions,[]}]
五、将M-zhutianwei-C、S-zhutianwei-B作为内存节点与M-zhutianwei-A连接起来,执行如下命令:
/usr/local/rabbitmq/sbin/rabbitmqctl stop_app
/usr/local/rabbitmq/sbin/rabbitmqctl join_cluster --ram rabbit@m-zhutianwei-a
/usr/local/rabbitmq/sbin/rabbitmqctl start_app
上述命令先停掉rabbitmq应用,然后调用cluster命令,将M-zhutianwei-C或S-zhutianwei-B连接到,使两者成为一个集群,最后重启rabbitmq应用。在这个cluster命令下,M-zhutianwei-C、S-zhutianwei-B是内存节点,M-zhutianwei-A是磁盘节点(RabbitMQ启动后,默认是磁盘节点)。
如果要使M-zhutianwei-C或S-zhutianwei-B在集群里也是磁盘节点,join_cluster 命令去掉--ram参数即可
#/usr/local/rabbitmq/sbin/rabbitmqctl join_cluster rabbit@queue
只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。
六、运行cluster_status命令查看集群状态
/usr/local/rabbitmq/sbin/rabbitmqctl cluster_status
七、往任意一台集群节点里写入消息队列,会复制到另一个节点上,我们看到两个节点的消息队列数一致。
Listing queues ...
helloword 1
这样RabbitMQ集群就正常工作了。这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。下一节我们看看如何镜像模式来解决复制的问题,从而提高可用性 。
前言:从目前来看,基于RabbitMQ的分布式通信框架主要包括两部分内容,一是要确保可用性和性能,另一个就是编写当节点发生故障时知道如何重连到集群的应用程序。负载均衡就是解决处理节点的选择问题。
选择开源的HAProxy为RabbitMQ集群做负载均衡器,在CentOS 7.0中安装HAProxy。
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm//
yum -y install haproxy
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
vim /etc/haproxy/haproxy.cfg
listen rabbitmq_local_cluster 127.0.0.1:5670 //前段IP,供product和consumer来进行选择,由于5672端口已经默认使用,这里选择5670端口
mode tcp //负载均衡选项
balance roundrobin //轮询算法将负载发给后台服务器
server rabbit 127.0.0.1:5672 check inter 5000 rise 2 fall 3//负载均衡中的集群节点配置,这里选择的rabbit节点
listen private_monitoring :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 60s
输入
rabbitmqctl cluster_status
一顿报错,原因是没有文件权限
cd /var/lib/rabbitmq
chmod +x .erlang.cookie
chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie
就行了
我这里是报了个错,但是不影响部署,不用管,继续执行即可
参考网站:https://blog.csdn.net/qq315737546/article/details/53105418
参考网站:https://blog.csdn.net/woogeyu/article/details/51119101
参考网站:https://www.cnblogs.com/knowledgesea/archive/2017/03/11/6535766.html
RabbitMQ相关命令:https://blog.csdn.net/u013256816/article/details/53524814