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

一文了解评估 K8s 原生存储产品需要关注的关键能力

近些年,越来越多的企业使用 Kubernetes(K8s)支持生产环境关键业务。这些业务往往对存储性能和稳定性具有更高的要求,传统存储方案难以充分满足,因此不少用户开始关注更契合 K8s 环境的 K8s 原生存储方案。

不过,面对不同厂商的 K8s 原生存储产品,用户应如何进行选型?有哪些需要重点关注的产品特性与能力?GigaOm 在《Key Criteria for Evaluating Kubernetes Data Storage Solutions v4.0》报告中,分析了容器环境对存储方案的特性需求,并列举了决定/影响这些特性的产品能力,包括 4 项标准能力、5 项关键差异能力和 3 项新兴技术支持能力。本文将结合这篇报告,对 K8s 原生存储关键能力进行深入解读,以便用户更好地进行选型评估。

评估维度:K8s 环境看重存储产品哪些特性?

GigaOm 认为,为了满足 K8s 环境的存储需求,存储方案的以下特性表现至关重要:存储架构、可扩展性、灵活性、效率、可管理性和性能。

存储架构

存储架构将直接影响产品性能和扩展性。GigaOm 根据存储架构将 K8s 外接存储方案划分为商用存储(Enterprise Storage)和 K8s 原生存储(Kuernetes-Native Storage)两个类型。

商用存储是指通常基于软件定义的控制器架构,或基于物理的控制器架构构建的存储解决方案,可以软硬件捆绑的形式提供,也可以纯软件交付。这些商用存储通常情况下主要为虚拟化环境而设计,并且已经通过 CSI 插件扩展了对容器的支持能力。由于这种方案允许企业沿用既有存储,因此可以快速、经济地实现部署。然而,商用存储毕竟与容器化应用属于不同的“世代”和“架构”,容器快速创建/销毁时,后端和元数据操作的数量非常大,一些传统存储难以适应基于容器的工作负载的短暂存在和动态变化的特点,容器数量的增长也会导致性能瓶颈和扩展困难。

K8s 原生存储是专门为支持容器而构建的存储方案。K8s 原生存储系统本身作为 K8s 集群上的一组容器运行,通过 CSI 将存储暴露给集群,供工作负载使用,并与 K8s 集群中的应用工作负载一起运行。K8s 原生存储通常基于分布式架构,与 K8s 紧密集成,在容器创建/销毁时会处理存储配置和撤销配置操作,专为 K8s 环境优化的存储技术也使得 K8s 原生存储具备更好的性能。而且,这种存储方案遵循集群的自动扩展规则,在添加或移除集群节点时,存储系统也会自动扩缩容,非常动态和灵活。

欲深入了解两种存储架构的特点和优劣势,请阅读:本地盘 vs CSI 外接存储 vs K8s 原生存储:详细解析 3 种 K8s 持久化存储方案。

01_K8s-storage-capabilities.png

可扩展性

在企业不断扩大 K8s 的使用范围时,应注意避免造成 K8s 集群间的孤立。一个可扩展的存储方案允许用户从小规模开始部署,根据业务需求按需扩展存储资源,而无需更换基础架构的基本组件。存储方案还应允许企业整合 K8s 基础设施,并支持试运行阶段的多环境混合部署。对于使用既有(传统)存储方案的 K8s 集群而言,可扩展性可能是一个独特的挑战,因为这些存储可能无法随着 K8s 的使用进行扩展,从而不得不进行翻新或替换。

灵活性

云原生时代,数据不再局限于数据中心,而是被分散存放在不同的环境中——企业内部、多云、SaaS 应用程序和边缘站点——这也因此带来了延迟、移动应用与用户侧数据。这种分散化现象要求数据必须能够在必要时跟随应用程序进行移动:只有当存储层可以部署在不同的环境中,并且能够正确、透明地管理和移动数据,无缝移动才有可能实现。此外,数据存储层应与基础架构的其他部分一样具有弹性,能够动态分配资源,并在任务完成后迅速释放资源,让存储能够在任何特定环境中同应用一起扩缩容。

