mycat介绍与操作步骤

文章目录

    • 1.分库分表
    • 2.mycat 入门
      • 2.1 概述
      • 2.2 案例:水平分表
        • 1)准备工作
        • 2)配置
        • 3)启动并测试
    • 3.mycat 配置详解
      • 3.1 schema.xml
      • 3.2 rule.xml
      • 3.3 server.xml
    • 4.mycat 分片:垂直拆分
      • 1)准备工作
      • 2)配置
      • 3)启动并测试
      • 4)全局表
    • 5.mycat 分片:水平拆分
    • 6.mycat 管理和监控
      • 6.1 9066管理端口
      • 6.2 mycat-web
    • 7.mycat 读写分离
      • 7.1 一主一从
      • 7.2 双主双从

1.分库分表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

分库分表带来的问题

在这里插入图片描述

2.mycat 入门

2.1 概述

官网:http://www.mycat.org.cn/

在这里插入图片描述

在这里插入图片描述

注:先安装JDK,再解压mycat即可

在这里插入图片描述

在这里插入图片描述

注:lib中有mysql的jar包,需要根据mysql的版本进行更换

在这里插入图片描述

注:mycat在逻辑上进行分片处理,并不储存真正的数据

2.2 案例:水平分表

在这里插入图片描述

在这里插入图片描述

1)准备工作

准备三台mysql服务器,并创建同名的数据库,只建库,不要建表

在这里插入图片描述

在其中一台服务器上安装mycat(也可以再准备一台虚拟机进行操作)

  • 安装jdk
  • 配置环境变量
  • 解压mycat
2)配置

编辑以下两个配置文件

在这里插入图片描述

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100"><table name="student" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><dataNode name="dn1" dataHost="dataHost1" database="testdb" /><dataNode name="dn2" dataHost="dataHost2" database="testdb" /><dataNode name="dn3" dataHost="dataHost3" database="testdb" /><dataHost name="dataHost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.9.3:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456"></writeHost></dataHost><dataHost name="dataHost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.9.8:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456"></writeHost></dataHost><dataHost name="dataHost3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.9.9:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456"></writeHost></dataHost>
</mycat:schema>

在这里插入图片描述

3)启动并测试

配置完毕,启动mycat。启动后,可查看日志

在这里插入图片描述

在这里插入图片描述

连接mycat与连接mysql基本一样

在这里插入图片描述

在这里插入图片描述

# 建表
create table STUDENT (id bigint(20) not NULL ,name varchar(50) not NULL,sex char(1) not NULL,primary key (id)
) engine=innodb default charset=utf8;# 此时分别查看三个真实数据库,会发现已创建好了相同的表结构

插入数据测试

# 插入三条数据
insert into STUDENT (id,name,sex) values(1,'tom','M');
insert into STUDENT (id,name,sex) values(2,'marry','F');
insert into STUDENT (id,name,sex) values(3,'jack','M');

在这里插入图片描述

插入三条数据后分别查看三个真实数据库,发现可能只在其中一个库中插入了数据
这是由 schema.xml 中配置的 rule=“auto-sharding-long” 分片规则决定的
这个分片规则定义在 rule.xml 中,追踪到 autopartition-long.txt 文件

在这里插入图片描述

插入新数据id为 5000001,则会插入到对应的物理数据库中,如果超过1500M后,则会报异常

在这里插入图片描述

3.mycat 配置详解

在这里插入图片描述

3.1 schema.xml

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 rule.xml

在这里插入图片描述

3.3 server.xml

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.mycat 分片:垂直拆分

在这里插入图片描述

1)准备工作

在上例的基础上进行配置,在三台mysql服务器上创建同名的数据库 appdb,只建库,不要建表。

数据库表说明:

  • ad_promotion:首页轮播图广告位
  • app_info:app信息
  • app_category:app类别
  • app_version:app版本
  • data_dictionary:数据字典
  • backend_user:后台用户
  • dev_user:开发者用户

2)配置

