当前位置: 首页 > news >正文

MySQL MMM高可用架构

  • MySQL MMM高可用架构
    • 一、MMM概述
      • 1、MMM简介
      • 2、MMM高可用架构
      • 3、MMM故障切换流程
    • 二、MMM高可用双主双从架构部署
      • 1、配置主主复制(master),主从复制(slave)
        • 1)修改 Master1的MySQL配置文件
        • 2)把配置文件复制到其它 3 台数据库服务器上并启动服务器
        • 3)配置主主复制,两台主服务器相互复制
        • 4)配置主从复制,在两台从服务器上做
        • 5)测试主主、主从 同步情况
      • 2、安装配置 MySQL-MMM
        • 1)在所有服务器上安装 MySQL-MMM
        • 2)在 Master1上对 MySQL-MMM 进行配置
        • 3)把配置文件复制到其它 4 台主机
        • 4)修改所有数据库服务器的代理配置文件 mmm_agent.conf
        • 5) 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf
        • 6)在所有数据库上为 mmm_agent(代理进程)和mmm_moniter(监控进程)授权
        • 7)在所有数据库服务器上启动 mysql-mmm-agent
        • 8)在 monitor 服务器上启动 mysql-mmm-monitor
        • 9)在 monitor 服务器上测试群集
      • 3、 故障测试及恢复
        • 1)模拟Master宕机以及恢复
        • 2)模拟从服务器宕机以及恢复
        • 3)客户端测试

MySQL MMM高可用架构

一、MMM概述

1、MMM简介

MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)
是一套支持双主故障切换和双主日常管理的脚本程序。

MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。

由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。

MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。

2、MMM高可用架构

关于 MMM 高可用架构的说明如下:
●mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控主机上运行。
●mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
●mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。
●mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 MySQL 之上,当某一台 MySQL 宕机时,监管会将 VIP 迁移至其他 MySQL。

在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。

3、MMM故障切换流程

Monitor 检测到 Master1 连接失败

Monitor 发送 set_offline 指令到 Master1 的 Agent

Master1 Agent 如果存活,下线写 VIP,尝试把 Master1 设置为 read_only=1

Moniotr 发送 set_online 指令到 Master2

Master2 Agent 接收到指令,执行 select master_pos_wait() 等待同步完毕

Master2 Agent 上线写 VIP,把 Master2 节点设为 read_only=0

Monitor 发送更改同步对象的指令到各个 Slave 节点的 Agent

各个 Slave 节点向新 Master 同步数据

二、MMM高可用双主双从架构部署

在这里插入图片描述

节点服务器所需服务及组件IP地址
Master1(db1)mysql5.7、mysql-mmm192.168.210.101
Master2(db2)mysql5.7、mysql-mmm192.168.210.102
Slave1(db3)mysql5.7、mysql-mmm192.168.210.103
Slave2(db4)mysql5.7、mysql-mmm192.168.210.106
monitor(db5)mysql-mmm192.168.210.104
#所有服务器
#关闭防火墙
systemctl stop firewalld
setenforce 0

1、配置主主复制(master),主从复制(slave)

1)修改 Master1的MySQL配置文件
vim /etc/my.cnf
......
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1                                               
#每台 Mysql 主机的 server-id 不能相同
log-error=/usr/local/mysql/data/mysql_error.log             
#错误日志
general_log=ON                                              
#通用查询日志
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON                                           
#慢查询日志
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema        
#不需要同步的库名
log_bin=mysql_bin                                
#开启二进制日志用于主从数据复制
log_slave_updates=true                           
#允许slave从master复制数据时可以写入到自己的二进制日志
sync_binlog=1                            
#"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去    
innodb_flush_log_at_trx_commit=1         
#"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去
auto_increment_increment=2              
#自增字段一次递增多少
auto_increment_offset=1                 
#自增字段的起始值

在这里插入图片描述

2)把配置文件复制到其它 3 台数据库服务器上并启动服务器

注意:配置文件中的 server_id 要修改

