zookeeper学习
解决什么问题?
首先来分析下业务对象,才能对解决的问题进行归纳和总结。它解决的事分布式应用的问题,那么分布式应用会存在哪里问题是由它的业务特性来决定的,这些问题已是为了解决业务的问题。分布式的业务特征有哪些?
分布式业务的特征
存在的意义(高并发低延迟)
分布式这个东西存在的意义是什么?分布式解决什么问题?为什么有分布式这个东西的出现?分布式不是一开始就有的,已不是所有的应用都适合用分布式的方式;
分布式是为了解决业务高并发低延迟;当传统的单体应用不能承载特别高的并发和低延迟的时候,这个才需要把系统拆分为多个,把并发分摊到多个实例上进行承载,减轻单实例的压力,从而减少延迟,满足业务的需求。
分布式是为了解决在大项目开发过程中开发的协作;当一个系统涉及特别多的功能、复杂的流程和特别多的开发人员时,就需要把一个系统拆分为多个系统进行功能、流程的拆分,同时已能让多个开发人员能够并行的进行项目开发。
分布式是为了提高业务的连续性,做容灾多活的;当之前的单体系统在一个地方,会由于单体系统自身,和由于系统所在操纵系统物理硬件数据中心城市等基础环境,的影响,系统出现问题而导致业务无法使用。所以要把一个单体系统拆分为多个,或者把一个单体系统重复多个,部署在多个环节中,而这多个其实是完成一个业务的,所以就是分布式。
总的来说就是业务是一个,但是系统和应用确实多个在多个环境中,来实现整体的业务目标(高并发低延迟),流程目标(多团体并行开发),管理目标(业务连续性)
沟通方式(通过网络通信)
分布式业务是一个业务系统由多个子模块或者系统,通过网络的方式通信的(相较于一个主机上多个进程是通过系统的管道和共享内存来实现通信),来实现整体目标的。网络通信的方式有http和tcp,ip直连都可以。
业务痛点
那么在这些特质下会遇到什么问题?把一个单独系统拆分为多个模块和子系统、或者多个相同实例组成一个大集群后,“多个”就会存在相互之间的通信,协作;这就跟多个人多个团体一起协作完成一件事情一样,会遇到沟通方式的落后,沟通信息的不准确,重复劳动,没有统一标准,请假,做错,冲突,进度延期等等问题。(误解,偏见,懒惰,偷奸耍滑,等情绪问题可能已有的)。
从这些业务痛点总结出来主要问题是
第一:多个应用和系统的信息的不一致的准确,没有统一的标准,这就是分布式的数据一致性问题。
第二:多个应用和系统沟通方式的落后,重复劳动,冲突,请假等等,这就是分布式的工作协作问题。
解决分布式的数据一致性问题
解决分布式应用的协作和数据一致性。协作就是多个应用同时对一个数据对象进行读写操作。这里的知识对象是数据。
场景举例
1.使用相同的配置、配置中心。分布式应用中使用一套配置,通过ZK实现对配置的读写,不冲突。
2.使用统一的命名空间、各个分布式应用维护自己的名字并在整个系统中唯一,已可以叫做服务发现。
3.作为分布式状态锁,多个应用访问一个资源对象的时候,通过zk实现这个对象的分布式锁。
解决分布式的协作问题
解决分布式应用中,每个应用之间的相互协作,
场景举例
1.大部分场景都是集群管理
怎么解决
zookeeper的两大作用
顺序性
顺序性,多个应用对一个数据的操作,要按照动作发出的顺序对数据进行操作,动作发出的顺序,和数据被修改的顺序应该是一样的。
这里的知识对象是zookeeper中的fifo的队列和zab协议,这两个对象都能保证顺序性。
举例:
一个应用向zookeeper的主节点写数据(会把写转换为事务,类似数据库中的sql)(同时会生成一个zxid,这个zxid是按照事务的顺序递增的),和从节点从主节点拿到的要写数据的事务,都会存入当前节点的一个fifo队列中,这个fifo队列就是先进先出,这个fifo就是保障所有执行的数据写操作(在所有节点上执行这些写操作),都是按照之前写发起时的顺序执行的。同时前面说的zxid已能保障从故障恢复后、事务执行已可以按照之前发起的顺序执行。
原子性
原子性,一个应用将数据给zookeeper写入时,要么是集群整个更新成功,要么就是整个更新失败,把整个集群做成了原子性更新。其实这个应该在zookeeper的集群高可用容灾的特性之后说。(因为要集群,所以才会出现要做原子性。没有集群其实就不需要原子性)
这里的知识对象是存数据的znode多副本。一个应用向主节点写入时,是通过将写入数据这个行为转换为一个事务,最后通过这个事务来更新znode中的数据。(就是数据库样,写数据,通过sql事务,最终是更新到数据表里面),多个副本的更新要么都成功,要么都失败。这就是实现原子性。
举例:
应用写数据到主节点(只有主节点接受写入数据,其他从节点都是从主同步),主节点会生成一个带zxid的事务,这个事务会写到事务日志中,这个事务日志一开始是在系统内存中,然后将事务日志写入fifo中,开始广播给其他从节点(这里系统内存中的事务日志数据,异步{跟写入fifo和广播 相比}刷新到磁盘中。从节点接受到事务会将事务计入自己的事务日志,已是先写入内存中(异步下刷到磁盘),然后把事务写入fifo队列后,就给主节点发送ack成功。所有过半的成才是事务提交成功,才开始在主节点中,把事务日志刷新到内存znode中(类似数据库sql提交到数据表中)
多活容灾
znode在每个从节点上都有副本,当主down后,从节点能够承担起主节点能力,又能保障每个副本的数据一致性。
例子就是整个串起来:
- 主从节点都有zonde数据,从节点zonde数据是主节点的副本。
- 主节点收到写请求,是把事务(类似SQL日志BINLOG)写到系统内存(事务并不是提交状态,丢了已没关系),通过ZAB协议完成事务的提交(这个事务提交状态只和ZAB协议有关,事务日志刷盘是异步的,当主节点坏了是不是提交的事务就丢了?{因为在内存中还没来得及刷到磁盘}{其实这个时候主坏了,就会有从节点来接,从节点内存中有提交的事务日志,完成异步的刷盘}),提交的事务的事务日志肯定在磁盘中。
- 主节点和从节点都有FIFO队列来维护事务。主节点将zxid和事务关联后写入本节点的FIFO队列,并异步广播给其他从节点。其他从节点已会将zxid和事务关联写入本节点的FIFO队列。保证了事务的顺序执行。
- 主节点中内znode数据的刷新和保存。内存ZNODE的数据刷新是在事务提交后,事务提交后才是把数据刷新到内存中zonde数据。
- 主节点生成内存znode数据快照 是两个时间点(周期性,当事务达到一定量),生成快照前把内存中的znode刷到磁盘,生成新的快照。(这个时候会暂停所有写操作)
- 从节点收到事务消息后写入本地的FIFO队列后,就立刻给主节点返回ACK事务成功(但不需要刷事务日志到磁盘之后,不需要把事务刷到内存znode之后)。
- 从节点内存znode数据更,从节点收到事务消息后写入本地的FIFO队列后,然后根据fifo顺序来更新内存中zonde数据。更新内存Znode数据 是在 给主节点发送ACK成功消息之前就 必须完成。
- 从节点内存znode数据不会快照。只有主节点会对内存中znode数据进行快照,从节点不会对内存中znode数据进行快照,而是使用从主节点同步过来的"数据快照".
- 主从同步znode数据快照和增量事务日志,是周期性的。两个时间点生成zonde快照和增量事务(相对上一次快照时的事务增量,周期性和事务操作达到一定量时,会同步znode数据快照和增量事务给从节点。)
- 从节点恢复数据,是通过从主节点同步过来的znode快照。
- 主从同步事务日志,写主时,会把事务日志同步到从节点,不会对zonde打快照,已不会同步znode的快照给从。
ZAB协议。
zxid是64位两部分组成,高32由纪元(主节点任期)低32由事务数 组成。
1.广播阶段
主收到写请求,主节点新建一个zxid,高32位当前主节点的任期,低32当前任期中处理的第几个事务。然后把这个zxid关联到当前的事务(把写请求转换为一个事务,例如数据库的SQL),写入当前节点的FIFO队列,并广播给其他从节点。从节点接受到事务后会写入本地的FIFO队列,然后通就直接返回给主节点ACK成功。然后异步的通过FIFO把事务应用到内存ZNODE数据上。
2.故障恢复
当主节点失败后,其他从节点开始选举主节点,通过比较自己的ZXID,谁的ZXID最大,就是谁来当主节点,这个相当于谁拥有最新的事务日志。
相关文章:
zookeeper学习
解决什么问题? 首先来分析下业务对象,才能对解决的问题进行归纳和总结。它解决的事分布式应用的问题,那么分布式应用会存在哪里问题是由它的业务特性来决定的,这些问题已是为了解决业务的问题。分布式的业务特征有哪些࿱…...
Monkey结合appium模拟操作特定界面
目录 1. 使用 Monkey 操作特定界面(通过UI标识来限制) 2. 结合 uiautomator 或 appium 定位特定元素 步骤: 3. 使用 Monkey Appium 控制特定界面点击 4. 如何结合 Appium 与 Monkey 5. 限制 Monkey 只点击固定界面上的元素 使用 --pc…...
智能指针【C++11】
文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针,auto_ptr通过管理权转移的方式解决智能指针的拷贝问题,保证一个资源…...
plsql 执行存储过程 SYS_REFCURSOR
关键字:plsql 执行存储过程 SYS_REFCURSOR 在PL/SQL中,SYS_REFCURSOR是一种特殊的数据类型,用于表示引用游标,可以用来返回查询结果或者操作数据库中的结果集。 以下是一个使用SYS_REFCURSOR执行存储过程的例子: CR…...
git修改某次commit(白痴版)
第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…...
设计模式:19、桥接模式
目录 0、定义 1、桥接模式的四种角色 2、桥接模式的UML类图 3、示例代码 0、定义 将抽象部门与实现部分分离,使它们都可以独立地变化。 1、桥接模式的四种角色 抽象(Abstraction):一个抽象类,包含实现者…...
闭包函数的基础知识
上期文章 1. 函数装饰器 2.闭包 2.1变量作用域 python有3种变量作用域 模块全局作用域:在类或函数外部分配定义的。函数局部作用域:通过参数或者在函数主体中定义的。第3种作用域:闭包中的变量环境 2.2全局变量和局部变量 def fun(a):print(a)print(b)fun(10)10---------…...
python3D圣诞树
import pygame import math from pygame.locals import *# 初始化Pygame pygame.init()# 设置屏幕尺寸和标题 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(3D 圣诞树)# 设置颜色 GREEN (34, 139, 34) BROWN (139,…...
博物馆导览系统方案(一)背景需求分析与核心技术实现
维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…...
[代码随想录09]字符串2的总结
前言 处理字符串主要是有思路,同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣(LeetCode) 55. 右旋字符串(第八期模拟笔试) 一、翻转字符串里的单词 这个题目的主要思路,代码采用从后往前遍历字…...
C语言程序设计P5-3【应用函数进行程序设计 | 第三节】——知识要点:函数的嵌套调用和递归调用
知识要点:函数的嵌套调用和递归调用 视频 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求用递归法求 n!。 我们知道n!n(n-1)(n-2)……1n(n-1)!递归公式为: 1.上面公式分解为n!n(n-1)!,即将求n!的问题变为…...
【Java】protobuf-maven-plugin主动下载protoc编译proto文件
背景: 我们hadoop的代码里,配置的是3.7.1的protocol buffer,但是编译环境上安装的是2.5.0。 能成功编译,且没有什么兼容性问题。这里非常好奇发生了什么,于是研究了一下protobuf-maven-plugin插件, 发现是他去下载的 在使用protobuf-maven-plugin插件时,我们一般会这么…...
Go学习:变量
目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息,变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中,变量名的命名规则 与其他编程语言一样,都是由字母、数…...
AllegroHand 四指灵巧手:机器人领域的创新力量
Allegro Hand 作为一款高性价比且适应性强的机器人四指灵巧手,凭借其四根手指和十六个独立的电流控制接头,成为机器人复杂抓握、柔性操作以及触觉传感器等研究领域的理想之选。 Allegrohand 四指灵巧手技术特点 机械结构 Allegro Hand的机械结构设计高…...
蓝桥杯准备训练(lesson3 ,c++)
变量与常量 4.1 变量的创建4.2 变量初始化4.3 变量的分类4.4 常量4.4.1 字⾯常量4.4.2 #define定义常量4.4.3 const定义常量4.5 练习练习1:买票练习2:AB问题练习3:鸡兔同笼 4.1 变量的创建 了解清楚了类型,我们使⽤类型做什么呢&…...
Conda + JuiceFS :增强 AI 开发环境共享能力
Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方面仍存在一些挑战。比如,在不同机器上复用相…...
小红薯x-s算法最新补环境教程12-06更新(下)
在上一篇文章中已经讲了如何去定位x-s生成的位置,本篇文章就直接开始撸代码吧 如果没看过的话可以看:小红薯最新x-s算法分析12-06(x-s 56)(上)-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...
强化ASPICE合规与认可度:关键策略与实践路径
确保ASPICE(Automotive SPICE)标准的合规性和认可度,是一个涉及多方面努力和持续改进的过程。以下是一些关键步骤和建议,以帮助企业实现这一目标: 一、熟悉ASPICE标准 深入阅读和理解:首先,需要…...
没有合理使用线程池,引发的生产环境BUG
引言 随着多线程和并发处理需求的增加,线程池成为了提升系统性能的重要工具。Java 提供了强大的 ThreadPoolExecutor 类,能够高效地管理线程池,减少线程创建和销毁的开销。然而,当线程池达到其最大容量时,如何优雅地处…...
异步处理与后台任务管理:在 FastAPI 中实现高级特性
异步处理与后台任务管理:在 FastAPI 中实现高级特性 目录 ⚡ 背景任务与异步处理概述🛠️ 使用 BackgroundTasks 执行后台任务🚀 异步视图函数:使用 async 和 await🔄 处理并发任务:提升应用性能与响应能…...
ceph存储池
1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区,专门用来存储对象的 特点 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响,过多和过少…...
STM32基于HAL库的串口接收中断触发机制和适用场景
1. HAL_UART_Receive_DMA函数 基本功能 作用:启动一个固定长度的 DMA 数据接收。特点: 需要预先指定接收数据的长度(Size 参数)。DMA 会一直工作直到接收到指定数量的数据,接收完成后触发 HAL_UART_RxCpltCallback 回…...
如何查看电脑的屏幕刷新率?
1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…...
Q3收入回退,盈利与商业化落地步履艰难,文远知行亟待背水一战
撰稿|行星 来源|贝多财经 12月2日,全球商业杂志《Fortune》(财富)揭晓了2024年“未来50强”(The Future 50)企业榜单,上市不久的全球Rbotaxi第一股文远知行(NASDAQ:WRD)位列第26名…...
如何利用Java爬虫获得商品类目
在当今数字化时代,数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场…...
Charts 教程:创建交互式图表的基础
ECharts 是一个开源的、基于 JavaScript 的数据可视化库,它可以帮助你快速创建交互式的图表。无论是简单的柱状图、折线图,还是复杂的地图和关系图,ECharts 都能够轻松应对。本文将带你了解如何在你的网页中使用 ECharts 创建图表,…...
Jackson - JsonGenerator创建JSON、JsonParser解析JSON
以下是关于如何使用Jackson的JsonGenerator类来创建JSON内容以及如何使用JsonParser类来读取JSON内容的教程。 依赖项 首先,在pom.xml文件中添加以下依赖项以引入Jackson库: <dependency><groupId>com.fasterxml.jackson.core</groupI…...
数据结构与算法——1202—排序递归
1、选择排序 #include<iostream> #include<vector> using namespace std;void SelectSort(vector<int>& nums) {int i;int j;int minIndex;int length nums.size();if (length 0 || length 1) return;for (i 0; i < length-1; i)//遍历所有元素{…...
Lattice Radiant Software Lattice Propel Builder Lattice Propel 2024.1 安装
因项目需要,对Lattice 器件LIFCL-40 CrossLink进行评估 先从Lattice官网下载Radiant安装包: Lattice Radiant设计软件 新建工程环境...
【Linux系统】 Linux内核与UNIX设计哲学的结合
Linux 内核虽然不是 UNIX 的直接衍生物,但它深受 UNIX 设计哲学的影响。Linux 的开发者,尤其是 Linus Torvalds,在设计和实现 Linux 时,借鉴了 UNIX 的核心思想,使 Linux 成为一个类 UNIX 系统。 以下从 UNIX 设计哲学…...
MKS EDGE Series RF Generators Power Solution 软件
MKS EDGE Series RF Generators Power Solution 软件...
【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 去除缺失数据2.5 面积、价格、单价、楼层、建筑时间数据提取2.6 朝向数据处理 🏳️🌈 3. 特…...
MyBatis-Plus分页查询方式
分页查询基本方式 SpringBootTest(classes LearningApplication.class) public class MPTest {AutowiredILearningLessonService lessonService;Testpublic void test(){/*** Page<LearningLesson>:MyBatisPlus提供的分页对象* 1:当前页数* 2&am…...
分布式cap
P(分区安全)都能保证,就是在C(强一致)和A(性能)之间做取舍。 (即立马做主从同步,还是先返回写入结果等会再做主从同步。类似的还有,缓存和db之间的同步。&am…...
【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。
文章目录 前言一、简单版Tabs代码实现: 二、下划线带动画的TabsAPI回顾:代码实现: 三、内容区域滑动切换切换动画代码实现:(2)禁用手势滑动切换(3)内容区域换为插槽 四、标签栏可滚动…...
AI在SEO中的应用与关键词优化探讨
内容概要 在当今数字化时代,人工智能(AI)技术为搜索引擎优化(SEO)带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断,而AI则通过算法分析海量数据,提供更加精准和高效的方式优化关键词…...
JUC:Synchronized和锁升级
1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理,monitor对象什么时候生成的?知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛?或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…...
如何使用锁实现多进程和多线程的并发执行的安全
多进程和多线程的并发: 多进程和多线程的并发意思是在同一段时间内,多个进程或者线程一起执行,但是这些进程或者线程的执行并不是真正意义上在同一时刻执行,而是在不同的时间里执行,因为每个CPU在同一时间只能处理同一…...
LabVIEW如何用运动控制卡实现伺服电机的转矩控制?
在LabVIEW中,使用运动控制卡实现伺服电机的转矩控制,通常通过以下几个步骤来完成。这里将结合LabVIEW的运动控制功能和伺服电机控制的基本原理进行详细介绍。 1. 选择合适的运动控制卡 要实现伺服电机的转矩控制,首先需要一张支持伺服电…...
SQL面试题——百度SQL面试题 无效搜索
百度SQL面试题 无效搜索 今天的题目是来自百度的SQL 面试题目 现有一份用户搜索日志,包含用户ID,时间,用户搜索内容。定义 无效搜索:如果用户下一次搜索内容中包含本次搜索内容,则认为本次搜索为无效搜索。请查询用户无效搜索记录 +---------+---------------------+--…...
媒体查询、浏览器一帧渲染过程
文章目录 媒体查询语法示例根据视口宽度应用不同的样式根据设备像素比应用不同的样式根据方向应用不同的样式 使用场景 浏览器一帧的渲染过程 媒体查询 媒体查询(Media Query)是CSS3中的一个重要特性,它允许开发者根据设备的特定条件&#x…...
实习工作日志
工作日志 遇到的bug 由于不熟悉Python,造成了这个bug python的浅拷贝与深拷贝,一定要创建新的变量,否则只是单纯拷贝地址...
JavaWeb学习--cookie和session
目录 (一)Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 (Cookie的生命) (二) Cookie的API 1.创建Cookie:new 构造方法 2.保存到客户端浏…...
ETCD的封装和测试
etcd是存储键值数据的服务器 客户端通过长连接watch实时更新数据 场景: 当主机A给服务器存储 name: 小王 主机B从服务器中查name ,得到name-小王 当主机A更改name 小李 服务器实时通知主机B name 已经被更改成小李了。 应用:服务注册与发…...
c++引用笔记
1 引用的基本使用 // 引用 // 作用:给变量起别名 // 语法:数据类型 &别名 原名int main(int argc, char const *argv[]) {int a 10;int &b a;cout << "a " << a << endl;cout << "b " <&l…...
macOS运行amd64的镜像
在macOS上运行amd64(x86_64)架构的镜像,通常通过虚拟化或仿真工具来实现。例如,如果你使用的是基于Apple Silicon(M1或M2等)芯片的Mac,那么你的处理器是ARM架构的,而amd64是x86架构&…...
Oracle查询优化:高效实现仅查询前10条记录的方法与实践
在 Oracle 中,实现仅查询前10条记录的四种方法 1. 使用 ROWNUM 查询 ROWNUM 是 Oracle 中的伪列,用于限制返回的行数。 SELECT * FROM table_name WHERE condition AND ROWNUM < 10;condition:查询条件。ROWNUM < 10:限制…...
【时时三省】(C语言基础)结构体内存对齐
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题:计算结构体的大小。 这也是一个特别热门的考点:结构体内存对齐 示例: 第一个s如果根据字…...
工业物联网关
工业物联网关的定义与功能 定义:工业物联网关是一种在工业物联网(IIoT)系统中起到关键连接作用的设备。它位于工业现场设备(如传感器、执行器等)和上层的工业网络(如企业内部网络、云平台等)之间…...
Docker 安装 Yapi
Docker 安装系列 Docker已安装。 1、场景Yapi使用的MongoDB用户信息 1.1 创建自定义 Docker 网络 首先,创建一个自定义的 Docker 网络,以便 MongoDB 和 YApi 容器可以相互通信 [rootflexusx-328569 data]# docker network create yapi-networ…...