rabbitmq集群搭建-镜像模式

rabbitmq简介

RabbitMQ 采用 Erlang 语言开发,Erlang 语言由 Ericson 设计,Erlang 在分布式编程和故障恢复方面表现出色,电信领域被广泛使用。

Broker: 接收和分发消息的应用,RabbitMQ Server 就是Message Broker,一个Broker节点(RabbitMQ)。

Virtual host: 出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念,当多个不同的用户使用同一个RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的vhost创建 exchange/queue 等。

Connection: publisher/consumer 和 broker 之间的 TCP 连接。

Channel: 如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread 创建单独的channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和message broker识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的Connection极大减少了操作系统建立 TCP connection 的开销。

Exchange: message(消息) 到达 broker(服务器节点) 的第一站,根据分发规则,匹配查询表中的routing key(路由器key),分发消息到 queue(队列) 中去。常用的类型有:direct (point-to-point点对点), topic(publish-subscribe发布者和定位者模型) and fanout (multicast组播)。

Queue: 消息最终被送到这里等待 consumer 取走。

Binding: exchange 和 queue 之间的虚拟连接,binding 中可以包含routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。

rabbitmq 优势:基于 erlang 语言开发,具有高并发优点、支持分布式具有消息确认机制、消息持久化机制,消息可靠性和集群可靠性高简单易用、运行稳定、跨平台、多语言开源

Queue 的特性:

消息基于先进先出的原则进行顺序消费,由开发定义先进先出还是随机顺序消费,一般都是先进先出

消息可以持久化到磁盘节点服务器,进行持久化保存叫持久化节点

消息可以缓存到内存节点服务器提高性能,他可以充分利用内存的性能来提高数据的读写,读写性能强,如果节点挂内存的数据是无法恢复的

通常RabbitMQ会有一个节点做持久化数据,另外2个集群节点做消息缓存到内存,来提高RabbitMQ的性能

消费者模式下,消息只能被消费一次,有多个消息者消费的消息不会重复

 

 

集群模式介绍

rabbitmq集群模式没有master和salve的身份也不需要选举


普通模式:创建好 RabbitMQ 集群之后的默认模式,普通模式写入数据,在A节点写入数据数据实体保存在A节点上面A节点挂了数据就会丢失,用户请求B服务器访问数据,数据会临时从A同步到B,数据的实体只存在一台服务器当中,数据存在丢失的情况,数据存在丢失的可能,占用的
存储空间较少。消息只能被消费一次 镜像模式:把需要的队列做成镜像队列。镜像模式类似riad1,每个服务器的数据都是一样的,默认为3个节点无论你写到那个服务器上都会同步到集群的另外的2个服务器,好处是数据不会丢失,另外2个服务器都有数据备份,这种集群称为数据集群,这种集群的数据完整性是最好的 普通模式 有A、B、C3台节点,普通模式生产者向rabbitmq写入消息,消息写入到集群的一个A节点将消息持久化到磁盘上,当消费者请求B服务器读取消息的时候,消息会临时从A节点同步到B节点返回给消费者,消费者可以访问任意节点读取数据,数据的实体存在某台服务器上面,数据存在丢失
的可能,占用的存储空间较少。 镜像模式 有A、B、C3台节点,镜像模式生产者向rabbitmq写入消息,消息写入到节点A节点,A节点会主动同步到B和C的节点,所以数据的实体存在集群3台服务器当中,镜像模式下,每个节点都存储一份消息数据,占用的存储空间更多,由于消息需要在节点之间复制,消息过会增加消息的延迟
和cpu内存负载高,在数据要求比较高的时候使用。 消费链接mq消费消息以后,消息不会立即删除,要过一会才会自动删除,消息只能被消费一次

点对点模式,指的是同一个时刻,一个生产者和一个队列,一个消费者很少使用。
消费者模式,消息只能被消费一次,消费者链接MQ以后,会一直监听mq一直在等待消息,如果有3个消费者,有消息写入,消息会被随机分配给3个消费者,3个消费者读取的消息是不重复的

 

节点介绍

rabbitmq集群有内存节点和磁盘节点,磁盘节点可以保存数据,内存节点缓存数据,消息可以持久化到磁盘节点服务器,进行持久化保存叫持久化节点,消息可以缓存到内存节点服务器提高性能,集群搭建完成普通集群模式