分片说明

  • 数据节点1:
    • app_info :app信息
    • app_category :app类别
    • app_version :app版本
    • data_dictionary :数据字典
  • 数据节点2:
    • backend_user :后台用户
    • dev_user :开发者用户
  • 数据节点3:
    • ad_promotion :首页轮播图广告位

schema.xml

在这里插入图片描述

在这里插入图片描述

#APPDB表示库名
<schema name="APPDB" checkSQLschema="true" sqlMaxLimit="100">
<table name="app_info" dataNode="dn1" primaryKey='id'/>
<table name="app_category" dataNode="dn1" primaryKey='id'/>
<table name="app_version" dataNode="dn1" primaryKey='id'/><table name="data_dictionary" dataNode="dn1" primaryKey='id'/><table name="backend_user" dataNode="dn2" primaryKey='id'/>
<table name="dev_user" dataNode="dn2" primaryKey='id'/><table name="ad_promotion" dataNode="dn3" primaryKey='id'/>
</schema>
#appdb表示连接的数据库名
<dataNode name="dn1" dataHost="dataHost1" database="appdb" />
<dataNode name="dn2" dataHost="dataHost2" database="appdb" />
<dataNode name="dn3" dataHost="dataHost3" database="appdb" />

server.xml

在这里插入图片描述

<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">APPDB</property><!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --><!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user><user name="user"><property name="password">123456</property><property name="schemas">APPDB</property><property name="readOnly">true</property></user>

3)启动并测试

在mycat端,统一用脚本建表、导入数据

如果在虚拟机里执行app_table.sql需要把脚本上传到某个目录下

如:opt目录下

xxx表示脚本目录的地址 如:source /opt/app_table.sql

# 建表
mysql> source /xxx/app_table.sql
# 导入数据
mysql> source /xxx/app_data.sql

测试以下sql语句

# 查询数据字典表
SELECT * FROM DATA_DICTIONARY;# 连接查询,查询app信息
SELECT a.id,softwareName,APKName,valueName
FROM APP_INFO a
INNER JOIN DATA_DICTIONARY d
ON a.status = d.valueId
WHERE d.typeCode= 'APP_STATUS';# 连接查询,查询管理员信息,报错截图如下
SELECT u.id,userCode,u.creationDate,valueName
FROM BACKEND_USER u
INNER JOIN DATA_DICTIONARY d
ON u.userType = d.valueId
WHERE d.typeCode= 'USER_TYPE';

在这里插入图片描述

4)全局表

如果连接查询的表处于不同的分片,则会报错

比如数据字典表,其他表可能都会引用它,则应该把它设置为全局表,让它在每个分片上都存在

重新配置后,重启mycat,还需要把物理数据库中的表全部删除,重新执行建库脚本,再进行测试

在这里插入图片描述

编辑 schema.xml

在这里插入图片描述

<table name="data_dictionary" dataNode="dn1,dn2,dn3" primaryKey='id' type="global"/>

注意:

  • 修改 schema.xml 后,重启mycat
  • 删除每个分片上的数据表,重新执行建库脚本等
  • 对全局表进行更新等操作后,其他分片上的全局表也会进行同步

5.mycat 分片:水平拆分

在这里插入图片描述

在这里插入图片描述

在上一个案例的基础上完成

schema.xml ,mod-long:通过对id取模运算把数据均匀的分散到分片上

在这里插入图片描述

server.xml ,让 root 也可以管理此逻辑库

在这里插入图片描述

重启mycat,测试略

6.mycat 管理和监控

6.1 9066管理端口

在这里插入图片描述

6.2 mycat-web

在这里插入图片描述

在这里插入图片描述

zookeeper

下载地址:https://archive.apache.org/dist/zookeeper/

安装步骤:

# 解压
tar -xf zookeeper-3.4.6.tar.gz -C /usr/local/# 创建数据存放目录
mkdir /usr/local/zookeeper-3.4.6/data# 配置文件 
cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.6/conf/zoo.cfg# 修改配置文件
vim /usr/local/zookeeper-3.4.6/conf/zoo.cfg
# 第12 行
dataDir=/usr/local/zookeeper-3.4.6/data#启动
/usr/local/zookeeper-3.4.6/bin/zkServer.sh start
# 查看状态
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status