scp /etc/my.cnf root@192.168.210.102:/etc/
scp /etc/my.cnf root@192.168.210.103:/etc/
scp /etc/my.cnf root@192.168.210.106:/etc/systemctl restart mysqld

在这里插入图片描述

#修改Master2 Slave1 Slave2的Mysql配置文件
#修改server_id 每个服务器不一致
3)配置主主复制,两台主服务器相互复制
#在两台主服务器上都执行授予从的权限
#从服务器上不需要执行
grant replication slave on *.* to 'replication'@'192.168.210.%' identified by '123456';#在两台主服务器上查看,记录日志文件名称和同步点
show master status;

在这里插入图片描述

#在Master1上配置同步
change master to master_host='192.168.210.102',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G

在这里插入图片描述

#在Master2上配置同步
change master to master_host='192.168.210.101',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G

在这里插入图片描述

4)配置主从复制,在两台从服务器上做
#同一时间只能有一个主服务器工作
change master to master_host='192.168.210.101  ',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G

在这里插入图片描述
在这里插入图片描述

5)测试主主、主从 同步情况
create database db_test;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、安装配置 MySQL-MMM

1)在所有服务器上安装 MySQL-MMM
#获取软件包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

在这里插入图片描述

#安装依赖和软件
yum -y install epel-release
yum -y install mysql-mmm*

在这里插入图片描述

2)在 Master1上对 MySQL-MMM 进行配置
cd /etc/mysql-mmm/
vim mmm_common.conf
……
<host default>cluster_interface       ens33……replication_user        replicationreplication_password    123456agent_user              mmm_agentagent_password          123456<host db1>ip      192.168.210.101mode    masterpeer    db2
</host><host db2>ip      192.168.210.102mode    masterpeer    db1
</host><host db3>ip      192.168.210.103mode    slave
</host><host db4>ip      192.168.210.106mode    slave
</host><role writer>hosts   db1, db2ips     192.168.210.188mode    exclusive           #只有一个 host 可以进行写操作模式
</role><role reader>hosts   db3, db4ips     192.168.210.198, 192.168.210.199mode    balanced            #多个 slave 主机可以进行读操作模式
</role>

在这里插入图片描述

3)把配置文件复制到其它 4 台主机

所有主机该配置文件内容都是一样的。

scp mmm_common.conf root@192.168.210.102:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.103:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.106:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.104:/etc/mysql-mmm/

在这里插入图片描述

4)修改所有数据库服务器的代理配置文件 mmm_agent.conf

修改 mmm_agent.conf

vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1				#根据不同的主机分别修改为 db1,db2,db3,db4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5) 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....ping_ips        	192.168.210.101,192.168.210.102,192.168.210.103,192.168.210.106   #指定所有数据库服务器的 IPauto_set_online		10				#指定自动上线时间
</monitor><host default>monitor_user        mmm_monitor		#指定 mmm_monitor 的用户名monitor_password    123456          指定 mmm_monitor 的密码
</host>

在这里插入图片描述

6)在所有数据库上为 mmm_agent(代理进程)和mmm_moniter(监控进程)授权
grant super, replication client, process on *.* to 'mmm_agent'@'192.168.210.%' identified by '123456';grant replication client on *.* to 'mmm_monitor'@'192.168.210.%' identified by '123456';flush privileges;

在这里插入图片描述

7)在所有数据库服务器上启动 mysql-mmm-agent
systemctl enable mysql-mmm-agent.service --now

在这里插入图片描述

8)在 monitor 服务器上启动 mysql-mmm-monitor
systemctl start mysql-mmm-monitor.service 

在这里插入图片描述

9)在 monitor 服务器上测试群集
mmm_control show
#查看各节点的情况

在这里插入图片描述

#检测监控功能是否都完善
mmm_control checks all
#需要各种OK

在这里插入图片描述

#指定绑定 VIP 的主机db2
mmm_control move_role writer db2mmm_control show

在这里插入图片描述

mmm_control move_role writer db1
#修改绑定VIP的主机为db1
mmm_control show

在这里插入图片描述

3、 故障测试及恢复

