安装RabbitMQ单机和集群

安装单机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
posted @ 2021-08-20 21:11  空白的旋律  阅读(108)  评论(0编辑  收藏  举报