集群中有两种节点类型
内存节点:只将数据保存到内存,重启内存节点数据会丢失,读写性能高
磁盘节点:保存数据到内存和磁盘。磁盘节点是默认,单机就是磁盘节点,磁盘节点可以把内存的数据保存到磁盘上面,这样数据就不会丢失
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失。集群当中只需要一个磁盘节点即可,可以提高rabbitmq的吞吐量,推荐3个
或者5个节点,2个节点也可以一个内存和磁盘节点

写入数据步骤

生产者产生消息发送消息到 broker server(RabbitMQ),在 Broker(步路可rabbitmq)内部,用户创建Exchange(虚拟交换机)/Queue队列,通过 Binding(虚拟链接) 规则将两者联系在一起(将消息队列和虚拟交换机绑定起来),Exchange 分发消息
(绑定起来以后Exchange 会根据路由器key把消息写到指定的队列里面去),根据类型/binding 的不同分发策略有区别(消息会写到不同的队列里面),消息最后来到 Queue队列中 中,等待消费者取走。

集群搭建

#集群环境搭建实操
#修改主机名称
hostnamectl set-hostname mq1
hostnamectl set-hostname mq2
hostnamectl set-hostname mq3


#系统为Ubuntu20.04
#以下操作在3台服务器执行
#配置hosts
cat >>/etc/hosts<<'EOF'
10.0.0.70 mq1
10.0.0.72 mq2
10.0.0.71 mq3
EOF


#查看可以安装的版本
apt-cache madison rabbitmq-server


#20.04直接安装方法,此方法直接安装不需要按照官网的步骤按照,清华大学官方镜像源
apt install rabbitmq-server=3.8.2-0ubuntu1.4 -y

#启动
systemctl --now start rabbitmq-server.service 
systemctl status rabbitmq-server.service

#停止3台mq服务
systemctl stop rabbitmq-server.service 

#查看cookie文件,搭建集群3台机器cookie文件要一样
root@mq3:~# ls -l /var/lib/rabbitmq/.erlang.cookie 
-r-------- 1 rabbitmq rabbitmq 20 Sep 22 00:00 /var/lib/rabbitmq/.erlang.cookie

#从mq3推送到另外2台服务器
rsync -a /var/lib/rabbitmq/.erlang.cookie 10.0.0.72:/var/lib/rabbitmq/.erlang.cookie
rsync -a /var/lib/rabbitmq/.erlang.cookie 10.0.0.73:/var/lib/rabbitmq/.erlang.cookie
#检查/var/lib/rabbitmq/.erlang.cookie
root@mq1:~# cat /var/lib/rabbitmq/.erlang.cookie
AAKFJREHRYNPWANDYYAE
root@mq2:~# cat /var/lib/rabbitmq/.erlang.cookie
AAKFJREHRYNPWANDYYAE
root@mq3:~# cat /var/lib/rabbitmq/.erlang.cookie
AAKFJREHRYNPWANDYYAE

 


#启动3台mq
systemctl start rabbitmq-server.service

 

#查看集群信息
root@mq3:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq3 ...
Basics

Cluster name: rabbit@mq3 #集群名称

Disk Nodes #磁盘服务器是本机默认是磁盘节点

rabbit@mq3

Running Nodes #正在运行的节点

rabbit@mq3

Versions

rabbit@mq3: RabbitMQ 3.8.2 on Erlang 22.2.7 #版本信息

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@mq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

 

#mq1和mq2停止写入数据
root@mq2:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq2 ...
root@mq1:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq1 ...
#mq1和mq2,加入集群,数据必须是空的
root@mq1:~# rabbitmqctl reset
Resetting node rabbit@mq1 ...
root@mq2:~# rabbitmqctl reset
Resetting node rabbit@mq2 ...

 

#把mq1加入到集群
#rabbit(协议)rabbit@mq3(集群名称),--ram配置角色为内存角色,不加--ram默认是磁盘节点
#join_cluster集群名称
rabbitmqctl join_cluster rabbit@mq-server3 --ram
#把mq3加入到mq1,因为cookie文件是从mq3同步到mq1和mq2的
root@mq1:~# rabbitmqctl join_cluster rabbit@mq3 --ram
Clustering node rabbit@mq1 with rabbit@mq3
#启动写入数据
root@mq1:~# rabbitmqctl start_app
Starting node rabbit@mq1 ...
completed with 0 plugins.

 

#配置mq2,其中mq3作为磁盘节点
rabbitmqctl stop_app
rabbitmqctl reset
root@mq2:~# rabbitmqctl join_cluster rabbit@mq3 --ram
Clustering node rabbit@mq2 with rabbit@mq3
#启动写入数据
root@mq2:~# rabbitmqctl start_app
Starting node rabbit@mq2 ...
completed with 3 plugins.

 