安装 mycat-eye

# 解压
tar -xf Mycat-web.tar.gz -C /usr/local/# 启动
cd /usr/local/mycat-web/
sh start.sh# 网页访问
http://192.168.9.3:8082/mycat/

在这里插入图片描述

启动 zookeeper、mycat-eye,访问网页

在这里插入图片描述

在这里插入图片描述

7.mycat 读写分离

7.1 一主一从

两台虚拟机,先配置好一主一从,再配置 mycat

  • 配置好一主一从后,在主库的DDL操作会同步到从库中
  • 在主库测试建库、建表、插入数据

mycat 配置说明

  • writeHost 节点、readHost 节点
  • balance 属性(一般设置为1或3,在一主一从配置中1和3都一样)
  • 读写分离的配置中不用配置逻辑表,默认会加载物理数据库中的所有表为逻辑表

在这里插入图片描述

在这里插入图片描述

配置 schema.xml

在这里插入图片描述

writeHost 和eadHost 节点中的 name 不要相同

在这里插入图片描述

server.xml

在这里插入图片描述

重启mycat,登录并测试

  • 连接 mycat,测试新增,主库和从库中都会有新增的数据
  • 用navicat在从库中修改一条数据,在mycat 中测试查询,以验证读写是否分离
  • 如果 schema.xml 中的负载均衡策略为2,则会随机查询到两个节点的数据
  • 如果主库宕机了,查询操作正常,新增、修改、删除都会失败(一主一从并没有高可用)

7.2 双主双从

介绍

在这里插入图片描述

准备和规划

在这里插入图片描述

主机master1

  • server-id:唯一值
  • binlog-do-db:指定一个需要同步的库做测试即可,如 db01
  • log-slave-updates

在这里插入图片描述

vim /etc/my.cnfserver-id=1
log-bin=mysql-bin
#选择要同步的数据库名  只能在这个数据库进行同步
#不写就是全部数据库
binlog-do-db=mytest
log-slave-updates
#重启数据库
systemctl restart mysqld

主机master2

  • 和 master1 对比,也就是 server-id 不同
vim /etc/my.cnfserver-id=3
log-bin=mysql-bin
#选择要同步的数据库名  只能在这个数据库进行同步
#不写就是全部数据库
binlog-do-db=mytest
log-slave-updates
#重启数据库
systemctl restart mysqld

在这里插入图片描述

分别在两台主库上都创建同名的用户,用于主从复制,查看主库状态(记录 binlog文件和位置)

在这里插入图片描述

#登录mysql
mysql -uroot -p
# 创建用户,并授予主从复制权限
mysql> create user 'my'@'%' identified with mysql_native_password by 'Bdqn_8888';mysql> grant replication slave on *.* to 'my'@'%';mysql> SHOW MASTER STATUS;

从机slave1

  • 只需要配置 server-id

在这里插入图片描述

vim /etc/my.cnf#从机id
server-id=2#重启数据库
systemctl restart mysqld

从机slave2

  • 和 slave1对比,也就是server-id不同

在这里插入图片描述

vim /etc/my.cnf#从机id
server-id=4#重启数据库
systemctl restart mysqld

分别在两台从库上设置其关联的主库

在这里插入图片描述

#登录从库mysql
mysql -uroot -p#分别在两台从库上设置其关联的主库
mysql> CHANGE MASTER TO
master_host='192.168.9.6',
master_user='my',
master_password='Bdqn_8888',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=591;mysql> START SLAVE;mysql> SHOW SLAVE STATUS\G;

分别在两台主库上配置互相复制

在这里插入图片描述

两台主机进行复制    1号机连接3号机    3号机连接1号机
mysql> CHANGE MASTER TO
master_host='192.168.9.4',
master_user='my',
master_password='Bdqn_8888',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=591;mysql> START SLAVE;mysql> SHOW SLAVE STATUS\G;

测试(在navicat中测试即可)

在这里插入图片描述

  • 在 master1 执行建库、建表语句,会自动同步到其他三台服务器

  • 在 master2 执行新增语句,会自动同步到其他三台服务器


