RabbitMQ高级-应用问题、集群搭建

1.消息补偿

消息可靠性保障:——消息补偿机制

需求:100%确保消息发送成功

2.幂等性保障

幂等性指一次和多次请求某一资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与第一次执行的影响相同

在MQ中是指,消费多条相同的消息,得到与消费该消息一次相同的结果

消息幂等性保障——乐观锁机制

3.集群搭建-镜像队列 

集群方案原理

RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的

此处展示单机多实例部署,多个节点之间用端口来区分,在使用真正的集群时用ip来区分即可

单机多实例部署

启动单实例RabbitMQ

查看RabbitMQ运行状态,确保RabbitMQ运行正常

查看正常无误后,停止以上单实例RabbitMQ

systemctl stop rabbitmq-server

启动第1个节点实例(前台启动)

端口:5673,web管理插件端默认端口:15672

注: 这里将默认端口5672留给HA使用

RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server start

(前台启动方式)

启动第2个节点实例

 RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server start

附:结束集群节点命令

rabbitmqctl -n rabbit1 stop

rabbitmqctl -n rabbit2 stop

重置rabbit1实例为主节点

在新的会话窗口,依次执行命令(停止—>重置—>启动)

rabbitmqctl -n rabbit1 stop_app

rabbitmqctl -n rabbit1 reset

rabbitmqctl -n rabbit1 start_app

重置rabbit2实例为从节点

在新的会话窗口,依次执行命令(停止—>重置—>设为从节点—>启动)

将rabbit2加入到rabbit1节点,作为rabbit1的从节点

命令格式:
rabbitmqctl -n rabbit2 join_cluster rabbit1@'###'

注: 引号''内的“#”换成真实环境的主机名,如master等

rabbitmqctl -n rabbit2 join_cluster rabbit1@'master'

rabbitmqctl -n rabbit2 start_app

查看集群状态命令 

rabbitmqctl cluster_status -n rabbit1

说明: 此时在rabbit1节点创建的队列和队列内的消息在rabbit2节点也能看到。但是当rabbit1节点宕机时,rabbit2也将无法看到rabbit1之前的队列和消息(造成消息丢失),原因是配置到此步骤,仍然没能实现队列和消息等的同步 

附:集群管理相关命令

rabbitmqctl join_cluster {cluster_node} [–ram]
将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ应用并重置节点

rabbitmqctl cluster_status
显示集群的状态

rabbitmqctl change_cluster_node_type {disc|ram}
修改集群节点的类型。在这个命令执行前需要停止RabbitMQ应用

rabbitmqctl forget_cluster_node [–offline]
将节点从集群中删除,允许离线执行

rabbitmqctl update_cluster_nodes {clusternode}
在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息。这个和join_cluster不同,它不加入集群。考虑这样一种情况,节点A和节点B都在集群中,当节点A离线了,节点C又和节点B组成了一个集群,然后节点B又离开了集群,当A醒来的时候,它会尝试联系节点B,但是这样会失败,因为节点B已经不在集群中了

rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列queue同步镜像的操作

rabbitmqctl set_cluster_name {name}
设置集群名称。集群名称在客户端连接时会通报给客户端。Federation和Shovel插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置

RabbitMQ镜像集群配置

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式一定程度上解决了项目节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列(即集群策略Policy)

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做

设置的镜像队列(即添加集群策略Policy:同步交换机和队列)

可以通过RabbitMQ的web管理端设置

参数说明:

Name:策略名称

Pattern:匹配的规则,如果是匹配所有的队列,是^.

Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档

 通过dos命令设置

rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'

此时在rabbit1节点rabbit2节点已实现队列和交换机同步

4.集群搭建-安装HAProxy,进行负载均衡 

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数

安装依赖包

下载源码包 :OpenPKG Project: Download

解压到/usr/local目录

tar -xvf haproxy-2.7.5.tar.gz -C /usr/local

进入源码目录、编译、安装

