minio基础知识介绍

2023-11-03

minio基础知识介绍


minio为开源的高可用分部署对象存储服务组件,已经提供了分布式部署的解决方案,实现高可靠、高可用的资源存储,MinIO以极简主义为指导进行设计,追求极致的维护精简性和卓越的读写性能表现,本文主要介绍minio基本概念和原理

1 概述

MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。 它是与 Amazon S3 云存储服务兼容的 API。 使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。

1.1 特性

本节选自官网介绍

  1. 高性能

MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。
对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。
MinIO用作云原生应用程序的主要存储,与传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。
在这里插入图片描述

  1. 可扩展性

MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。 这是我们坚定的理念 “简单可扩展.” 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。 通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。
在这里插入图片描述

  1. 云的原生支持

MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。 其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

在这里插入图片描述

  1. 开放全部源代码 + 企业级支持

MinIO 基于Apache V2 license 100% 开放源代码 。 这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。 此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。
在这里插入图片描述

5.与Amazon S3 兼容

亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。 MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。
在这里插入图片描述

  1. 简单

极简主义是MinIO的指导性设计原则。简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础。 只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO。 配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到接近于0的水平。 MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级,并且不需要停机即可完成升级操作 - 降低总使用和运维成本。
简单

  1. 可对接后端存储

除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。

  1. SDK支持

基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

  1. 擦除码存储安全机制

MinIO使用按对象的嵌入式擦除编码保护数据,该编码以汇编代码编写,可提供最高的性能。 MinIO使用Reed-Solomon代码将对象划分为n / 2个数据和n / 2个奇偶校验块-尽管可以将它们配置为任何所需的冗余级别。 这意味着在12个驱动器设置中,将一个对象分片为6个数据和6个奇偶校验块。即使丢失了多达5个((n / 2)–1)个驱动器(无论是奇偶校验还是数据),仍然可以从其余驱动器可靠地重建数据。MinIO的实现可确保即使丢失或无法使用多个设备,也可以读取对象或写入新对象。最后,MinIO的擦除代码位于对象级别,并且可以一次修复一个对象。

  1. Bitrot保护

MinIO对高速哈希算法的优化实现可确保它永远不会读取损坏的数据-它可以实时捕获和修复损坏的对象。 通过在READ上计算哈希值,并在WRITE上从应用程序,整个网络以及到内存/驱动器的哈希值,来确保端到端的完整性。

  1. 数据通信安全

加密飞行中的数据是一回事,保护静态数据是另一回事。 MinIO支持多种复杂的服务器端加密方案,以保护数据-无论其位于何处。 MinIO的方法可确保机密性,完整性和真实性,而性能开销却可以忽略不计。 使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密的对象使用AEAD服务器端加密进行了防篡改。此外,MinIO与所有常用的密钥管理解决方案(例如HashiCorp Vault)兼容并经过测试。MinIO使用密钥管理系统(KMS)支持SSE-S3。如果客户端请求SSE-S3,或启用了自动加密,则MinIO服务器会使用唯一的对象密钥对每个对象进行加密,该对象密钥受KMS管理的主密钥保护。由于开销极低,因此可以为每个应用程序和实例打开自动加密。启用WORM后,MinIO会禁用所有可能会使对象数据和元数据发生变异的API。这意味着一旦写入数据就可以防止篡改。这对于许多不同的法规要求具有实际应用。
20211104143553

  1. 身份认证和管理

MinIO支持身份管理中最先进的标准,并与OpenID connect兼容提供商以及主要的外部IDP供应商集成。这意味着访问是集中的,密码是临时的和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度的且高度可配置的,这意味着支持多租户和多实例部署变得简单。
20211104143814

  1. 连续复制