# 建库建表添加数据
mysql> create database mytest;mysql> use mytest;mysql> create table person(id int(10) primary key not null auto_increment,name varchar(50) not null,gender char(1) not null
)engine=innodb default charset=utf8mb4;mysql> insert into person values (null,'tom','m'),(null,'jack','m'),(null,'marry','f');

此时双主双从搭建完毕,下面在 mycat 进行读写分离的配置

#先安装JDK在解压mycat  
tar -xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local

schema.xml

#schema.xml配置文件位置
cd /usr/local/mycat/conf
#备份
cp schema.xml schema.xml.bakvim schema.xml

在这里插入图片描述

在这里插入图片描述

 <!--mytest --><schema name="MYTEST" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1" ></schema><dataNode name="dn1" dataHost="dataHost1" database="mytest" /><dataHost name="dataHost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100" ><heartbeat>select user()</heartbeat><writeHost host="master1" url="jdbc:mysql://192.168.9.3:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Bdqn_8888"><readHost host="slave1" url="jdbc:mysql://192.168.9.4:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Bdqn_8888"></readHost></writeHost><writeHost host="master2" url="jdbc:mysql://192.168.9.5:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Bdqn_8888"><readHost host="slave2" url="jdbc:mysql://192.168.9.7:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Bdqn_8888"></readHost></writeHost></dataHost>

server.xml

vim server.xml

在这里插入图片描述

<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">MYTEST</property><!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --><!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user><user name="user"><property name="password">123456</property><property name="schemas">MYTEST</property><property name="readOnly">true</property></user>

开启mycat

/usr/local/mycat/bin/mycat start

日记检测

tail -f /usr/local/mycat/logs/wrapper.log

重启mycat服务测试

测试1:

  • 修改 slave1 的数据、修改 slave2 的数据,在 mycat 中 select 看看效果,会发现显示的数据来源于master2、slave1、slave2。

  • 在 mycat 中 insert ,会发现都进行了数据同步。

测试2:

  • 停止 master1 的 mysql 服务,在 mycat 中测试查询,会发现显示的数据来源于slave2。

  • 在 mycat 中测试 insert,看能否执行写入,会发现数据写入了 master2、slave2。

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

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

相关文章

OSPF - 特殊报文与ospf的机制

&#x1f460;1 携带FA地址的5类LSA 除去7类转5类的LSA会携带FA地址&#xff0c;还有一种情况会有FA地址 FA地址:forwarding address 转发地址&#xff0c;解决次优路径&#xff0c;避免环路5类LSA FA地址不为0&#xff0c;则直接通过FA地址去往目标网段 FA地址为0&#xff0c…

django基于Python的电影推荐系统

Django 基于 Python 的电影推荐系统 一、系统概述 Django 基于 Python 的电影推荐系统是一款利用 Django 框架开发的智能化应用程序&#xff0c;旨在为电影爱好者提供个性化的电影推荐服务。该系统通过收集和分析用户的观影历史、评分数据、电影的属性信息&#xff08;如类型…

C语言基本知识复习浓缩版:控制语句--循环

C语言基本知识复习浓缩版&#xff1a;控制语句--循环 三种基本循环结构 while do-while循环 for循环 while while(条件) { //循环 } 当条件为真时&#xff0c;循环会一直执行 当条件为假时&#xff0c;循环停止 注意点&#xff1a;如果初始条件为假&#xff0c;循环体一次…

初识verilog HDL

为什么选择用Verilog HDL开发FPGA&#xff1f;&#xff1f;&#xff1f; 硬件描述语言&#xff08;Hardware Descriptipon Lagnuage&#xff0c;HDL&#xff09;通过硬件的方式来产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能&#xff0c;其设计方法与软件…

硬件设计-齐纳管

目录 摘要 详情 齐纳管的工作电流、 摘要 齐纳管&#xff08;Zener Diode&#xff09;是一种特殊的二极管&#xff0c;它能够在特定的反向电压下保持电流稳定。正常情况下&#xff0c;二极管只允许正向电流通过&#xff0c;而阻止反向电流流过。而齐纳管在一定的反向电压下可…