1)模拟Master宕机以及恢复
1.停止Master1的mysql服务
systemctl stop mysqld
2.查看VIP漂移情况
#切换到Monitor服务器
mmm_control show#VIP成功漂移至master2,且master1显示HARD_OFFLINE

在这里插入图片描述

3.重启Master1的mysql服务
systemctl start mysqld
4.查看Master1是否恢复
#切换至monitor
mmm_control show
#显示等待恢复

在这里插入图片描述

#继续查看节点状况
#等待数秒后重新查看,发现Master1在线,但未能获得VIP
mmm_control show

在这里插入图片描述

2)模拟从服务器宕机以及恢复
1.停止Slave1的mysql服务
#Slave1
systemctl stop mysqld
2.查看VIP漂移情况
#切换至monitor
mmm_control show#Slave1 离线 
#VIP漂移至Slave2,服务不影响

在这里插入图片描述

3.重启Slave1的MySQL服务
#切换到Slave1
systemctl start mysqld
4.查看slave1是否恢复
#切换至monitor
mmm_control show#多次执行

在这里插入图片描述

3)客户端测试
1.在Master1服务器上为monitor服务器地址授权登录
#切换到Master1
mysql -u root -pabc123grant all on *.* to 'testdba'@'192.168.210.104' identified by '123456';
#master1授权给monitor
flush privileges;

在这里插入图片描述

2.在monitor服务器上使用写VIP登录
#切换到monitor
mysql -utestdba -p123456 -h 192.168.210.188
#以授权的用户名和密码使用写VIP登录

在这里插入图片描述

3.创建数据,测试同步情况
#monitor服务器
create database client_test;
#Master1服务器
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| client_test   
| db_test
| mysql              |
| performance_schema |
| sys                |               |
+--------------------+
6 rows in set (0.00 sec)
#Master2服务器
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| client_test   
| db_test
| mysql              |
| performance_schema |
| sys                |               |
+--------------------+
6 rows in set (0.00 sec)
#Slave1服务器mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| client_test   
| db_test
| mysql              |
| performance_schema |
| sys                |               |
+--------------------+
6 rows in set (0.00 sec)
#Slave2服务器
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| client_test   
| db_test
| mysql              |
| performance_schema |
| sys                |               |
+--------------------+
6 rows in set (0.00 sec)

相关文章:

MySQL MMM高可用架构

MySQL MMM高可用架构一、MMM概述1、MMM简介2、MMM高可用架构3、MMM故障切换流程 二、MMM高可用双主双从架构部署1、配置主主复制&#xff08;master&#xff09;&#xff0c;主从复制&#xff08;slave&#xff09;1&#xff09;修改 Master1的MySQL配置文件2&#xff09;把配置…...

Spring Boot中配置文件介绍及其使用教程

目录 一、配置文件介绍 二、配置简单数据 三、配置对象数据 四、配置集合数据 五、读取配置文件数据 六、占位符的使用 一、配置文件介绍 SpringBoot项目中&#xff0c;大部分配置都有默认值&#xff0c;但如果想替换默认配置的话&#xff0c;就可以使用application.prop…...

Hobby脚本自动化工具

Hobby脚本自动化工具 功能简介&#xff1a;可以按照指定编排的配置文件&#xff0c;按顺序执行并监听 使用场景&#xff1a;可以用在前期信息收集的步骤上&#xff0c;将一些常见的脚本进行归纳&#xff0c;并编写成配置文档进行自动化处理 优点&#xff1a;可以扩展性强&am…...

Matlab随机数的产生

1、常见分布随机数的产生 1.1 二项分布 在贝努力试验中&#xff0c;某事件A发生的概率为p&#xff0c;重复该实验n次&#xff0c;X表示这n次实验中A发生的次数&#xff0c;则随机变量X服从的概率分布律&#xff08;概率密度&#xff09;为 记为 binopdf(x,n,p) p…...

计算机网络 第四章:网络层

一.网络层概述 1.1分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机&#xff0c;可以将该任务划分为分组转发和路由选择两种重要的功能。 如图所示&#xff1a;这些异构型网络如果只是需要各自内部通信&#xff0c;那它们只需要实…...

