一、什么是RabbitMQ?
MQ(Message Queue,消息队列)消息中间件,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息同步。
二、RabbitMQ原理介绍
rabbitmq是依据erlang的分布式特性(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消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
三、部署RabbitMQ集群(镜像模式)
IP | 主机名 | 操作系统 | RabbitMQ | Erlang |
---|---|---|---|---|
192.168.0.101 | rmq1 | CentOS 7.3 | 3.7.17 | 21.0.2 |
192.168.0.102 | rmq2 | CentOS 7.3 | 3.7.17 | 21.0.2 |
192.168.0.103 | rmq3 | CentOS 7.3 | 3.7.17 | 21.0.2 |
1、基础环境配置
(1)关闭防火墙及selinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
(2)修改主机名及hosts
hostnamectl set-hostname rmq1
hostnamectl set-hostname rmq2
hostnamectl set-hostname rmq3
...
cat >> /etc/hosts <<EOF
192.168.0.101 rmq1
192.168.0.102 rmq2
192.168.0.103 rmq3
EOF
2、安装RabbitMQ
其中Erlang的版本需要跟RabbitMQ版本对应,具体的版本对应关系可查看官网:https://www.rabbitmq.com/which-erlang.html#compatibility-matrix
本文使用的所有包在centos 7.3环境下经过验证,如其他版本系统提示依赖缺少,yum安装即可
链接:https://pan.baidu.com/s/17vDQuzCK2RhTNTm_oEd5ig 提取码:cj4g
unzip RabbitMQ.zip && rm -rf RabbitMQ.zip && cd RabbitMQ
yum -y install ./*
默认安装目录为:/usr/lib/rabbitmq/
3、配置文件创建及修改
默认安装之后的rabbitmq的配置可能不满足实际使用场景的需求,可以在rabbitmq配置文件夹下修改或添加自定义配置
#拷贝配置文件,在此文件内进行优化
cp /usr/share/doc/rabbitmq-server-3.7.17/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vim /etc/rabbitmq/rabbitmq.config
搜索配置项“%% {hipe_compile, false},”并修改为“{hipe_compile, true}”,注意最后的“,”去掉,此项配置为使用HiPE预编译部分RabbitMQ,增加服务器吞吐量,但会增加服务器的启动时间,花费几分钟延迟启动的成本,就可以带来20-50% 更好性能
#创建数据存储目录及日志目录
mkdir -p /data/rabbitmq/{mnesia,log}
chown -R rabbitmq:rabbitmq /data/rabbitmq/{mnesia,log}
#创建或新增环境参数配置文件,可在此文件内添加自定义的数据及日志存储目录
vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/data/rabbitmq/log
4、启动RabbitMQ
因为启用了“hipe_compile”配置,所以启动会比较慢需耐心等待,可通过/var/log/message查看整个过程
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
5、启用RabbitMQWeb管理插件
rabbitmq-plugins enable rabbitmq_management
6、配置(仅在主节点执行,这里选择rmq1节点)
(1)创建admin用户(管理页面15672的用户)
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
(2)查看erlang.cookie的位置并分发到集群中各个节点(根据现场环境实际路径查找)
cat /data/rabbitmq/log/rabbit@`hostname`.log | grep home | uniq
home dir : /var/lib/rabbitmq
ls -a /var/lib/rabbitmq/
. .. .erlang.cookie mnesia
将主节点的erlang.cookie分发到各个节点
scp /var/lib/rabbitmq/.erlang.cookie 192.168.0.102:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 192.168.0.103:/var/lib/rabbitmq/
7、将子节点加入集群,分别在需要加入集群的节点操作即可
(1)重启rabbitmq-server,使新的erlang.cookie生效
systemctl restart rabbitmq-server
(2)将节点加入集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rmq1
rabbitmqctl start_app
8、设置镜像策略(选择rmq1节点操作即可)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
9、查看集群
rabbitmqctl cluster_status
Cluster status of node rabbit@rmq1 ...
[{nodes,[{disc,[rabbit@rmq1,rabbit@rmq2,rabbit@rmq3]}]},
{running_nodes,[rabbit@rmq3,rabbit@rmq2,rabbit@rmq1]},
{cluster_name,<<"rabbit@rmq2">>},
{partitions,[]},
{alarms,[{rabbit@rmq3,[]},{rabbit@rmq2,[]},{rabbit@rmq1,[]}]}]
登陆15672管理页面也可以查看到集群的情况