传统复制方法的挑战在于它们无法有效扩展到几百TB。话虽如此,每个人都需要一种复制策略来支持灾难恢复,并且该策略需要跨越地域,数据中心和云。 MinIO的连续复制旨在用于大规模的跨数据中心部署。通过利用Lambda计算通知和对象元数据,它可以高效,快速地计算增量。Lambda通知确保与传统的批处理模式相反,更改可以立即传播。连续复制意味着即使发生高动态数据集,如果发生故障,数据丢失也将保持在最低水平。最后,就像MinIO所做的一样,连续复制是多厂商的,这意味着您的备份位置可以是从NAS到公共云的任何位置。
20211104143943

  1. 全局一致性

现代企业到处都有数据。 MinIO允许将这些各种实例组合在一起以形成统一的全局名称空间。具体来说,最多可以将32个MinIO服务器组合成一个分布式模式集,并且可以将多个分布式模式集组合成一个MinIO服务器联合。每个MinIO Server Federation都提供统一的管理员和名称空间。MinIO Federation Server支持无限数量的分布式模式集。这种方法的影响在于,对象存储可以为大型的,地理上分散的企业进行大规模扩展,同时保留从以下位置容纳各种应用程序(S3 Select,MinSQL,Spark,Hive,Presto,TensorFlow,H20)的能力。单一控制台。
20211104144045

  1. 多云网关

MinIO应无论数据位于何处,都使数据可用。 MinIO在裸机,网络连接存储和每个公共云上运行,MinIO通过Amazon S3 API从应用程序和管理角度确保使您现有的存储基础架构与Amazon S3兼容。组织可以真正统一其数据基础架构-从文件到块,所有这些都显示为可通过Amazon S3 API访问的对象,而无需迁移。
20211104144321

1.2 部署运行模式

  1. 单机模式

minio支持单主机单硬盘模式,单主机多硬盘模式部署;可支持单实例和多实例运行方式;根据使用场景不同选择不通的部署和运行方式,比如多租户时,可以选择多实例运行,尽量不要使用单盘,无法使用纠错码模式,无法保证存储安全
单硬盘
多硬盘

  1. 多机分布式模式

可采用分布式集群模式部署,多租户的情况下,每个节点可运行多个实例,可在一套集群节点上部署多个集群,每个集群对应一个租户,此种部署方式多个集群的物理硬盘分开,不要共用

2 存储机制

Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 宣传丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
在这里插入图片描述

2.1 纠错码

纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),仍可以从剩下的盘中的数据进行恢复。纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2奇偶校验块,所以即使N/2块盘损坏,仍然可以还原数据。纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。

2.2 RS code编码数据恢复原理

引用简书博客

RS编码以word为编码和解码单位,大的数据块拆分到字长为w(取值一般为8或者16位)的word,然后对word进行编解码。 数据块的编码原理与word编码原理相同,后文中以word为例说明,变量Di, Ci将代表一个word。
把输入数据视为向量D=(D1,D2,…, Dn), 编码后数据视为向量(D1, D2,…, Dn, C1, C2,…, Cm),RS编码可视为如下所示矩阵运算,图1最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。
矩阵运算
RS最多能容忍m个数据块被删除。 数据恢复的过程如下:

  • 假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。(图2、3)
  • 由于B’ 是可逆的,记B’的逆矩阵为 (B’^-1),则B’ * (B’^-1) = I 单位矩阵。两边左乘B’ 逆矩阵。 (图4、5)
  • 得到如下原始数据D的计算公式 :
    公式
  • 对D重新编码,可得到丢失的编码

2.3 校验和

保护数据免受硬盘故障和位衰减,位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。原因多种多样(驱动器老化,电流尖峰,磁盘固件错误,虚假写入,读/写方向错误,驱动程序错误,意外覆盖),但结果是一样的——数据泄漏。
MinIO对高速哈希算法的优化实现可确保它永远不会读取损坏的数据-它可以实时捕获和修复损坏的对象。 通过在READ上计算哈希值,并在WRITE上从应用程序,整个网络以及到内存/驱动器的哈希值,来确保端到端的完整性。 该实现旨在提高速度,并且可以在Intel CPU的单个内核上实现超过10 GB /秒的哈希速度。
在这里插入图片描述

