RabbitMQ介绍及linux下集群部署

一、什么是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管理页面也可以查看到集群的情况
在这里插入图片描述

原创文章 91 获赞 183 访问量 59万+

猜你喜欢

转载自blog.csdn.net/ywd1992/article/details/99471874