分享一个docker无法启动的小问题

准备看看docker服务怎么样 [rootlocalhost ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 这一看就是docker的进程崩了&#xff0c;我们启动下进程 [rootlocalhost ~]# systemctl start docker Faile…...

Linux 安全 - Capabilities机制

文章目录 前言一、简介二、Capabilities list2.1 POSIX-draft defined capabilities2.2 Linux-specific capabilities 三、 Past and current implementation四、Thread capability sets五、File capabilities六、Transformation of capabilities during execve()七、Capabilit…...

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合 什么是聚合&#xff1f; 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售情况如…...

Matlab坐标轴标签中文设置宋体

对y坐标输出中文宋体 新罗马字符 x[1,2,3,4,5,6,7]; plot(x) ylabel(\fontname{宋体}\fontsize{20}长度\fontname{Times New Roman}\fontsize{10} (μm))可以灵活设置字体和大小,其图片如下图所示 也可以对全图的文字设置同一个字体 set(gca,FontSize,9,Fontname, Times New…...

做一个贪吃蛇小游戏happy一下

直接Vue上代码 <template><div><div>贪吃蛇</div><canvas id"canvas" width"400" height"400"></canvas></div> </template><script> export default {data() {return {ctx: null,inter…...

opencv形态学-膨胀

opencv形态学-膨胀 膨胀就是取每一个位置结构元邻域内最大值作为该位置的输出灰度值&#xff1b; 膨胀是取邻域内最大值&#xff0c;那么显然膨胀后图像整体亮度会比原先要高&#xff0c;图像中亮的物体尺寸会变大&#xff0c;相反暗的尺寸会减小&#xff0c;甚至是消失 结构元…...

玄子Share 设计模式 GOF 全23种 + 七大设计原则

玄子Share 设计模式 GOF 全23种 七大设计原则 前言&#xff1a; 此文主要内容为 面向对象七大设计原则&#xff08;OOD Principle&#xff09;GOF&#xff08;Gang Of Four&#xff09;23种设计模式拓展的两个设计模式 简单工厂模式&#xff08;Simple Factory Pattern&#x…...

单链表操作 C实现

struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…...

WordPress主题网站首页添加好看的四格小工具教程

直接到网站根目录创建一个css文件(文件名:sige.css),文件名可自定义(注意文件名一致) <link rel"stylesheet" href"你的网站/sige.css" type"text/css" > 然后在header.php模板最上方添加引入代码 也可自定义HTML里添加css代码最上方写…...

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…...

数学建模之Matlab基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …...

【Nuxt】04 Nuxt2-SEO: sitemap.xml、seo优化、robots.txt

1 SiteMap设置 环境准备 注意生成sitemap依赖于nuxtjs/sitemap&#xff0c;并且需要用axios进行请求&#xff0c;不要使用nuxtjs/axios&#xff0c;不然会报错 sitemap.xml配置 在nuxt.config.js中配置下面的内容 npm install nuxtjs/sitemap npm install axios在static/s…...

VMware VSAN 入门

一、虚拟化的存储 1.1、对于数据中心来说最重要的是数据&#xff0c;而承载数据的设备就是存储设备&#xff08;Storage&#xff09; 1.2、物理服务器的本地存储阵列 与 虚拟化服务器的本地存储阵列 对比 1.3、避免单台服务器故障的虚拟化高级特性&#xff1a;vSphere HA技术 …...

【设计模式】备忘录模式

文章目录 1.备忘录模式定义2.备忘录模式的角色3.备忘录模式实现3.1.场景说明3.2.结构类图3.3.代码实现 4.备忘录模式优缺点5.备忘录模式适用场景6.备忘录模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.备忘录模式定义 备忘录&#xff08;Memento Pattern&#xff09;模…...

vue3+elementUiPlus表格导出功能

1.下载需要的组件包 npm install file-saver xlsx 2.页面中导入 import FileSaver from file-saver import * as XLSX from xlsx; 3.页面中的表格加一个id <el-table :data"tableData" ref"multipleTableRef" style"width…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...