3 minio多租户和多用户

3.1 多租户

多租户技术或称多重租赁技术,是一种软件架构技术,是实现如何在多用户环境下共用相同的系统或程序组件,并且可确保各用户间数据的隔离性,多租户架构可采用单实例多租户架构和多实例多租户架构,minio多租户架构采用的是多实例多租户架构,为每个租户运行一个MinIO server,使用不同的HTTPS端口、配置和数据目录。

  1. 单机模式部署(单主机,单磁盘)
    以下示例在一块磁盘上托管三个租户。
minio --config-dir ~/tenant1 server --address :9001 /data/tenant1
minio --config-dir ~/tenant2 server --address :9002 /data/tenant2
minio --config-dir ~/tenant3 server --address :9003 /data/tenant3
  1. 单机模式部署(单主机,多磁盘)

    以下示例在多块磁盘上托管三个租户。

minio --config-dir ~/tenant1 server --address :9001 /disk1/data/tenant1 /disk2/data/tenant1 /disk3/data/tenant1 /disk4/data/tenant1
minio --config-dir ~/tenant2 server --address :9002 /disk1/data/tenant2 /disk2/data/tenant2 /disk3/data/tenant2 /disk4/data/tenant2
minio --config-dir ~/tenant3 server --address :9003 /disk1/data/tenant3 /disk2/data/tenant3 /disk3/data/tenant3 /disk4/data/tenant3
  1. 分布式部署(纠错码模式)

要在分布式环境中托管多个租户,同时运行多个分布式MinIO实例。

export MINIO_ACCESS_KEY=<TENANT1_ACCESS_KEY>
export MINIO_SECRET_KEY=<TENANT1_SECRET_KEY>
minio --config-dir ~/tenant1 server --address :9001 http://192.168.10.11/data/tenant1 http://192.168.10.12/data/tenant1 http://192.168.10.13/data/tenant1 http://192.168.10.14/data/tenant1

export MINIO_ACCESS_KEY=<TENANT2_ACCESS_KEY>
export MINIO_SECRET_KEY=<TENANT2_SECRET_KEY>
minio --config-dir ~/tenant2 server --address :9002 http://192.168.10.11/data/tenant2 http://192.168.10.12/data/tenant2 http://192.168.10.13/data/tenant2 http://192.168.10.14/data/tenant2

export MINIO_ACCESS_KEY=<TENANT3_ACCESS_KEY>
export MINIO_SECRET_KEY=<TENANT3_SECRET_KEY>
minio --config-dir ~/tenant3 server --address :9003 http://192.168.10.11/data/tenant3 http://192.168.10.12/data/tenant3 http://192.168.10.13/data/tenant3 http://192.168.10.14/data/tenant3

如果是大型minio部署场景,可采用云端可伸缩部署,比如Kubernetes、DC/OS,或者是Docker Swarm

有关minio最新的文章,可关注微信gongzhong号”壹零仓“

3.2 多用户

除了在服务器启动期间创建的默认用户外,MinIO还支持多个长期用户。服务器启动后,可以添加新用户,并且可以将服务器配置为拒绝或允许这些用户访问存储桶和资源。可通过minio客户端mc进行相关的配置,这里参考minio官方文档。
MinIO多用户快速入门指南

4 minio集群及扩容

本节内容来自博客

minIO分布式集群是指在多个服务器节点均部署MinIO服务,并将其组建为分布式存储集群,对外提供标准S3接口以进行统一访问.

4.1 minio集群架构

MinIO集群采用去中心化无共享架构,各节点间为对等关系,连接至任一节点均可实现对集群的访问,并通过DNS轮询等方式实现节点间的负载均衡。这种节点间保持对等关系的设计并非最常见的分布式集群架构。当前大多数的分布式存储集群,其节点往往可划分为多类角色,例如负责连接并处理外部应用请求的访问节点、负责存储元数据的管理节点、实际的数据存储节点等。MinIO则与之不同,MinIO集群中的所有节点都同时承担了多种角色,集元数据存储、数据存储、应用访问等功能于一体,真正实现了去中心化和所有节点的完全对等。其优势在于有效地减少了集群内的复杂调度过程以及因中心节点带来的故障风险和性能瓶颈。
20211104135545