效率

传统的商用存储在资源利用和 I/O 处理方面非常高效。然而,由于商用存储软硬件专为相对静态和偏向长期保存数据的物理和虚拟化环境而设计,这种方案在支持短暂、动态的容器环境时,运行效率略显不足。

K8s 原生存储更适合容器环境,但与传统存储相比,K8s 原生存储相对不够成熟,尚难以达到物理/虚拟化环境中商用存储的运行效率。影响存储效率的因素有很多,包括架构和底层硬件性能,以及擦除编码、压缩、重复数据删除等数据占用优化(Data Footprint Optimization)功能。

可管理性

K8s 存储有许多开发人员和工程师用户,他们需要通过 API 自行配置和使用存储。这要求 K8s 存储具备易用性和自助服务功能。除了这种编程式访问,存储方案也需要照顾到传统架构的存储管理员,为他们提供熟悉的图形用户界面用于管理。此外,可管理性还要求存储系统与 K8s 生态系统易于集成,包括备份、监控、仪表板和其他第三方操作或管理系统。

性能

无论容器在哪里运行,如果存储性能不佳,用户体验都会大打折扣。性能是以 IOPS、延迟和吞吐量来衡量的,这些很大程度上是由底层硬件决定的。在多数情况下,如本地部署和边缘环境,管理员可以控制底层硬件;而在云环境中,尤其是当客户间共享硬件时,性能往往是不透明且难以保证的。因此,用户选择在哪个存储平台运行应用程序时,性能是一个重要的考虑因素。

关键指标:影响特性的重要产品能力

基于这些存储特性,GigaOm 将其影响因素分为三类:标准能力(Table Stakes)、关键差异能力(Key criteria)和新兴技术支持能力(Emerging technologies)。

  • 标准能力:在 K8s 存储领域被广泛采用并良好应用的特性和功能。这些能力已经较为成熟,因此不会对产品特性/方案价值产生较大影响,对总拥有成本(TCO)和投资回报率(ROI)的影响也微乎其微。
  • 关键差异能力:是 K8s 存储领域的核心差异化特征,是决定产品之于企业是否有价值的重要能力。这些能力的实现细节会直接影响产品/服务,从而给企业基础设施、流程和业务带来深远影响。随着时间的推移,一些关键差异能力可能会随着产品迭代,变成该领域产品的标准能力。
  • 新兴技术支持能力:指在未来 12 至 18 个月内,在 K8s 存储领域出现的最具吸引力和潜在影响力的技术。一些高端产品可能已经为解决具体场景问题准备了这些新兴功能,但当前技术还不够成熟,不能被视为关键标准。
     

标准能力:CSI 兼容性、快照功能、运行和数据安全、云和平台支持

CSI 兼容性

CSI 规范并不要求插件支持规范中的所有功能,但至少需要支持的基本功能包括:

  • 卷的静态与动态置备。
  • 创建和删除快照。
  • 卷扩展和卷克隆(基于卷或快照)。
  • 支持四种 CSI 访问模式(RWO、ROX、RWX 和 RWOP),用于管理集群中跨节点和 Pod 的读/写操作。

快照功能

基本能力应包括数据移动功能,即可以基于卷和快照及其持久化存储,创建应用程序的克隆和副本。除了存储阵列上的持久化存储卷,快照操作还应能捕获 K8s 对象和资源(包括部署、服务、持久卷、ConfigMaps、机密、标签和命名空间)。

此外,为了实现备份、灾难恢复和迁移,将快照移动到异地(云或企业外)的能力也被评估为一项基本能力,但不包含实施和平台支持能力(将快照传输到远程存储集群或对象存储)。

运行和数据安全

