RabbitMQ 消息队列
MQ 概念
MQ:Message queuing,消息队列是高并发系统的核心组件之一,消息队列的目的是为了实现各个应用程序之间的通讯,这样多个应用程序可以运行在不同的主机上,通过MQ就可以实现夸网络通信,因此 MQ 实现了业务的解耦和异步机制
消息列队的特点:
1,解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题
2,系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
3,提升性能与并发能力
目前主流的消息队列软件有 RabbitMQ、kafka、ActiveMQ、RocketMQ 等
RabbitMQ
官网: https://www.rabbitmq.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4WY8u7WP-1598186670378)(typora图片\29.png)]
RabbitMQ的优势:
基于erlang语言开发的开源软件,具有高并发优点、支持分布式,电信领域被广泛使用。
具有消息确认机制、消息持久化机制,消息可靠性和集群可靠性高
简单易用、运行稳定、跨平台、多语言
Broker:接收和分发信息的应用,即RabbitMQ
Exchange:消息到达Broker的第一站,根据类型分发到不同的Queue中
Queue:消息队列,等待消费者取走消息的地方,基于先进先出的原则进行顺序消费,可以持久化到磁盘节点服务器,可以缓存到内存节点服务器
RabbitMQ 单机部署
apt-cache madison rabbitmq-server #查看可以安装的版本,如果版本较低配置官方源
vim /etc/hosts
10.0.0.3 ubuntu1
apt-get install curl gnupg -y
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -
apt-get install apt-transport-https
vim /etc/apt/sources.list.d/bintray.rabbitmq.list
deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
apt update
apt-cache madison rabbitmq-server
apt-get install rabbitmq-server=3.8.4-1 -y --fix-missing
apt list rabbitmq-server #查看已安装的版本
systemctl restart rabbitmq-server
systemctl enable rabbitmq-server
ps aux |grep rabbitmq
ss -ntal
5672:消费者访问的端口
15672:web管理端口
25672:集群状态通信端口
Rabbitmq插件管理
rabbitmq-plugins list #查看所有插件
rabbitmq-plugins enable rabbitmq_management #打开web界面管理插件
rabbitmq-plugins version #查看版本
rabbitmq-plugins help #查看帮助
Rrabbitmq常用命令
rabbitmqctl --help
rabbitmqctl add_vhost ubuntu #创建vhost
rabbitmqctl delete_vhost ubuntu #删除vhost
rabbitmqctl list_vhosts #列出所有vhosts
rabbitmqctl list_queues #列出所有列队
rabbitmqctl add_user yun 123456 #添加用户yun
rabbitmqctl set_user_tags yun administrator #赋予yun超级管理员权限
rabbitmqctl set_permissions yun ".*" ".*" ".*" #设置yun对/的vhost有读写权限
Rabbitmq 集群部署
Rabbitmq 集群分为二种方式:
普通模式:创建好 RabbitMQ 集群之后的默认模式
镜像模式:把需要的队列做成镜像队列
普通集群模式:queue创建之后,如果没有其它policy,队列的数据仅保存一份,即创建该队列rabbitmq节点(A节点),当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer可以连接每一个节点,从中取消息,该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
镜像集群模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案(镜像模式是在普通模式的基础上,增加一些镜像策略)该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取
集群中有两种节点类型:
内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘集群中,集群至少需要一个磁盘节点来保存数据
vim /etc/hosts #每台MQ服务器做域名解析
10.0.0.3 ubuntu1
10.0.0.13 ubuntu2
10.0.0.23 ubuntu3
apt-get install curl gnupg -y
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -
apt-get install apt-transport-https
vim /etc/apt/sources.list.d/bintray.rabbitmq.list
deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
apt update
apt-cache madison rabbitmq-server
apt-get install rabbitmq-server=3.8.4-1 -y --fix-missing #每台服务器进行安装
apt list rabbitmq-server
systemctl restart rabbitmq-server
systemctl enable rabbitmq-server
ss -ntal #检查端口
scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.13:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.23:/var/lib/rabbitmq/.erlang.cookie
systemctl restart rabbitmq-server
#mq1与mq2 作为内存节点添加到 mq3
#mq1与mq2执行以下命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@ubuntu3 --ram #不加--ram默认是磁盘节点
rabbitmqctl start_app
#将集群设置为镜像模式,任意节点执行即可
rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
rabbitmqctl cluster_status #查看集群状态
rabbitmq-plugins enable rabbitmq_management #各节点启动web界面插件
rabbitmqctl add_user yun 123456 #添加用户yun
rabbitmqctl set_user_tags yun administrator #赋予yun超级管理员权限
登录任意节点web界面 10.0.0.3:15672 yun:123456