4.2 minio集群的数据对象存储

数据对象在MinIO集群中进行存储时,先进行纠删分片,后打散存储在各硬盘上。具体为:

  1. MinIO自动在集群内生成若干纠删组,每个纠删组包含一组硬盘,其数量通常为4至16块
  2. 对数据对象进行分片,默认策略是得到相同数量的数据分片和校验分片
  3. 通过哈希算法计算出该数据对象对应的纠删组,并将数据和校验分片存储至纠删组内的硬盘上
    20211104140606

如图所示,假设某MinIO集群内纠删组包含4块硬盘,某数据对象名为MyObject,其隶属存储桶名为MyBucket,哈希计算得到对应的纠删组为Disk 1~4。那么在Disk 1~4的数据路径下,都会生成MyBucket/MyObject子路径,子路径中包含2个文件,分别为存储元数据信息的xl.json和MyObject对象在该盘上的第一个分片part.1。其中,xl表示MinIO中数据对象的默认存储格式。

4.3 MinIO集群扩容方式

常见的集群扩容方法可分为两类:水平扩容和垂直扩容。水平扩容,一般指通过增加节点数扩展系统性能;而垂直扩容则指提升各节点自身的性能,例如增加节点的磁盘存储空间。直接采用垂直扩容方式扩容MinIO集群的节点磁盘空间,会为集群运行带来若干问题,官方不推荐。因此本文主要介绍MinIO的两种水平扩容方式:对等扩容和联邦扩容。

  1. 对等扩容

MinIO的极简设计理念使得MinIO分布式集群并不支持向集群中添加单个节点并进行自动调节的扩容方式,这是因为加入单个节点后所引发的数据均衡以及纠删组划分等问题会为整个集群带来复杂的调度和处理过程,并不利于维护。因此,MinIO提供了一种对等扩容的方式,即要求增加的节点数和磁盘数均需与原集群保持对等。

例如原集群包含4个节点4块磁盘,则在扩容时必须同样增加4个节点4块磁盘(或为其倍数),以便系统维持相同的数据冗余SLA,从而极大地降低扩容的复杂性。如上例,在扩容后,MinIO集群并不会对全部的8个节点进行完全的数据均衡,而是将原本的4个节点视作一个区域,新加入的4节点视作另一区域,当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内仍旧通过哈希算法确定对应的纠删组进行最终的存放。此外,集群进行一次对等扩容后,还可依据扩容规则继续进行对等扩容,但出于安全性考虑,集群的最大节点数一般不得超过32个。

对等扩容的优点在于配置操作简单易行,通过一条命令即可完成扩容(注意:推荐使用连续的节点IP,并参照MinIO官网在扩容命令中使用{})。而对等扩容的局限性在于:①扩容需重启;②扩容存在限制,集群节点数一般不超过32个,这是由于MinIO集群通过分布式锁保证强一致性,若集群节点数过大,维护强一致性将带来性能问题。

#创建集群
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...4}/export{1...16}

#扩容集群
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...4}/export{1...16} http://host{5...8}/export{1...16}
  1. 联邦扩容