cd /usr/local/haproxy-2.7.5

make TARGET=linux31 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

添加组、用户,并赋权

groupadd -r -g 149 haproxy

useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy

配置haproxy(创建目录、创建配置文件haproxy.cfg)

mkdir /etc/haproxy

vim /etc/haproxy/haproxy.cfg

haproxy.cfg中写入以下内容 

注: 在配置文件/etc/haproxy/haproxy.cfg中的listen stats下的bind属性中的IP地址需换成服务器IP,不能改为127.0.0.1,否则HAProxy的web管理页面访问不了

#logging options
global
        log 127.0.0.1 local0 info
        maxconn 5120
        chroot /usr/local/haproxy
        uid 99
        gid 99
        daemon
        quiet
        nbproc 20
        pidfile /var/run/haproxy.pid

defaults
        log global

        mode tcp

        option tcplog
        option dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout 5s
   
     clitimeout 60s

     srvtimeout 15s
#front-end IP for consumers and producters

listen rabbitmq_cluster
        bind 0.0.0.0:5672

        mode tcp
        #balance url_param userid
        #balance url_param session_id check_post 64
        #balance hdr(User-Agent)
        #balance hdr(host)
        #balance hdr(Host) use_domain_only
        #balance rdp-cookie
        #balance leastconn
        #balance source //ip

        balance roundrobin

        server node1 127.0.0.1:5673 check inter 5000 rise 2 fall 2
        server node2 127.0.0.1:5674 check inter 5000 rise 2 fall 2

listen stats
        bind 192.168.235.129:8100
        mode http
        option httplog
        stats enable
        stats uri /rabbitmq-stats
        stats refresh 5s

启动HAproxy负载,并查看haproxy进程 

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

ps -ef | grep haproxy

其他命令

启动haproxy
# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
重启haproxy
# /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/haproxy.pid` 
停止haproxy
# killall haproxy

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI编程005/ 逆向生成mysql的建表语句

1/ 通过insert into 语句生成建表语句 有些时候我们能获取到表的insert语句,但是没有表结构。我们可以借助AI工具,让其逆向生成mysql的建表语句。 提示词如下: 根据下面的SQL语句,逆向生存mysql的建表语句,每个字段…

Redis配置与优化

目录 引言 一、关系型数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库的区别 1.数据存储方式不同 2.扩展方式不同 3.对事物性的支持不同 4、非关系型数据库产生背景 二、Redis简介 1、Redis优点 2、Redis为什么这麽快&…

企业员工岗前培训管理系统的设计与实现(论文+源码)_kaic

摘 要 有效的处理想要的相关信息和如何传播有效的信息,一直是人类不断探索的动力。人类文明火种的传承都是通过了多种媒介作为载体,也是随着社会生产力的发展不断的更新。随着互联网的到来,信息传播与管理都上升了一个新的台阶,并…

基于单片机的全自动洗衣机系统仿真设计

**单片机设计介绍,基于单片机的全自动洗衣机系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的全自动洗衣机系统仿真设计概要是关于利用单片机技术实现全自动洗衣机控制功能的系统设计概述。以…

【5】JavaScript - 控制语句 循环[ for/while ]

控制语句 while/do...while 语句while 语句:do...while 语句:两者的区别无限循环 for 语句普通的 for 循环for...in 循环for...of 循环 循环过程:跳出/跳过跳出跳过 循环嵌套扩展延申:做一次杠精 当前 控制语句 章节主要介绍 循环…

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

【教学类-09-09】20240406细线迷宫图05(正方形)30格+动物+箭头(15CM横版一页-1份横版)

作品展示: 背景需求: 增加迷宫图的吸引力,起点的地方放一个小动物。 素材准备: 图片来自midjounery文生图(四图),但同种动物只留1个(如4个老鼠只保留一只老鼠)&#xff…

YOLOv8 UI界面设计+热力图显示