#再次查看集群状态
root@mq3:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq3 ...
Basics

Cluster name: rabbit@mq3

Disk Nodes#磁盘节点

rabbit@mq3

RAM Nodes

rabbit@mq1
rabbit@mq2

Running Nodes#内存节点

rabbit@mq1
rabbit@mq3

Versions #在运行的节点

rabbit@mq1: RabbitMQ 3.8.2 on Erlang 22.2.7#版本信息
rabbit@mq3: RabbitMQ 3.8.2 on Erlang 22.2.7

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@mq1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@mq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
#此时就是默认模式

 

#配置镜像模式,是针对整个集群生效的,在任意一个节点执行,此时数据就会自动同步到3台mq服务器
root@mq3:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

 

#重新创建账号,集群创建的账号会在3个节点进行同步
root@mq3:~# rabbitmqctl add_user jack 123456
Adding user "jack" ...
#设置超级管理员权限
root@mq3:~# rabbitmqctl set_user_tags jack administrator
Setting tags for user "jack" to [administrator] ...

#3个节点启动web管理页面,启动web插件
rabbitmq-plugins enable rabbitmq_management

 

检查端口
root@mq1:~# lsof -i:15672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 2548 rabbitmq 93u IPv4 53263 0t0 TCP *:15672 (LISTEN)
root@mq3:~# lsof -i:15672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 3806 rabbitmq 94u IPv4 54215 0t0 TCP *:15672 (LISTEN)
root@mq2:~# lsof -i:15672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 6681 rabbitmq 92u IPv4 57044 0t0 TCP *:15672 (LISTEN)
#另外mq2没有启动web插件,现在这样是查看不到集群信息的
#日志目录
root@mq1:/var/log/rabbitmq# pwd
/var/log/rabbitmq

root@mq1:/var/log/rabbitmq# ls -l /var/log/rabbitmq
total 48
drwxr-x--- 2 rabbitmq rabbitmq 23 Sep 22 18:15 log
-rw-r----- 1 rabbitmq rabbitmq 33518 Sep 22 18:33 rabbit@mq1.log
-rw-r----- 1 rabbitmq rabbitmq 135 Sep 22 18:21 rabbit@mq1_upgrade.log
-rw-r----- 1 rabbitmq rabbitmq 122 Sep 22 18:21 startup_err
-rw-r----- 1 rabbitmq rabbitmq 1083 Sep 22 18:21 startup_log

 rabbitmq常用命令

改密码
rabbitmqctl change_password janeway newpassword

删除用户
rabbitmqctl delete_user janeway

查看用户列表
rabbitmqctl list_users

把用户设置为超级管理员
rabbitmqctl set_user_tags janewayl administrator

创建用户janewayl
rabbitmqctl set_user_tags janewayl

添加用户
rabbitmqctl add_user janeway changeit

 

监控使用的api

#获取集群节点是running状态
curl -s -u guest:guest http://localhost:15672/api/node
 
#获取集群名称
 curl -s -u guest:guest http://localhost:15672/api/cluster-name
 root@mq3:~#  curl -s -u guest:guest http://localhost:15672/api/cluster-name
{"name":"rabbit@mq3"}
 
 
 获取浏览信息
 curl -s -u guest:guest http://localhost:15672/api/overview
 
 获取活动链接
 curl -s -u guest:guest http://localhost:15672/api/connections
 
 
获取队列 
 curl -s -u guest:guest http://localhost:15672/api/queues

查看账号信息
root@mq3:~# curl -s -u guest:guest http://localhost:15672/api/users
[{"name":"guest","password_hash":"iNoYynkNiTyzsnAwPFyvV0lziNhdKAje4FpcDbkkvpqPpO7b","hashing_algorithm":"rabbit_password_hashing_sha256","tags":"administrator"},{"name":"jack","password_hash":"vrMZuNUgPwqOmBKuorESLQbLcX4CSFtRncUFZol4ElWTz0gJ","hashing_algorithm":"rabbit_password_hashing_sha256","tags":"administrator"}]

查看本机的node节点的心态
curl -s -u guest:guest http://localhost:15672/api/healthchecks/node
root@mq3:~# curl -s -u guest:guest http://localhost:15672/api/healthchecks/node
{"status":"ok"}

 

posted @ 2023-09-24 01:29  YYQ-  阅读(609)  评论(0编辑  收藏  举报