K8s 存储应具备合适且可同时支持本地和云环境安全的功能特性。基本能力应包括:

  • 数据加密:当数据在静态和传输过程中处于加密状态,用户可以在云中使用 Kubernetes 或托管平台,而不会面临物理存储或服务提供商相关的安全风险。目前,一些 K8s 原生存储方案实现了加密密钥的一致管理,让卷能够在各个环境(本地和云)使用客户管理的加密密钥。
  • 自带密钥:存储方案应支持第三方密钥管理系统,具备自带密钥的能力,以防止存储供应商访问客户的数据。
  • 基于角色的访问控制(RBAC):根据角色为用户和管理员提供不同级别的访问权限和可见性,帮助企业更严格地控制访问管理原则以及身份验证和授权,同时向更多用户(包括软件开发人员和数据工程师)开放访问权限。与目录服务的集成以及使用 Kubernetes 本机结构实施 RBAC 的能力是一个关键的差异化因素。
  • 勒索软件保护:存储解决方案必须支持基本的勒索软件保护功能,包括保留策略锁、快照不变性和异常检测。

云和平台支持

成功部署 K8s 的关键在于存储层能够跟随数据移动。GigaOm 希望存储方案能够以多种方式部署,并拥有广泛的平台/部署环境支持,包括企业内部、云、边缘环境以及较小的独立服务提供商。部署应实现标准化和自动化,从而降低在新位置部署存储的难度,这种能力具体包括支持集成到 Kubernetes 服务、Helm 图表或虚拟设备中,以及能够简化部署和生命周期管理的能力。

关键差异能力:原生存储集成、数据复制服务、数据占用优化、自动监控 & 可视化洞察、开发人员使用支持

原生存储集成

CSI 规范非常详尽,包括许多用于存储管理的高级功能,但很多都不强制供应商提供,一些存储方案中包含的高级功能也不是 CSI 规范的一部分。为此,存储厂商只能在其 CSI Driver 上创建额外的插件,帮助他们将自研的高级功能集成到 K8s 集群中。(GigaOm 注明,这一能力的评估重点是为 K8s 集群和用户提供原生功能的能力,而不是功能本身。)

CSI 插件应具备的差异性功能包括:

  • 支持块卷(在容器中显示为块设备)和文件卷(在容器中显示为目录)。
  • 更多快照功能,包括还原快照以代替原始卷,以及在一致性组中维护崩溃一致性卷组,以确保数据卷、Pod 和应用程序之间的数据一致性,从而实现快照、副本、容灾和备份与恢复。
  • 支持同步和异步复制,允许工程师和开发人员使用供应商的原生复制技术复制(组)卷,包括启动应用程序和在目标集群中创建 PV 对象(代表复制的卷)。
  • 自动从存储系统向 Kubernetes API 传递有关存储层或存储类的信息——NVMe、SSD、HDD 等。
  • 对对象和资源(包括部署、服务、持久卷、配置映射、机密、标签和命名空间)的原生支持。这反映了厂商对 K8s 元数据模型的深刻理解,以及捕获这些信息作为快照和副本的一部分的能力。
  • 协议级验证和授权,包括 RBAC 和配额。
  • 支持对卷进行多路径管理,支持故障切换。

数据复制服务

数据复制服务包括同步和异步复制、容灾、故障恢复后回切和再保护工作流,以及备份和恢复功能。这里主要关注数据迁移、数据复制管理等支持能力的广度和深度。

要想充分发挥 K8s 的优势,关键要解决数据固有惰性的问题。为了在不同环境的不同存储系统之间移动数据,需要特定的数据移动功能。远程复制功能是数据保护和灾难恢复的基础,还能缩短将工作负载迁移至云的时间。远程复制有两种方式:同步复制和基于快照的异步复制。在这两种情况下,目标站点都需要一个类似的存储集群。

这些技术有多种用例,包括备份和容灾,以防止内部站点或云可用区域出现故障和故障恢复情况。此外,这些技术还可实现数据迁移和移动功能,在企业内部、云、边缘和其他位置之间逐步无缝迁移数据。除了底层复制技术,这些用例还需要工作流和特定的用户界面,这也是该关键能力的一部分。

具体就数据保护而言,理想的 K8s 原生存储方案应使用基于存储的快照(通过 CSI 或其他方式支持 Kubernetes)并捕获完整 Kubernetes 元数据状态和应用对象。

数据占用优化

