公司号口项目让运维安装rabbitmq,结果rabbitmq页面state都显示down了,问运维居然说都正常,麻蛋欺负我无知,自己搞一遍试试。
前言
RabbitMQ是一个开源的强大的企业消息系统,支持主流的操作系统,支持多种开发语言。我们项目中使用RabbitMQ作为消息队列,解耦业务,构建高可靠的消息队列系统。RabbitMQ可以用在订单系统、日志系统、数据收集等常见场景中。
集群模式
RabbitMQ集群模式分为两种,普通模式和镜像模式。
普通模式
默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
镜像模式
将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现 RabbitMQ 的 HA 高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在 consumer 消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
节点信息
RAM node
内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
Disk node
将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。
RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
解决方案:设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。
认证方式
通过Erlang Cookie,相当于共享秘钥的概念,长度任意,只要所有节点都一致即可。rabbitmq server在启动的时候,erlang VM会自动创建一个随机的cookie文件。cookie文件的位置: /var/lib/rabbitmq/.erlang.cookie 或者/root/.erlang.cookie。我们的为保证cookie的完全一致,采用从一个节点copy的方式,实现各个节点的cookie文件一致。注意修改文件的权限:600
相关端口
4369 (epmd), 25672 (Erlang distribution):Epmd 是 Erlang Port Mapper Daemon 的缩写,在 Erlang 集群中相当于 dns 的作用,绑定在4369端口上。
5672, 5671 (AMQP 0-9-1 without and with TLS):AMQP 是 Advanced Message Queuing Protocol 的缩写,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,专为面向消息的中间件设计。基于此协议的客户端与消息中间件之间可以传递消息,并不受客户端/中间件不同产品、不同的开发语言等条件的限制。Erlang 中的实现有 RabbitMQ 等。
15672 (if management plugin is enabled):通过 http://serverip:15672 访问 RabbitMQ 的 Web 管理界面,默认用户名密码都是 guest。(注意:RabbitMQ 3.0之前的版本默认端口是55672,下同)
安装elang
安装 RabbitMQ 之前要安装 Erlang,去rabbitmq官网查看两者之间的关系:
访问 Erlang 的 Github,如下:https://github.com/rabbitmq/erlang-rpm/releases
本人下载
https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.2/erlang-23.3.2-1.el7.x86_64.rpm
下载rabbitmq
访问 RabbitMQ 的官网:https://www.rabbitmq.com/install-rpm.html#downloads
本人下载
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14-1.el7.noarch.rpm
开始安装
安装依赖socat,安装Erlang时需要
yum install -y socat
安装Erlang和rabbitmq
rpm -ivh erlang-23.3.2-1.el7.x86_64.rpm
rpm -ivh rabbitmq-server-3.8.14-1.el7.noarch.rpm
启动、关闭和重启rabbitmq
systemctl start rabbitmq-server #启动
systemctl start rabbitmq-server #关闭
systemctl restart rabbitmq-server #重启
systemctl enable rabbitmq-server #systemctl enable rabbitmq-server
查看rabbitmq当前状态
rabbitmqctl status #查看启动后的情况
systemctl status rabbitmq-server #服务状态
rabbitmq其它操作命令
#查看所有队列
rabbitmqctl list_queues
# 清除某个队列的数据
rabbitmqctl purge_queue queueName
# 清除所有队列数据以及用户数据、配置数据:慎用,记得要先把MQ 的meta data备份出来,reset后,将meta data导入即可。
rabbitmqctl reset
但是在使用此命令前,要先关闭应用,否则不能清除。关闭应用的命令为:
rabbitmqctl stop_app
执行了这两条命令后再次启动此应用。命令为:
rabbitmqctl start_app
再次执行命令:
rabbitmqctl list_queues
#查看所有虚拟主机
rabbitmqctl list_vhosts
#添加用户:
rabbitmqctl add_user username password
#列出所有用户:
rabbitmqctl list_users
#删除用户:
rabbitmqctl delete_user username
#清除用户权限:
rabbitmqctl clear_permissions -p vhostpath username
#列出用户权限:
rabbitmqctl list_user_permissions username
#修改密码:
rabbitmqctl change_password username newpassword
#设置用户权限:
rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*"
#创建虚拟主机:
rabbitmqctl add_vhost vhostpath
#列出所以虚拟主机:
rabbitmqctl list_vhosts
#列出虚拟主机上的所有权限:
rabbitmqctl list_permissions -p vhostpath
#删除虚拟主机:
rabbitmqctl delete_vhost vhost vhostpath
#移除所有数据,要在 rabbitmqctl stop_app 之后使用:
rabbitmqctl reset
#组成集群命令:
rabbitmqctl join_cluster <clusternode> [--ram]
#查看集群状态:
rabbitmqctl cluster_status
#修改集群节点的存储形式:
rabbitmqctl change_cluster_node_type disc | ram
#摘除节点:
rabbitmqctl forget_cluster_node [--offline]
#修改节点名称:
rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2 newnode2] [oldnode3 newnode3...]
启动失败
出现上面错误则首先设置hostname
hostnamectl set-hostname 主机名
#查看
hostname
#重启服务器
设置本地host
vi /etc/hosts
#输入
192.168.236.133 rabbitmqOne
#重启网卡
service network restart
然后重启网卡,再次启动即可
配置RabbitMQ
启动网页版插件
rabbitmq-plugins enable rabbitmq_management
创建用户名和密码并赋权限,便于网页登陆
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
关闭防火墙,访问端口15672即可看到如下页面;
rabbitmq插件管理
#插件列表:
rabbitmq-plugins list
#启动插件:
rabbitmq-plugins enable XXX (XXX为插件名)
#停用插件:
rabbitmq-plugins disable XXX
修改rabbitmq配置
安装新版的 RabbitMQ-3.8.x 后,发现找不到它的配置文件,事实上RabbitMQ-3.8.1并没有生成配置文件,需要我们手动添加配置文件。官方建议配置文件的位置:/etc/rabbitmq/rabbitmq.conf
如要修改rabbitmq的默认端口
vim /etc/rabbitmq/rabbitmq.conf
# AMQP 0-9-1 and 1.0 port,默认5672,允许远程访问
listeners.tcp.default = 0.0.0.0:56720
# web管理,默认15672
management.tcp.port = 56721
management.tcp.ip = 0.0.0.0
此时单机完成,开始集群配置
集群配置
配置host
首先搞三台服务器192.168.236.133、192.168.236.134、192.168.236.135
修改对应的hostname为rabbitmqOne、rabbitmqTwo、rabbitmqThree
修改hosts统一为如下所示
192.168.236.133 rabbitmqOne
192.168.236.134 rabbitmqTwo
192.168.236.135 rabbitmqThree
这里将192.168.236.133作为主节点,其它加入这个集群
同步cookie
注意rabbitmq通过.erlang.cookie进行集群验证,所以要保证一致,将192.168.236.133中替换其它服务器的.erlang.cookie
/var/lib/rabbitmq/.erlang.cookie
加入集群
保证192.168.236.133启动正常,在192.168.236.134和192.168.236.135上执行加入集群
首先关闭并清除数据
#首先关闭应用,否则不能清除
rabbitmqctl stop_app
# 清除所有队列数据以及用户数据、配置数据:慎用,记得要先把MQ 的meta data备份出来,reset后,将meta data导入即可。
rabbitmqctl reset
加入集群并启动
rabbitmqctl join_cluster rabbit@Ali398V16
#启动此应用
rabbitmqctl start_app
查看集群状态
rabbitmqctl cluster_status
显示如下则表示成功
Cluster status of node rabbit@rabbitmqthree ...
Basics
Cluster name: rabbit@rabbitmqOne
Disk Nodes
rabbit@rabbitmqOne
rabbit@rabbitmqthree
rabbit@rabbitmqtwo
Running Nodes
rabbit@rabbitmqOne
rabbit@rabbitmqthree
rabbit@rabbitmqtwo
Versions
rabbit@rabbitmqOne: RabbitMQ 3.8.14 on Erlang 23.3.2
rabbit@rabbitmqthree: RabbitMQ 3.8.14 on Erlang 23.3.2
rabbit@rabbitmqtwo: RabbitMQ 3.8.14 on Erlang 23.3.2
Maintenance status
Node: rabbit@rabbitmqOne, status: not under maintenance
Node: rabbit@rabbitmqthree, status: not under maintenance
Node: rabbit@rabbitmqtwo, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmqOne, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmqOne, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmqOne, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmqthree, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmqthree, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmqthree, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmqtwo, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmqtwo, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmqtwo, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled