产线一直在用的 RabbitMQ 搭建教程(含负载均衡配置,验证脚本,监控案例),偷偷抄出来的,建议收藏备用

news2024/11/14 20:41:00

本文介绍公司一直在用的 rabbitmq 集群安装部署过程,版本不算太新,但一直稳定运行,对其他版本安装也有一定的参考价值,建议收藏备用。

简介

官网:https://www.rabbitmq.com/

RabbitMQ 是一个开源的遵循 AMQP(Advanced Message Queuing Protocol) 协议实现的基于 Erlang 语言编写,支持多种客户端(语言),用于在分布式系统中存储消息,转发消息,具有高可用高可扩展性,易用性等特征。

AMQP :高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全。

总之,就一句话:RabbitMQ 是一个消息队列中间件

安装

rabbitmq依赖erlang环境,类似java依赖jvm一样。

资源准备

机器列表

  • 10.100.16.201,centos7

  • 10.100.16.202,centos7

  • 10.100.16.203,centos7

软件版本,rabbitmq 对 erlang 版本有一定要求,建议直接用我提供的版本练手

  • rabbitmq,3.8.14

  • erlang,23.2.7

下载地址 因为我这里只实践了 centos 这里有 rpm 包

https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.14

https://github.com/rabbitmq/erlang-rpm/releases/tag/v23.2.7

安装步骤

安装基础软件包

# centos 扩展软件库,
yum -y install epel-release 
# 高效的数据传输库,rabbitmq 需要
yum -y install socat 

下载 rpm 包至本地然后直接安装

  • erlang-23.2.7-1.el7.x86_64.rpm

  • rabbitmq-server-3.8.14-1.el7.noarch.rpm

# 下载至本地安装
# 创建一个临时目录存放 rpm 包,安装后可以删除
mkdir -p /data/rabbitmq
cd /data/rabbitmq
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.2.7/erlang-23.2.7-1.el7.x86_64.rpm
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14-1.el7.noarch.rpm

yum install -y erlang-23.2.7-1.el7.x86_64.rpm
yum install -y rabbitmq-server-3.8.14-1.el7.noarch.rpm

在 centos 上 rabbitmq 采用 systemd 管理启停比较方便

# 启动
systemctl start rabbitmq-server
# 查看状态
systemctl status rabbitmq-server
# 停止
systemctl stop rabbitmq-server
# 开机自启
systemctl enable rabbitmq-server

启动 rabbitmq 开启 管理控制台 插件(三台机器均需开启此插件)

rabbitmq-plugins enable rabbitmq_managementrabbitmq 

启动后需要开启特定的端口放行 或者 关闭防火墙(懒人必备,慎用)

systemctl stop firewalld
systemctl disable firewalld

集群配置

3 台机器需要组成一个集群需要共享同一份 erlang cookie, 内容随意,保证 3 台相同即可。

echo 'AZVOCZYZZBVFLBPTBXU' > /var/lib/rabbitmq/.erlang.cookie
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie

配置 3 台机器的 /etc/hosts, 默认启动会采用 hostname 作为节点标识,确保其能通过 hostname 相互访问

10.100.16.201 prod-rabbitmq-16-201
10.100.16.202 prod-rabbitmq-16-202
10.100.16.203 prod-rabbitmq-16-203

启动 3 台 rabbitmq-server,并分别在 202,203 上执行加入集群的指令

systemctl start rabbitmq-server
 
 
# 在 202 上操作
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@prod-rabbitmq-16-201
# 4.启动服务
rabbitmqctl start_app

 
# 在 203 上操作


rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@prod-rabbitmq-16-201
rabbitmqctl start_app

然后,可以在 201 上确认集群的状态

rabbitmqctl cluster_status
 
 
# 输出内容参考
Cluster status of node rabbit@prod-rabbitmq-16-201 ...
Basics
# 集群名称
Cluster name: rabbit@prod-rabbitmq-16-201
# 磁盘节点
Disk Nodes
 
rabbit@prod-rabbitmq-16-201
rabbit@prod-rabbitmq-16-202
rabbit@prod-rabbitmq-16-203
# 运行中节点
Running Nodes
 
rabbit@prod-rabbitmq-16-201
rabbit@prod-rabbitmq-16-202
rabbit@prod-rabbitmq-16-203
# 版本信息
Versions
 
rabbit@prod-rabbitmq-16-201: RabbitMQ 3.8.14 on Erlang 23.2.7
rabbit@prod-rabbitmq-16-202: RabbitMQ 3.8.14 on Erlang 23.2.7
rabbit@prod-rabbitmq-16-203: RabbitMQ 3.8.14 on Erlang 23.2.7
# 维护状态
Maintenance status
 
Node: rabbit@prod-rabbitmq-16-201, status: not under maintenance # 未在维护中
Node: rabbit@prod-rabbitmq-16-202, status: not under maintenance # 未在维护中
Node: rabbit@prod-rabbitmq-16-203, status: not under maintenance # 未在维护中
# 告警
Alarms
 
(none)
# 网络分区
Network Partitions
 
(none)
# 监听端口
Listeners
 
Node: rabbit@prod-rabbitmq-16-201, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@prod-rabbitmq-16-201, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@prod-rabbitmq-16-201, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@prod-rabbitmq-16-202, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@prod-rabbitmq-16-202, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@prod-rabbitmq-16-202, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@prod-rabbitmq-16-203, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@prod-rabbitmq-16-203, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@prod-rabbitmq-16-203, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
# 特性
Feature flags
 
Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
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

用户配置

此版本 rabbitmq 默认有一个 guest/guest 账号,但是只能 localhost 方式使用,因此还需要再创建一个远程用户供客户端或管理控制面板使用

# 添加用户
# rabbitmqctl add_user 用户名 密码
rabbitmqctl add_user admin adminpwd
 
# 设置用户角色,分配操作权限
# rabbitmqctl set_user_tags 用户名 角色
rabbitmqctl set_user_tags admin administrator
 
# 为用户添加资源权限(授予访问虚拟机根节点的所有权限)
# rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

rabbitmq 有 4 类角色:

  • administrator:可以登录控制台、查看所有信息、并对 rabbitmq 进行管理

  • monToring:监控者;登录控制台,查看所有信息

  • policymaker:策略制定者;登录控制台指定策略

  • managment:普通管理员;登录控制

创建完成后,访问服务器 ip:15672 进行登录,然后便可进入到后台

负载均衡

rabbitmq 集群中的 3 台机器是平行的,但客户端一般只需要连接其中的一台,为了更好的分摊压力,可以通过 负载均衡 软硬件对其进行压力分配。

软件的安装不再赘述,只罗列配置参考。

nginx+keepalived

机器分配

采用2台nginx负载均衡

  • 10.100.16.211, 5672/15672
    • vip: 10.100.16.210, 5672/15672

  • 10.100.16.212, 5672/15672
    • vip: 10.100.16.210, 5672/15672

nginx 配置

nginx 需支持 stream 模块,可以执行 nginx -V 查看是否有 --with-stream

nginx.conf 中 http 模块平级 新增 stream 模块

...省略
 
 
http {
    ...省略
}
 
 
stream {
    upstream rabbitmq_15672 {
        server 10.100.16.201:15672;
        server 10.100.16.202:15672;
        server 10.100.16.203:15672;
    }
    server {
        listen 15672;
        proxy_connect_timeout 5s;
        proxy_timeout 24h;
        proxy_pass rabbitmq_15672;
    }
 
    upstream rabbitmq_5672 {
        server 10.100.16.201:5672;
        server 10.100.16.202:5672;
        server 10.100.16.203:5672;
    }
    server {
        listen 5672;
        proxy_connect_timeout 5s;
        proxy_timeout 24h;
        proxy_pass rabbitmq_5672;
    }
}

keepalived 配置

211 机器配置

global_defs {
   router_id prod-internal-nginx-16-211
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens192
    virtual_router_id 210
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass admin@20240105$
    }
    virtual_ipaddress {
        10.100.16.210/32 dev ens192 label ens192:0
    }
}

212 机器配置

global_defs {
   router_id prod-internal-nginx-16-212
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 210
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass admin@20240105$
    }
    virtual_ipaddress {
        10.100.16.210/32 dev ens192 label ens192:0
    }
}

haproxy+keepalived

原理基本同 nginx, 使用 haproxy 代替 nginx 而已。

参考博文:(有空也可以实操记录一下)

https://www.cnblogs.com/caoweixiong/p/14411785.html

验证测试

使用 python 快速验证,安装 python3, pip3, pika

yum install python34 python34-pip
pip3.4 install pika
 
 
# 可以将 python34 设置为默认的 python
cd /usr/bin
mv python python.old
mv pip pip.old
ln -s python3.4 python
ln -s pip3.4 pip

编写 producer.py 和 consumer.py

producer.py

# coding: utf-8
import json
import pika
import datetime
 
# 生成消息
def get_message():
    for i in range(10): # 生成10条消息
        message=json.dumps({'id': "10000%s" % i, "amount": 100 * i,"name":"tony","createtime":str(datetime.datetime.now())})
        producter(message)
 
# 消息生产者
def producter(message):
    # 获取与 rabbitmq 服务的连接,虚拟队列需要指定参数 virtual_host,如果是默认的可以不填(默认为/),也可以自己创建一个
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.100.16.210', port=5672,credentials=pika.PlainCredentials('admin', 'quanshi')))
    # 创建一个 AMQP 信道(Channel)
    channel = connection.channel()
    # 声明消息队列 tester,消息将在这个队列传递,如不存在,则创建
    channel.queue_declare(queue='tester')
    # 向队列插入数值 routing_key 的队列名为 tester,body 就是放入的消息内容,exchange 指定消息在哪个队列传递,这里使用空字符串(默认的exchange)
    channel.basic_publish(exchange='', routing_key='tester', body=message)
    # 关闭连接
    connection.close()
 
if __name__=="__main__":
    get_message() #程序执行入口

执行 python producer.py 即可

consumer.py

# coding:utf-8
import pika
 
# 接收消息,直接输出
def write_file(message):
    #with open("msg.txt","a+") as f:
    #    f.write(message)
    print(message)
 
 
def consumer():# 消息消费者
    # 获取与 rabbitmq 服务的连接
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.100.16.210', port=5672,credentials=pika.PlainCredentials('admin', 'quanshi')))
    # 创建一个 AMQP 信道(Channel)
    channel = connection.channel()
    # 声明消息队列 tester,durable=False 表示不持久化
    channel.queue_declare(queue='tester', durable=False)
    # 定义一个回调函数来处理消息队列中的消息,这里是将消息写入文件,你也可以入库。
    def callback(ch, method, properties, body):
        ch.basic_ack(delivery_tag=method.delivery_tag) # 告诉生成者,消息处理完成
        write_file(body.decode())
    # 消费tester列表里的消息,收到就调用callback函数
    channel.basic_consume('tester', callback)
    # 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理
    channel.start_consuming()
 
if __name__=="__main__":
    consumer()

执行 python consumer.py 开始消费消息。

监控告警

监控告警。

目前先配置简单的进程监控和端口监控。

配置端口指标采集,监控 5672 即可。

配置进程采集,rabbitmq 使用 erlang 虚拟环境启动,进程名:beam.smp

卸载

如果不需要此软件,可以按照如下步骤清理。

# 停掉服务
systemctl disable rabbitmq-server
systemctl stop rabbitmq-server
# kill 掉残留的 erlang 进场
ps -ef |grep rabbit

# 删掉 rabbitmq
yum list|grep rabbitmq
yum -y remove rabbitmq-server.noarch
 
# 删掉 erlang
yum list | grep erlang
yum -y remove erlang.x86_64

# 删除相关文件
rm -rf /usr/lib64/erlang
rm -rf /var/lib/rabbitmq
rm -rf /usr/lib/rabbitmq
rm -rf /etc/rabbitmq/
rm -rf /var/log/rabbitmq

总结

今天带大家快速熟悉了一下 rabbitmq 的搭建,内容比较简单,但是比较实用,希望对大家有所帮助。

如果对你有所启发,记得鼓励支持,另外欢迎关注我的公&号:新质程序猿,获得更及时的更新,还有我准备的程序员必备大礼包哟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细的Vue新手向教程

一,前言 本篇文章的正文部分为渐近式介绍Vue基础中的OptionAPI和相关指令,在两大内容之外,本文结尾处会附上vue的特性。 ps:本文总字数过22000,足够详细,尽量新手向的同时也包含一些原理性知识,部分内容…

TILs 评分:TCGA 肿瘤浸润淋巴细胞病理切片深度学习评分!图片下载与可视化

生信碱移 病理切片的TILs评分 TCGA 数据库是最大的肿瘤组学公开数据库之一。尽管如此,更多的研究往往仅局限于关注 TCGA 中各类肿瘤样本的上游组学信息或基本病理特征,而忽略了对样本数字化 H&E 病理染色图像的进一步应用。 ▲ TCGA中肿瘤样本的病…

Centos系统中创建定时器完成定时任务

Centos系统中创建定时器完成定时任务 时间不一定能证明很多东西,但是一定能看透很多东西,坚信自己的选择,不动摇,使劲跑,明天会更好。 在 CentOS 上,可以使用 systemd 定时器来创建一个每十秒执行一次的任务…

拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值

挖掘数据背后的规律是数学建模的重要任务,拟合与插值是常用的分析方法 掌握拟合与插值的基本概念和方法熟悉Matlab相关程序实现能够从数据中挖掘数学规律 拟合问题的基本提法 拟合问题的概念 已知一组数据(以二维为例),即平面上n个点 ( x i , y i ) …