数据占用优化即使用各种技术来避免存储后端出现数据重复和数据碎片,如自动存储分层、删除重复数据、擦除编码、压缩数据和其他数据放置优化技术。这些技术可提高数据占用效率,进而防止成本增加、性能降低和可扩展性变差。

不过,大多数 K8s 原生存储方案还未实现与传统存储相同的全面数据占用优化方案。未来,容器部署将持续增长,欠缺数据占用优化功能或功能较差的 K8s 存储将难以满足未来的存储需求。

自动监控 & 可视化洞察

比起标准的监控和警报功能,具备强大分析功能的存储方案更具优势——既可让企业快速分析整个基础架构的状态,在问题出现之前发现问题,还可为基础架构提供强大的安全性和容量优化能力。

这一关键能力主要关注产品的自动监控与可视化功能是否可以做到“开箱即用”,包括是否将自动监控与可视化功能与 Prometheus 和 Grafana 集成,以及这两个工具对存储环境的探测/可视化程度有多深(阵列级、集群级、卷级和应用级)。此外,理想的存储方案还能让管理员从存储角度了解 K8s 应用的对象拓扑,包括持久卷和声明,以及供应商存储系统中的原生对象,如 LUN 或文件共享。

最后,由于 K8s 正在使基础架构对开发人员和工程师越来越友好,成本控制是任何一个 K8s 存储方案都应具备的关键能力,这其中也包括在各环境部署卷、存储和应用的成本可见性。

开发人员使用支持

K8s 存储应为开发人员的使用提供一流的支持,让他们使用熟悉的工具与存储系统进行交互,这意味着存储系统需要与 API 集成,并支持通过 K8s API、命令行工具和基础架构即代码(IaC)工具,以按需自助的方式实现访问和管理。

存储管理员应能通过存储类为 K8s 定义并公开高级存储功能(如性能、复制、快照计划等),让开发人员能够使用这些特性。为保证系统性能、管理成本,管理员应能通过配额和 QoS 功能限制专用于特定存储类、应用或集群的资源数量。

新兴技术支持能力:边缘应用与管理、对象存储和多协议支持、高性能存储

边缘应用与管理

很多已经在边缘部署 K8s 集群的企业,面临着如何管理数量多规模小的集群、使用集中式蓝图或模板简化集群创建并保持一致性等挑战。K8s 存储应在边缘场景得到使用,提供原生存储管理的能力(包括数据在边缘集群和中心集群间复制的基本和高级功能),同时支持没有稳定互联网链路的站点或处于安全保护下的环境。

对象存储和多协议支持

由于对象存储通常都用于云服务,它既不是 K8s 集群基础设施的一部分,也不容易在应用程序的 YAML 定义中看到。K8s 社区正在开发容器对象存储接口(COSI),未来的存储应能够支持这一接口。此外,针对托管数据库服务也有类似的项目,让 K8s 可以对接云托管、云管理服务等。

高性能存储

随着 NVMe 以及更快速、先进的存储技术逐渐成熟,K8s 存储方案也应利用这些技术优化 I/O 路径,从而减少延迟、提高吞吐量。

除了以上产品能力,厂商对 K8s 的原生支持能力也会直接影响存储方案的实际表现。目前,对于 K8s 原生存储,用户可以选择开源产品(以 Rook(基于 Ceph)和 Longhorn 为代表),也可以采用闭源商用产品(以 Portworx 和 IOMesh 为代表)。这两种方案都能提供 K8s 原生的数据存储功能,也各有利弊:开源产品没有采购成本,定制更灵活,具有技术实力的客户可以自行开发,但若出现严重故障或漏洞,很难像商业厂商那样通过专业团队提供快速响应、深度解决问题的服务支持。另外,通过性能测试可以看出,目前基于自研闭源技术的 K8s 存储方案,在性能和稳定性方面要优于开源产品。欲了解测试详情,请阅读:主流 K8s 持久化存储方案特性与性能对比(Longhorn / Rook / OpenEBS / Portworx / IOMesh)。

交叉分析:能力对特性的影响程度

