安装单机MQ
官网
https://www.rabbitmq.com/download.html
## Ubuntu
https://www.rabbitmq.com/install-debian.html
更新源
[root@mq1 ~]# apt-get update -y
安装软件
[root@mq1 ~]# sudo apt-get install curl gnupg debian-keyring debian-archive-keyring apt-transport-https -y
下载
[root@mq1 ~]# curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -
下载
[root@mq1 ~]# sudo apt-get install curl gnupg debian-keyring debian-archive-keyring apt-transport-https -y
导入key
[root@mq1 ~]# sudo apt-key adv --keyserver "hkps://keys.openpgp.org" --recv-keys "0x0A9AF2115F4687BD29803A206B73A36E6026DFCA"
导入key
[root@mq1 ~]# sudo apt-key adv --keyserver "keyserver.ubuntu.com" --recv-keys "F77F1EDA57EBB1CC"
下载
[root@mq1 ~]# curl -1sLf 'https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey' | sudo apt-key add -
添加源
[root@mq1 ~]# sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
# Provides modern Erlang/OTP releases
#
# "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
# See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
deb-src http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
# Provides RabbitMQ
#
# "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
# See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
deb-src https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
EOF
更新源
[root@mq1 ~]# sudo apt-get update -y
安装erlang
[root@mq1 ~]# sudo apt-get install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key erlang-runtime-tools erlang-snmp erlang-ssl erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
安装mq
[root@mq1 ~]# sudo apt-get install rabbitmq-server -y --fix-missing
查看安装的版本
[root@mq1 ~]# rabbitmqctl version
查看服务状态
[root@mq1 ~]# systemctl status rabbitmq-server.service
查看服务端口
[root@mq1 ~]# ss -tanl
5672:消费者访问的端口
15672:web界面管理端口
25672:集群状态通信端口
查看插件
[root@mq1 ~]# rabbitmq-plugins list
开启mq的web界面
[root@mq1 ~]# rabbitmq-plugins enable rabbitmq_management
创建用户和密码
[root@mq1 ~]# rabbitmqctl add_user longge 123456
列出用户
[root@mq1 ~]# rabbitmqctl list_users
使用命令授权给用户
[root@mq1 ~]# rabbitmqctl set_user_tags longge administrator
查看授权的用户
[root@mq1 ~]# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
longge [administrator]
常见命令
#创建 vhost
root@mq-server1:~# rabbitmqctl add_vhost m44
Adding vhost "m44" ... #列出所有 vhost
root@mq-server1:~# rabbitmqctl list_vhosts
Listing vhosts ... name
m44
/
#列出所有队列
root@mq-server1:~# rabbitmqctl list_queues
Timeout: 60.0 seconds ... Listing queues for vhost / ...
#删除指定 vhost
root@mq-server1:~# rabbitmqctl delete_vhost m44
Deleting vhost "m44" ... #添加账户 long 密码为 123456
root@mq-server1:~# rabbitmqctl add_user long 123456
Adding user "long" ...
#更改用户密码
root@mq-server1:~# rabbitmqctl change_password long 654321
Changing password for user "long" ... #设置 jack 用户对 m44 的 vhost 有读写权限,三个点为配置正则、读和写
root@mq-server1:~# rabbitmqctl set_permissions -p m44 long ".*" ".*" ".*"
Setting permissions for user "long" in vhost "m44" ...
MQ集群
Rabbitmq 集群分为二种方式:
普通模式:创建好 RabbitMQ 集群之后的默认模式。
镜像模式:把需要的队列做成镜像队列。
普通集群模式:
queue 创建之后,如果没有其它 policy,消息实体只存在于其中
一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的
数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节
点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行
消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer
可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后,
B 节点无法取到 A 节点中还未消费的消息实体。
镜像集群模式:
把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜
像模式是在普通模式的基础上,增加一些镜像策略)
该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消
息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,该模
式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之
大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在
对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy,
然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集
群模式或镜像队列
集群中有两种节点类型:
内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘。
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁
盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,
否则所有数据消息在服务器全部停机之后都会丢失。
推荐设计架构:
在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节
点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作
为数据备份使用。
创建 RabbitMQ 集群:
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的
集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个
cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须
保证各节点 cookie 保持一致,否则节点之间就无法通信。
Ubuntu 1804 安装集群版 RabbitMQ:
集群环境,三台服务器,具体 IP 如下:
172.31.2.41
172.31.2.42
172.31.2.43
主机名解析配置:
各 MQ 服务器配置本地主机名解析:
[root@mq1 ~]# vim /etc/hosts
172.31.2.41 mq1.exmple.local mq1
172.31.2.42 mq2.exmple.local mq2
172.31.2.43 mq3.exmple.local mq3
各服务器安装 RabbitMQ:
看上面的单机
全部都要启动 RabbitMQ 服务:
[root@mq1 ~]# systemctl start rabbitmq-server.service
[root@mq1 ~]# systemctl enable rabbitmq-server.service
先各服务器关闭 RabbitMQ
[root@mq1 ~]# systemctl stop rabbitmq-server
[root@mq2 ~]# systemctl stop rabbitmq-server
[root@mq3 ~]# systemctl stop rabbitmq-server
在 mq-server1 同步.erlang.cookie 至其他两台服务器:
[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 172.31.2.42:/var/lib/rabbitmq/.erlang.cookie
[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 172.31.2.43:/var/lib/rabbitmq/.erlang.cookie
各服务器启动 RabbitMQ:
[root@mq1 ~]# systemctl start rabbitmq-server.service
[root@mq2 ~]# systemctl start rabbitmq-server.service
[root@mq3 ~]# systemctl start rabbitmq-server.service
查看当前集群状态:
[root@mq1 ~]# rabbitmqctl cluster_status
其他的机器开启web界面
[root@mq2 ~]# rabbitmq-plugins enable rabbitmq_management
[root@mq3 ~]# rabbitmq-plugins enable rabbitmq_management
创建 RabbitMQ 集群:
在 mq-server1 作为内存节点添加到 mq-server3,并作为内存节点,在 mq-server1
执行以下命令:停止 app 服务
[root@mq1 ~]# rabbitmqctl stop_app
清空元数据
[root@mq1 ~]# rabbitmqctl reset
将 rabbitmq-server1 添加到集群当中,并成为内存节点,不加--ram 默认是磁盘节点
[root@mq1 ~]# rabbitmqctl join_cluster rabbit@mq3 --ram
启动服务
[root@mq1 ~]# rabbitmqctl start_app
在 mq-server2 作为内存节点添加到 mq-server3,并作为内存节点,在 mq-server2
执行以下命令:
[root@mq2 ~]# rabbitmqctl join_cluster rabbit@mq3 --ram
启动服务
[root@mq2 ~]# rabbitmqctl start_app
mq3查看集群
[root@mq3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq3 ...
Basics
Cluster name: rabbit@mq3.exmple.local
Disk Nodes
rabbit@mq3
RAM Nodes
rabbit@mq1
rabbit@mq2
Running Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
Versions
rabbit@mq1: RabbitMQ 3.9.3 on Erlang 24.0.5
rabbit@mq2: RabbitMQ 3.9.3 on Erlang 24.0.5
rabbit@mq3: RabbitMQ 3.9.3 on Erlang 24.0.5
Maintenance status
Node: rabbit@mq1, status: not under maintenance
Node: rabbit@mq2, status: not under maintenance
Node: rabbit@mq3, status: not under maintenance
...
将集群设置为镜像模式:
只要在其中一台节点执行以下命令即可:
[root@mq3 ~]# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
创建登录账户
[root@mq3 ~]# rabbitmqctl add_user longge 123456
[root@mq3 ~]# rabbitmqctl set_user_tags longge administrator
API 用于监控
https://rawcdn.githack.com/rabbitmq/rabbitmq-management/v3.8.9/priv/www/api/index.html