Blazor开发框架Known-V2.0.8

V2.0.8 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行。目前已有部分客户在使用,最近客户的项目和产品,有的在Docker中运行,有的在重新升级改造…

2024.8.18周报

摘要 本周利用阳朔水站的数据对1D浅水方程进行了求解,通过将1D浅水方程的物理约束纳入到神经网络,将时空坐标x,t作为输入到神经网络中,得到预测解水深和流量的数据,然后利用真实的数据进行比较,计算损失。…

【鸿蒙学习】HarmonyOS应用开发者基础 - 白皮书V3.0的关键知识点

本文内容由智谱清言的长文章解读生成。 智谱AI(https://zhipuai.cn/) 白皮书V3.0这份文档详细介绍了鸿蒙生态应用开发的各个方面,涵盖了从核心概念到开发流程、测试和运维分析的各个环节。由于这本书有128页,读完时间较长&#xf…

Java数组02:数组内存分析、三种初始化方式及特点

本节内容视频链接:Java数组03:三种初始化及内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p53&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.数组内存分析 堆:存放new的对象和数组;可以被所有线…

【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)

目录: 目录: 系统介绍: 系统开发技术 Python语言 Django框架简介 MySQL数据库技术 B/S架构 系统设计 系统总体设计 系统详细界面实现: 系统测试 测试目的 测试用例 本章小结 参考代码: 为什么选择我&…

【C语言可变参数函数的使用与原理分析】

文章目录 1 前言2 实例2.1实例程序2.2程序执行结果2.3 程序分析 3 补充4 总结 1 前言 在编程过程中,有时会遇到需要定义参数数量不固定的函数的情况。 C语言提供了一种灵活的解决方案:变参函数。这种函数能够根据实际调用时的需求,接受任意…

yum 源更新

本人使用Centos7系统; 系统自带的Yum源地址,下载速度又慢,而且有些包还是没有的,于是考虑将yum进行更换,可以更换为国内其他厂商的yum源,比如:阿里、腾讯、163、清华的,尽可能汇总&…

如何有效利用渗压计来避免溃坝风险

有效利用渗压计来避免溃坝风险是一个综合性的过程,涉及渗压计的安装、监测、数据分析以及应急响应等多个方面。以下是一些关键步骤和建议: 选择合适的渗压计: 根据具体工程需求和环境条件,选择合适的渗压计类型确保渗压计的质量可…

嘀嗒出行拼车系统源码

嘀嗒出行APP的开发需求与功能架构主要围绕提升用户出行体验、提高匹配效率、保障行程安全以及满足多样化的出行需求来构建。以下是对嘀嗒出行APP开发需求与功能架构的详细解析 一、开发需求 市场需求:随着出行市场的竞争加剧,嘀嗒出行需要不断提高自身服…

Codigger 视频会议(Meeting):医疗行业的创新协作利器

在当今数字化快速发展的时代,医疗行业也在不断拥抱信息技术带来的变革。远程医疗协作作为提升医疗服务效率和质量的重要手段,正日益受到关注。而 Codigger 视频会议(Meeting)则成为了医疗领域中一颗璀璨的明星,为医疗行…

Cacti SQL注入漏洞分析(CVE-2023-51448)

Cacti 为全球用户提供强大且可扩展的运营监控和故障管理框架。它还是一个完整的网络绘图解决方案,旨在利用RRDTool的数据存储和绘图功能。Cacti 包括一个完全分布式和容错的数据收集框架、用于设备、图表和树的高级基于模板的自动化功能、多种数据采集方法、通过插件…

自然语言处理系列三十三》 语义相似度》同义词词林》算法原理

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列三十三同义词词林算法原理代码实战 总结 自然语…

软件测试面试题整理(一)之自动化测试题大合集

1 什么是POM,为什么要使用它? POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为…

甘肃旅游服务平台代码--论文pf

TOC springboot422甘肃旅游服务平台代码--论文pf 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化&#xff0…

基于java的养老服务系统/基于web的养老院管理系统

摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,养老服务当然也不能排除在外,从健康体检、体检预约的统计和分析,在过程中会产生大量的、各种各样的…

WLAN射频调优

射频调优的基本原则 信道优化的基本原则 2.4G射频在非高密部署场景中推荐采用1、6、11这种3个不重叠的信道进行规划,同理也可以选用2、7、12或3、8、13的组合方式;在高密部署场景中则推荐采用1、5、9、13共4个信道组合进行规划。5G射频推荐采用36、40、…