基于以上特性与能力解读,GigaOm 对不同的关键差异能力在多大程度上影响 K8s 存储产品的哪些特性,进行了交叉分析(如下图)。建议用户结合企业 K8s 存储使用情况,评估最为看重的产品特性,并在选型时重点关注对这些特性带来较大影响的产品能力(例如,企业需要使用 K8s 原生存储承载 K8s 平台上数据库等性能要求较高的应用,则需重点关注产品的性能特性。如表中所示,对 K8s 存储性能影响最大的关键能力是“数据占用优化”、“原生存储集成”和“数据复制服务”,那么选型时应重点考虑具备这些能力的产品方案)。

02_K8s-storage-capabilities.png

注:表格左侧列为 5 项 K8s 存储关键差异能力,表格第一行为 K8s 存储关键特性,能力与特性交叉点的数字,表示该能力对这一特性的影响程度,数字越大,影响能力越大。用户解读时,既可关注某项能力会影响哪些产品特性,也可分析为了满足某一产品特性需要具备哪些关键能力。

另外,从表中不难发现,“原生存储集成”(即与 K8s 生态无缝对接的能力)是对 K8s 原生存储方案水平总体影响最大的能力,尤其是在架构优势、灵活性、可管理性和性能这些重要维度,“原生存储集成”起着至关重要的作用。正如上文所述,与 K8s 的集成程度,真正体现了一个厂商对 K8s 环境与技术的理解程度和自主研发的能力。因此,K8s 存储产品是否具备自主研发、提供多种高级功能、与 K8s 高度集成且在生产环境中顺畅应用的 CSI 支持,很大程度上反映了产品的整体价值。

作为国内首款 K8s 原生的企业级分布式存储,IOMesh 以自主研发的核心技术,可无缝融入 Kubernetes 原生的开发和运维体系,对 Kubernetes 集群内的存储资源进行整合与管理,为运行在 Kubernetes 集群上的各类有状态应用提供稳定、高性能的持久化存储资源。

除了标准能力,IOMesh 还具备多种 K8s 原生存储关键差异能力与新兴技术支持能力:

  • 原生存储集成:完全基于 Kubernetes 自身能力构建,充分利用 Kubernetes Worker 节点的硬件资源融合部署,支持动态置备,提供本地卷和多副本分布式存储卷,并提供 Kubernetes 原生的操作方式和工具。
  • 自动监控 & 可视化洞察:支持与 Kubernetes 工具链集成,支持将监控与报警功能集成进 Prometheus 和 Grafana ,提供可视化监控数据与报警提醒。
  • 开发人员使用支持:使用 Kubernetes Operator 统一运维,基于 Helm Chart 部署,提供声明式 API 管理能力,加快部署与扩容。
  • 高性能存储:通过 I/O 本地化、冷热数据分层、全闪存支持、扩展的 Local PV 等技术优化,提供高性能与低延时。
  • 边缘应用与管理:可完美融入用户基于 K8s 构建的边缘应用,支持 IT 客户构建边缘计算解决方案。

欲深入了解 IOMesh 技术特性,您可阅读博客、观看产品解读视频,或点击获取《IOMesh 用户指南》。

参考文章:

1. Key Criteria for Evaluating Kubernetes Data Storage Solutions v4.0,GigaOm,2023

https://research.gigaom.com/report/key-criteria-for-evaluating-kubernetes-data-storage-solutions/

相关文章:

一文了解评估 K8s 原生存储产品需要关注的关键能力

近些年,越来越多的企业使用 Kubernetes(K8s)支持生产环境关键业务。这些业务往往对存储性能和稳定性具有更高的要求,传统存储方案难以充分满足,因此不少用户开始关注更契合 K8s 环境的 K8s 原生存储方案。 不过&#…...

linux免密登录报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf

问题:权限不对的 解决: 1.检查文件的所有者和权限。 确保文件的所有者是正确的。 运行以下命令来确定文件的所有者和权限: ls -l /etc/ssh/ssh_config.d/05-redhat.conf 通常情况下,SSH配置文件应该属于root用户。如果所有者不是…...

Kafka常用参数