MinIO官方提供了另一种扩容机制——联邦扩容,即通过引入etcd,将多个MinIO分布式集群在逻辑上组成一个联邦,对外以一个整体提供服务,并提供统一的命名空间。MinIO联邦集群的架构如图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8ueaZc3-1650007169549)(https://cdn.jsdelivr.net/gh/Water1209/PicBed@master/doc_pictures/20211104145323.png)]
其中,etcd是一个开源的分布式键值存储数据库,在联邦中用于记录存储桶IP地址。联邦内的各个集群其数据存储以及一致性维护仍由各集群自行管理,联邦只是对外提供一个整体逻辑视图。通过连接到联邦中任一集群的任一节点,可以查询并访问联邦内所有集群的全部数据,由此获得了逻辑上的空间扩大感。但实际上,对于一个外部应用访问,联邦需依赖etcd定位到存储桶的实际存储节点,再进行数据访问,联邦则对外屏蔽了桶IP查找和定位过程,从而在逻辑上对外形成了一个统一整体。因此,etcd实际上起到了类似路由寻址的效果。
MinIO联邦集群的数据访问机制具体如下:

  • 客户端应用向联邦集群发送创建存储桶请求,桶名为bucket1

  • 联邦会将bucket1实际所在的集群节点IP地址写入etcd中,例如bucket1实际将存储于联邦中的集群1上,而集群1包含2个节点,其节点IP地址分别为192.168.1.103和192.168.1.104,则etcd中将写入如下两条记录:
    20211104145517

  • 客户端应用向联邦请求上传1个对象至bucket1

  • 联邦会先查询etcd,定位到bucket1的实际存储节点103和104,再进行相应的上传操作

相较于对等扩容,联邦扩容的优点在于:

  • 联邦中的各集群不要求节点数和磁盘数的对等

  • 联邦可以无限扩展,不断加入新集群

  • 若联邦中某个集群出现故障,该故障将不影响联邦中的其他集群提供服务

5 总结

本文主要介绍minio的基本知识和概念,介绍其特性、部署运行方式、存储机制、扩容方式等,旨在让读者整体上了解minio基本情况,如若要详细了解,请翻阅minio官方文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

minio基础知识介绍 的相关文章

随机推荐

  • 利用MMPose进行姿态估计(训练、测试全流程)

    前言 MMPose是一款基于PyTorch的姿态分析开源工具箱 是OpenMMLab项目成员之一 主要特性 支持多种人体姿态分析相关任务 2D多人姿态估计 2D手部姿态估计 动物关键点检测等等 更高的精度和更快的速度 包括 自顶向下 和 自
  • C语言做的一个简单的系统

    这个适合初学者去学习 include
  • idea的控制台无法输入

    1 进入help gt Edit Custom VM Options 2 添加 Deditable java test console true 然后重启IDEA即可生效
  • 机器学习:集成学习

    一 集成学习算法简介 1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题 它的工作原理是生成多个分类器 模型 各自独立地学习和作出预测 这些预测最后结合成组合预测 因此优于任何一个单分类的做出预测 2 复习 机器学习的两个核心任
  • 死锁的成因和对应的解决方案

    目录 一 什么是死锁 二 产生死锁的三个典型场景 案例一 一个线程一把锁 案例二 两个线程两把锁 死锁原因分析 解决办法 案例三 N个线程M把锁 解决办法 三 形成死锁的四个条件 一 什么是死锁 所谓死锁 是指多个进程在运行过程中因争夺资源
  • mysql中脏读,幻读,不可重复读是什么意思及其解决办法

    mysql中脏读 幻读 不可重复读是什么意思 https blog csdn net lafengwnagzi article details 80660631 一个事务读到另外一个事务还没有提交的数据 我们称之为脏读 解决方法 把事务隔离
  • v-if与v-for的不共用问题

    v for的优先级比v if高 所以会优先执行v for 如果你需要v if与v for共用的话 需要把v if放在容器上 ul li user name li ul 这一段代码中 会先去循环v for 循环后再循环一次 对v if的进行显
  • 华为Android10怎样root,华为手机怎么root?详细的root教程在此

    随着华为手机的热销 相信不少机友都入手了华为手机 华为手机有华为和荣耀两个系列 那华为手机怎么获取root权限呢 很多入手了华为手机的朋友都在纠结于root权限获取的问题之上 因为找不到合适的华为手机root的方法 为此 小编为大家带来了华
  • 一图让你明白爬虫与反爬虫进化过程

    爬虫与发爬虫的厮杀 一方为了拿到数据 一方为了防止爬虫拿到数据 谁是最后的赢家 重新理解爬虫中的一些概念 爬虫 自动获取网站数据的程序 反爬虫 使用技术手段防止爬虫程序爬取数据 误伤 反爬虫技术将普通用户识别为爬虫 这种情况多出现在封ip中
  • 颜色分类Ⅱ

    题目 方法一 分治法 算法思路 每次选定一个中间的颜色 这个中间的颜色用给出的k来决定 将小于等于中间的颜色的就放到左边 大于中间颜色的就放到右边 然后分别再递归左右两半 代码思路 递归函数设置四个参数 序列需要处理区间的左右端点和处理的颜
  • async、await 实现原理

    JavaScript 异步编程回顾 由于 JavaScript 是单线程执行模型 因此必须支持异步编程才能提高运行效率 异步编程的语法目标是让异步过程写起来像同步过程 1 回调函数 回调函数 就是把任务的第二段单独写在一个函数里面 等到重新
  • 【程序员面试金典】输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

    题目描述 输入一颗二叉树的跟节点和一个整数 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 注意 在返回值的list中 数组长度大的数组靠前 struct TreeNode
  • 多个主机节点上的Hyperledger Fabric

    Hyperledger Fabric是由Linux Foundation托管的业务区块链项目 它是一个 分布式总账解决方案平台 以模块化架构为基础 提供高度机密性 弹性好 灵活性和可扩展性 它旨在支持不同组件的可插拔实现 并适应整个经济生态
  • 【Unity基础】2.网格材质贴图与资源打包

    Unity基础 2 网格材质贴图与资源打包 大家好 我是Lampard 欢迎来到Unity基础系列博客 所学知识来自B站阿发老师 感谢 一 网格材质纹理 第一次接触3D物体的话 会觉得好神奇啊 这个物体究竟是由什么组成的呢 其实3D物体基本
  • UNIX环境高级编程 学习笔记 第一章 UNIX基础知识

    所有OS都为它们所运行的程序提供服务 包括打开文件 执行新程序 分配存储区等 操作系统可定义为一种软件 它控制计算机硬件资源 提供程序运行环境 通常将这种软件称为内核 它相对较小 位于系统核心 内核接口被称为系统调用 公用函数库构建在系统调
  • bootstrap组件:fileinput控件的非常规操作

    在fileinput控件的使用中遇到了一个问题 就是分了三次选了三个文件 点击form提交的时候只会出现最后一次选择的文件 而我想要的是选中的所有文件一起上传 多方查找之后确定了一种可行方案 分享如下 1 引用 和基本引用一样 样式和js
  • Python基础第三集:函数+模块+类,花钱也买不到....

    Python基础知识第三集 Python第一话在这里 Python第二话在这里 今天的是Python第三话 前面的知识点给大家放在上面了 零基础的小伙伴可以自己动手领取 学好Python的基础知识对我们后期 去实现Python案例帮助很大
  • docker 镜像常用命令

    1 拉取镜像 docker pull ubuntu 18 04 2 存储镜像 docker save o tools ubuntu 18 04 tar ubuntu 18 04 3 载入镜像 docker load lt ubuntu 18
  • 模型训练-3D并行

    目录 1 数据并行 Data Parallel 1 1常规数据并行 1 3 数据并行带来的显存优化效果 2 模型并行 2 1 原理 2 2 模型并行带来的显存优化结果 3 ZeRO 3 1 ZeRO1 3 2 ZeRO2 3 3 ZeRO3
  • minio基础知识介绍

    minio基础知识介绍 文章目录 minio基础知识介绍 1 概述 1 1 特性 1 2 部署运行模式 2 存储机制 2 1 纠错码 2 2 RS code编码数据恢复原理 2 3 校验和 3 minio多租户和多用户 3 1 多租户 3