进入可视化设计界面,设计UI pyside6-designer 设计好UI保存,然后通过以下命令将ui文件保存为py pyside6-uic myui.ui > myui.py 通过以下命令将资源文件qrc保存为py pyside6-rcc my_rc.qrc > my_rc.py 写主窗口函数实现功能... 项目基于yol…

React - 连连看小游戏

简介 小时候经常玩连连看小游戏。在游戏中,当找到2个相同的元素就可以消除元素。 本文会借助react实现连连看小游戏。 实现效果 实现难点 1.item 生成 1. 每一个图片都是一个item,items数组的大小为size*size。 item对象包括grid布局的位置,…

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略! AR将成为人类和机器之间的新接口! AR将成为人类的关键技术之一! 请将此文转发给您的老板! --- 本文作者:Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的,但大…

【ORB-SLAM3】Ubuntu20.04 使用 RealSense D435i 运行 ORB-SLAM3 时遇到的一些 Bug

【ORB-SLAM3】使用 RealSense D435i 跑 ORB-SLAM3 时遇到的一些 Bug 1 hwmon command 0x80( 5 0 0 0 ) failed (response -7 HW not ready)2 No rule to make target /opt/ros/noetic/lib/x86_64-linux-gnu/librealsense2.so, needed by ../lib/libORB_SLAM3.so 1 hwmon comman…

Tomcat调优总结

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例,讲解参数。 同时也得认识到一点,tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此可以将…

intellij idea 使用git ,快速合并冲突

可以选择左边的远程分支上的代码,也可以选择右边的代码,而中间是合并的结果。 一个快速合并冲突的小技巧: 如果冲突比较多,想要快速合并冲突。也可以直接点击上图中 Apply non-conflicting changes 旁边的 All 。 这样 Idea 就会…

构建未来交通:香橙派OPI Airpro上的智能交通监管系统

引言: 随着城市化进程的加速,交通管理变得越来越复杂。 传统的交通监管系统往往无法有效应对日益增长的车辆数量和复杂的交通状况。因此,我们需要一种更加智能和自适应的解决方案来提高交通效率并减少事故发生率。 香橙派OPI Airpro以其强大的…

什么是redis缓存的雪崩、穿透以及击穿

缓存雪崩 举个例子,例如在双十一中,一点进去。访问量大,所以它很多数据是放在redis区缓存起来,对应redis的100个key。然后假设设置缓存失效时间是三小时。当双十一期间,购物超过这个三小时之后。这个首页的redis缓存会…

LeetCode十一题:容纳最多水的容器【11/1000 python】

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

信息系统项目管理师——第18章项目绩效域管理(一)

本章节内容属于第四版新增知识,为PMBOK第七版专有,选择、案例、论文都会考,属于比较重要的章节。 选择题,稳定考3分左右,新教材基本考课本原话,需要多读课本,多刷题。 案例题,考的概…

SpringBoot快速入门笔记(3)

文章目录 一、MybatisPlus1、ORM2、添加依赖3、全局配置4、Navicat5、UserController6、CRUD操作7、BaseMapper8、两个注解 二、多表查询1、模拟用户订单2、通过用户查相关订单3、UserMapperNew4、查询订单和所属用户5、OrderMapper6、OrderController 三、条件查询四、分页查询…

C++之类

目录 一:面向过程和面向对象的初步认识 二:类的引入 三:类的定义 3.1类的两种定义方式: 3.2成员变量命名的建议 四:类的访问限定符及封装 4.1类的访问限定符 4.2封装 一:面向过程和面向对象的初步认…

【学习笔记】java项目—苍穹外卖day09

文章目录 用户端历史订单模块1. 查询历史订单1.1 需求分析和设计1.2 代码实现1.2.1 user/OrderController1.2.2 OrderService1.2.3 OrderServiceImpl1.2.4 OrderMapper1.2.5 OrderMapper.xml1.2.6 OrderDetailMapper 1.3 功能测试 2. 查询订单详情2.1 需求分析和设计2.2 代码实…