文章目录 概要broker端参数producer端参数consumer端参数 概要 kafka broker、consumer、和producer都有很多可配置的参数。本文主要总结日常开发中常用到的参数。其中producer端可以在org.apache.kafka.clients.producer.ProducerConfig 中找到配置项,consumer端可…...

NFT Insider#105:The Sandbox即将参加韩国区块链周,YGG的声誉和进步(RAP)将引领玩家晋升到下一层级

引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…...

TCP socket error (The proxy type is invalid for this operation).

“TCP socket error (The proxy type is invalid for this operation)” 错误通常是由于使用了无效的代理类型导致的。在使用QModbusTcpClient连接Modbus TCP设备时,如果您没有配置代理服务器,或者配置的代理类型不正确,就会出现这个错误。 …...

根据需求生成一个Vue模块的类图示例

以下是一个Vue模块的类图示例: ------------------------ | VueModule | ------------------------ | -name: string | | -data: object | | -methods: object | | -computed: object | | -watchers: object | ---…...

C# 类class、继承、多态性、运算符重载,相关练习题

34.函数重载 /*函数重载您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。下面的实例演示了几个相同的函数 Add(),用于对…...

Mysql高级(进阶)SQL语句

目录 常用查询 按关键字排序 区间判断及查询不重复记录 对结果进行分组 限制结果条目 设置别名(alias —— as) 通配符 子查询 MySQL视图 NULL 值 连接查询 常用查询 (增、删、改、查) 对 MySQL 数据库的查询&#xf…...

java八股文面试[JVM]——JVM性能优化

JVM性能优化指南 JVM常用命令 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target system. The command is limited to reporting information on JVMs for which it has the access permissions. jinfo (1)实时…...

联发科MTK6762/MT6762核心板_安卓主板小尺寸低功耗4G智能模块

MT6762安卓核心板是一款基于MTK平台的高性能智能模块,是一款工业级的产品。该芯片也被称为Helio P22。这款芯片内置了Arm Cortex-A53 CPU,最高可运行于2.0GHz。同时,它还提供灵活的LPDDR3/LPDDR4x内存控制器,此外,Medi…...

Redis未授权访问漏洞复现

Redis 简单使用 Redis 未设置密码,客户端工具可以直接链接。 Redis 是非关系型数据库系统,没有库表列的逻辑结构,仅仅以键值对的方式存储数据。 先启动容器 Redis 未设置密码,客户端工具可以直接链接 https://github.com/xk11z/…...

用深度强化学习来玩Flappy Bird

目录 演示视频 核心代码 演示视频 用深度强化学习来玩Flappy Bird 核心代码 import torch.nn as nnclass DeepQNetwork(nn.Module):def __init__(self):super(DeepQNetwork, self).__init__()self.conv1 nn.Sequential(nn.Conv2d(4, 32, kernel_size8, stride4), nn.ReLU(inp…...

HTML5-4-表单

文章目录 表单属性表单标签输入元素文本域(Text Fields)密码字段单选按钮(Radio Buttons)复选框(Checkboxes)按钮(button)提交按钮(Submit)label标签 文本框(textarea&am…...

Nacos 开源版的使用测评

文章目录 一、Nacos的使用二、Nacos和Eureka在性能、功能、控制台体验、上下游生态和社区体验的对比:三、记使使用Nacos中容易犯的错误四、对Nacos开源提出的一些需求 一、Nacos的使用 这里配置mysql的连接方式,spring.datasource.platformmysql是老版本…...

【Linux】一些常见查看各种各样信息的命令

Linux命令 find命令,用来查找文件。常用的按照名字查找-name,按照文件类型查找-type,linux常用的文件类型有七种,普通文件,目录文件,管道,套接字,软链接,块设备&#xf…...

51单片机DHT11温湿度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机DHT11温湿度控制系统仿真设计 1.主要功能:2.仿真3. 程序代码4. 原理图元器件清单5. 设计报告6. 设计资料内容清单&下载链接 51单片机DHT11温湿度控制系统仿真设计( proteus仿真程序原理图报告讲解视频) 仿真图proteus8.9及以上 程序编译器&…...

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

毫无疑问,Python 是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python 从 入门到精通只需要一个月…...

详解4种类型的爬虫技术

聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序,而通用网络爬虫则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。 增量抓取意…...

QTday1基础

作业 一、做个QT页面 #include "hqyj.h"HQYJ::HQYJ(QWidget *parent)//构造函数定义: QWidget(parent)//显性调用父类的有参构造 {//主界面设置this->resize(540,410);//设置大小this->setFixedSize(540,410);//设置固定大小this->setWindowIcon(QIcon(&q…...

activiti 通过xml上传 直接部署模型

通过流程xml 直接先发布模型,然后再通过发布模型之后的流程定义获取bpmn model来创建Model. 1、通过xml先发布模型 InputStream bpmnStream multipartFile.getInputStream() deployment repositoryService.createDeployment().addInputStream(multipartFile.getO…...

算法题打卡day56-编辑距离 | 583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作 - 力扣(LeetCode) 状态:查看思路后AC。 和查找子序列的操作类似,但是考虑的是删除操作。代码如下: class Solution { public:int minDistance(string word1, string word2) {int len1 wor…...

SQL中的CASE WHEN语句:从基础到高级应用指南

SQL中的CASE WHEN语句:从基础到高级应用指南 准备工作 - 表1: products 示例数据: 我们使用一个名为"Products"的表,包含以下列:ProductID、ProductName、CategoryID、UnitPrice、StockQuantity。 -- 建表 CREATE TA…...

超时取消子线程任务

文章目录 前言一、编码思路二、使用步骤直接上代码 总结 前言 问题背景: 主线程需要执行一些任务,不能影响主任务执行,这些任务有超时时间,当超过处理时间后,应该不予处理;如果未超时,应该获取到这些任务的执行结果; 一、编码思路 由于主线程正常执行不能影响,任务会处理很久…...

模块化---common.js

入口文件:app.js // require是同步加载 // 客户端:common.js的模块化,需要browserify编译之后才能使用 // 服务端:运行时同步加载,无问题 let module1 require(./module1.js) let module2 require(./module2.js) co…...

VSCode下载、安装及配置、调试的一些过程理解

第一步先下载了vscode,官方地址为:https://code.visualstudio.com/Download 第二步安装vscode,安装环境是win10,安装基本上就是一步步默认即可。 第三步汉化vscode,这一步就是去扩展插件里面下载一个中文插件即可&am…...

KC705开发板——MGT IBERT测试记录

本文介绍使用KC705开发板进行MGT的IBERT测试。 KC705开发板 KC705开发板的图片如下图所示。FPGA芯片型号为XC7K325T-2FFG900C。 MGT MGT是 Multi-Gigabit Transceiver的缩写,是Multi-Gigabit Serializer/Deserializer (SERDES)的别称。MGT包含GTP、GTX、GTH、G…...

前端代码优化散记

把import Button from xxx 的引入方式,变成import {Button} from xxx 的方式引入,以利于按需打包。原生监听事件、定时器等,必须在componentWillUnmount中清除,大型项目会发生内存泄露,极度影响性能。使用PureComponen…...

HTML <map> 标签的使用

map标签的用途&#xff1a;是与img标签绑定使用的&#xff0c;常被用来赋予给客户端图像某处区域特殊的含义&#xff0c;点击该区域可跳转到新的文档。 编写格式&#xff1a; <img src"图片" border"0" usemap"#planetmap" alt"Planets…...

stable diffusion实践操作-大模型介绍

本文专门开一节写大模型相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型下载网站 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https://civitai.com&#xff08;科学上网&#xff09; 一、发展历…...

W5500-EVB-PICO进行MQTT连接订阅发布教程(十二)

前言 上一章我们用开发板通过SNTP协议获取网络协议&#xff0c;本章我们介绍一下开发板通过配置MQTT连接到服务器上&#xff0c;并且订阅和发布消息。 什么是MQTT&#xff1f; MQTT是一种轻量级的消息传输协议&#xff0c;旨在物联网&#xff08;IoT&#xff09;应用中实现设备…...