【算法C++】数字分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字&#xff0c;这些数字被分成多个小组&#xff0c;并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…

如何使用Yarn Workspaces实现Monorepo模式在一个仓库中管理多个项目

Yarn Workspaces是Yarn提供的一种依赖管理机制&#xff0c;它支持在单个代码仓库中管理多个包的依赖。这种机制非常适合需要多个相互依赖的包的项目&#xff0c;能够减少重复依赖&#xff0c;加快依赖安装速度&#xff0c;并简化依赖管理。下面将详细介绍如何使用Yarn Workspac…

附加共享数据库( ATTACH DATABASE)的使用场景

附加共享数据库&#xff08;使用 ATTACH DATABASE&#xff09;的功能非常实用&#xff0c;通常会在以下几种场景下需要用到&#xff1a; 1. 跨数据库查询和分析 场景&#xff1a; 你的公司有两个独立的数据库&#xff1a; 一个存储了学生信息 (school.db)一个存储了员工信息 …

阿里云ios镜像源

阿里云镜像源&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

用vscode+ollama自定义Cursor AI编辑的效果

在vscode上搜索Continue 添加大语言模型 选择对应的本地模型版本 效果

使用宝塔面板,安装 Nginx、MySQL 和 Node.js

使用ssh远程链接服务器 在完成使用ssh远程链接服务器后 可使用宝塔面板&#xff0c;安装 Nginx、MySQL 和 Node.js 宝塔网站 一、远程链接服务器 二、根据服务器系统安装宝塔 wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash inst…

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成&#xff0c;.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …

SQL进阶实战技巧:统计用户的累计消费金额及VIP等级?

目录 0 问题描述 1 数据准备 2 代码实现 3 问题拓展 问题延伸:查询首次下单后第二天连续下单的用户比率

鸿蒙面试 2025-01-11

ArkTs 和TS的关系&#xff1f; ArkTS&#xff08;方舟开发语言&#xff09;与 TypeScript&#xff08;TS&#xff09;存在紧密联系&#xff0c;同时也有显著区别&#xff1a; 联系 语法基础&#xff1a;ArkTS 在语法层面大量借鉴了 TypeScript &#xff0c;TypeScript 里诸如…

SpringCloud项目搭建快速入门

SpringCloud项目搭建 注意&#xff1a;本项目采用JDK17&#xff0c;且已上传至Gitee&#xff0c;可自行下载 父工程创建方式一 Step1&#xff1a; 创建一个Maven聚合工程ScDemo 创建完成后删除除pom.xml文件外的所有文件及目录 Step2&#xff1a; 设置Mven为本地Maven 博主已进…

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中&#xff0c;Vue.js 和 React.js 作为两大主流框架&#xff0c;各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发&#xff0c;Vue Devtools 和 React 开发者工具应运而生&#xff0c;成为这两个框架不可或缺的辅助工具。本…

芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?

英伟达的GPU之所以能在AI基础设施领域扮演重要角色&#xff0c;主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素&#xff1a; 1. 并行计算能力 GPU&#xff08;图形处理单元&#xff09;本质上是为处理大量并行计算任务而设计的。与CPU相比&a…

新手入门 React .tsx 项目:从零到实战

&#x1f680; 新手入门 React .tsx 项目&#xff1a;从零到实战 &#x1f4bb;✨ 如果你是 React 新手&#xff0c;刚接触 .tsx 文件&#xff0c;不要担心&#xff01;跟着这份指南&#xff0c;一步一步来&#xff0c;你很快就能上手了&#xff01;&#x1f447; &#x1f4d…

RabbitMQ 进阶

文章目录 一、发送者的可靠性1.1 生产者重试机制&#xff1a;1.2 生产者确认机制&#xff1a;1.2.1 开启生产者确认&#xff1a;1.2.2 定义 ReturnCallback&#xff1a;1.2.3 定义 ConfirmCallback&#xff1a; 二、MQ 的可靠性2.1 数据持久化&#xff1a;2.1.1 交换机持久化&a…