RabbitMQ是什么?
MQ(Message Queue,消息队列)消息中间件,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息同步。
原理介绍
rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点
rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制
1.普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
2.镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
RabbitMQ的结构图
亲测可用,超详细RabbitMQ消息队列集群配置
环境部署
IP地址 主机名 操作系统 用途
192.168.92.145 mq01 CentOS 7.4x86_64 磁盘节点
192.168.92.156 mq02 CentOS 7.4x86_64 内存节点
192.168.92.157 mq03 CentOS 7.4x86_64 内存节点
开始部署
1.关闭防火墙和selinux(3台服务器都要关)
systemctl stop firewalld.service
setenforce 0
2.修改主机名
1.mq01服务器
hostnamectl set-hostname mq01.localdomain
2.mq02服务器
hostnamectl set-hostname mq02.localdomain
3.mq03服务器
hostnamectl set-hostname mq03.localdomain
3.修改三个节点hosts文件,将以下内容分别加入三台服务器上。
192.168.92.145 mq01
192.168.92.156 mq02
192.168.92.157 mq03
亲测可用,超详细RabbitMQ消息队列集群配置
4.三个节点配置epel源,安装rabbitmq软件包
yum install epel-release -y
yum install rabbitmq-server -y
5.建立软连接
ln -s /usr/lib/rabbitmq/bin/* /usr/bin
6.查看插件的信息
rabbitmq-plugins list
亲测可用,超详细RabbitMQ消息队列集群配置
7.启用rabbitmq_management服务
rabbitmq-plugins enable rabbitmq_management
8.启动rabbitmq服务
systemctl start rabbitmq-server.service
9.使用以下命令检查三台的集群状态,目前相互独立,没有形成集群
rabbitmqctl cluster_status
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
10.使用以下命令查看端口开放说明正常。(其中15672和55672都是rabbitmq的管理端口,5672则是和生产者、消费者通信的端口。)
netstat -ntap | grep 5672
亲测可用,超详细RabbitMQ消息队列集群配置
11.停止三台服务器
systemctl stop rabbitmq-server.service
12.把mq01的cookie值复制到mq02和mq03服务器
vim /var/lib/rabbitmq/.erlang.cookie
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
13.开启3台rabbitmq服务
systemctl start rabbitmq-server.service
14.以下操作只在mq02服务器和mq03服务器上操作
1.关闭rabbitmq应用
rabbitmqctl stop_app
亲测可用,超详细RabbitMQ消息队列集群配置
2.分别在mq02服务器、mq03服务器上把mq02、mq03作为内存节点与mq01磁盘节点连接起来。
rabbitmqctl join_cluster --ram rabbit@mq01
3.启动rabbitmq应用
rabbitmqctl start_app
分别查看3台rabbitmq服务器的状态
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
加用户rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
通过浏览器输入http://192.168.175.132:15672访问RabbitMQ(默认用户名:guest 密码:guest)
亲测可用,超详细RabbitMQ消息队列集群配置
亲测可用,超详细RabbitMQ消息队列集群配置
rabbitmq配置文件
vim rabbitmq.conf
listeners.tcp.default = 5672
num_acceptors.tcp = 10
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
management.http_log_dir = /var/log/rabbitmq/management_access
#management.load_definitions = /etc/rabbitmq/rabbitmq-definitions.json
vm_memory_high_watermark.absolute = 512MiB
vm_memory_high_watermark_paging_ratio = 0.3
cluster_name = rabbitmq-cluster
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
#cluster_formation.classic_config.nodes.1 = rabbit@mq01
cluster_formation.classic_config.nodes.2 = rabbit@mq02
cluster_formation.classic_config.nodes.3 = rabbit@mq03
loopback_users.guest = true
vim rabbitmq-env.confbr/>RABBITMQ_NODENAME=rabbit@mq03
RABBITMQ_NODE_IP_ADDRESS=0.0.0.0
RABBITMQ_NODE_PORT=5672
RABBITMQ_LOG_BASE=/var/log/rabbitmq
RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia
来源:oschina
链接:https://my.oschina.net/u/4416538/blog/4533937