GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通

这篇具有很好参考价值的文章主要介绍了GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

云计算时代,数仓能为我们带来哪些便利?GaussDB(DWS)即将发布的云原生数仓如何构筑新一代数据仓库的技术底座,在云原生数仓的地基之上,数据时代的产业又将如何扩张、拓展?在本文中我们将带您解密华为云新一代云数仓 GaussDB(DWS) 3.0 的核心技术与划时代意义。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB


声明:本文由作者“白鹿第一帅”于 CSDN 社区原创首发,未经作者本人授权,禁止转载!爬虫、复制至第三方平台属于严重违法行为,侵权必究。亲爱的读者,如果你在第三方平台看到本声明,说明本文内容已被窃取,内容可能残缺不全,强烈建议您移步“白鹿第一帅” CSDN 博客查看原文,并在 CSDN 平台私信联系作者对该第三方违规平台举报反馈,感谢您对于原创和知识产权保护做出的贡献!

文章作者:白鹿第一帅,作者主页:https://blog.csdn.net/qq_22695001,未经授权,严禁转载,侵权必究!

一、关于数据仓库需求场景分类

数据仓库是一个用于存储大量结构化和非结构化数据的集中式数据存储区域。它旨在帮助组织更好地理解其数据并支持决策制定过程。数据仓库通常由多个数据源提供数据,并使用 ETL(提取,转换,加载)过程将这些数据集成到一个单独的位置中。数据仓库通常用于支持商业分析、数据挖掘、业务智能和决策制定。

数据仓库的重要性在于它提供了一种将数据从各种来源集成到单个位置的方法。这使得对整个组织的数据进行分析和报告变得更加容易。数据仓库还可以帮助组织更好地了解其数据模型,从而更好地规划未来的 IT 项目。使用数据仓库可以提高组织的数据质量、数据集成能力和数据分析能力,从而提高组织的效率和决策质量。

我们将数据仓库需求场景分为两类,分别是线下部署场景公有云场景

二、数据仓库线下部署场景

2.1、线下部署场景介绍及优劣势说明

数据仓库的线下部署场景是指将数据仓库部署在本地服务器或数据中心的情况。适用于需要访问敏感数据或需要高度定制化的企业系统。

  • 优势:线下部署可以提供更高的安全性和数据隐私保护,因为数据不需要通过互联网传输,而是在公司的内部网络中处理。
  • 劣势:通常需要专业的 IT 团队来管理和维护服务器、网络和软件,以确保数据仓库正常运行并满足业务需求。

2.2、线下部署场景对应的客户需求

线下部署场景客户需求,主要集中在以下几点:

  • 稳定、隔离。如在金融行业中第一要求就是系统是稳定的,并且负载之间具有比较好的隔离能力,系统之间的影响是比较小的。
  • 数据共享(含湖仓一体)
  • 弹性

三、数据仓库公有云部署场景

3.1、公有云部署场景介绍及优劣势说明

数据仓库需求场景的公有云场景是指将数据仓库部署在公有云中的场景。其中,公有云指的是由第三方服务商提供的云计算基础设施,例如亚马逊云服务(AWS)、微软云服务(Azure)、谷歌云平台(GCP)等。

公有云部署场景具备的优势集中在以下几点:

  • 弹性伸缩:公有云提供强大的弹性伸缩能力,可以根据实际需求灵活扩充或缩减计算和存储资源,而无需担心硬件设备和系统软件的更新维护问题。
  • 高可用性:公有云提供多区域部署,可以做到容灾和数据备份,保证数据的高可用性。
  • 管理简单:公有云提供了全套的云端管理服务,包括监控、日志、备份、自动化部署等。这些服务可以降低数据仓库运维的复杂性,提高数据仓库运行效率和稳定性。
  • 降低成本:公有云采用按需计费的模式,能够根据实际使用情况灵活调整资源,降低了企业的成本。

公有云部署场景面临的劣势集中在以下几点:

  • 安全性问题:部分企业存在数据安全和隐私保护的顾虑,担心采用公有云会导致数据被泄露和攻击等问题。因此,需要严格的数据安全策略和监测手段。
  • 可控性问题:公有云中数据仓库的运行状态和系统配置等由云服务商托管,企业并不能完全掌控,因此需要与云服务商进行密切合作。
  • 稳定性问题:公有云的稳定性和服务质量会受到云服务商的影响,如果云服务商的服务出现问题,可能会导致数据仓库的运行受到影响。
  • 依赖互联网:公有云场景需要依赖互联网,如果网络不稳定或有意外中断,可能会影响数据仓库的使用和管理。

3.2、公有云部署场景对应的客户需求

公有云部署场景客户需求,主要集中在以下几点:

  • 成本。客户希望成本能够随着业务曲线变化也能动态变化,负载低的时候成本能够降下来,负载高的时候,成本可以做相应的提升,成本能够跟业务量有正比的关系,而不是固定成本,具体如下图所示:

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB

  • 灵活、实时弹性。对弹性的要求更加实时,收到系统告警之后能够马上对服务的吞吐或并发做弹性扩容。
  • 数据共享(含湖仓一体)。很多客户在建设数据处理技术站的时候会和大数据一起建设,大数据作为数据旅程的一部分,在不同的处理环节使用的是不同组件,既有湖仓一体的诉求,也有本身数仓的数据共享诉求。

四、为何重视数据共享(含湖仓一体)?

4.1、传统数据共享业务场景

业务场景:客户搭建一套系统,上面跑一个业务 1,里面有一些数据。现在客户需要新上一个业务 2,传统做法就是把这个新作业加到这个原来系统 A 上,但是原来这个系统可能撑不住,原因可能是并发数、吞吐,或者其他原因。这个时候我们需要对系统做扩容,但是仅扩容单个集群,节点到一个规模的时候线性比的提升并不明显,尤其是并发很高的时候,单纯的增加节点并不能够很好的解决问题。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
传统措施:这个时候我们需要搭建一个系统,用一个新系统服务新业务,新业务可能要访问业务 1 数据,就会把业务 1 的数据复制一份放到这个数据 2,类似于读写分离,但是这样的话会造成以下问题:

  • 系统扩展性弱,通过数据 copy 实现数据共享。
  • 系统间存在大量的数据冗余,甚至不一致。
  • 系统间存在大量的数据传递。

4.2、数据共享(含湖仓一体)能力解决掉的问题

为了规避掉上述问题,我们采用数据共享(含湖仓一体)能力,其具备的优势有以下几点:

  • 一份数据支持不同业务访问,数据零 copy。快速、敏捷支持新业务上线。
  • 业务之间具备良好的隔离能力,性能稳定。

不同的场景对需求的优先级是不一样的,我们数仓要考虑在面对这两类不同的场景的时候,怎么用一套数仓的价格去解决这个问题,这是在需求场景上我们看到的一些变化。

五、数据仓库技术架构演进

5.1、Shared Storage 架构

早期的数仓,就挂了一个共享存储,我们称其为 Shared Storage。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
特点:共享存储和状态,计算节点像访问单机一样访问最新的全局数据
优点:无需数据分片,无需分布式 plan 执行,对业务透明。
缺点

  • 计算节点需要引入协调机制(cache 同步),保证数据的一致性,扩展性有上限。
  • 单个 SQL 无法利用所有计算节点的扩展能力

5.2、Shared Nothing 架构

后面又出了这种 Shared Nothing 架构,像 GaussDB 十几年前刚开始做的时候,也是这么一个架构。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
特点:一种分布式计算架构,CPU、内存、磁盘等资源都是私有的,整个系统中不存在共享资源,每个节点只处理自己分片的数据,没有单点的竞争。
优点:扩展性好。
缺点

  • 计算存储耦合,需要同时扩容,不够灵活。
  • 扩容需要较长的数据重分布时间。

5.3、存算分离架构

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
特点:存储类似 Shared Storage,计算类似 Shared Nothing,每个节点只处理自己分片的数据。
优点

  • 计算存储分层扩展,计算节点扩容无需数据重分布,速度快,灵活;存储节点按需扩容,无限容量。
  • 计算节点之间无需协调机制,只需保证计算节点只处理自己分片的数据。

六、GaussDB(DWS)演进历程

我们先回顾一下 DWS 演进历程,具体如下图所示:

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
GaussDB(DWS)在十年前就开始在做了,当时是针对于线下的这种场景,采用的就是 Shared Nothing 架构,在14年之前主要是做数仓里面比较通用的技术,包括分布式的执行、现代化引擎、列存储机制,后面开始在大行里面做连创,就遇到了更多的产品化的需求,包括这种大集群的通信、负载管理以及怎么跟用户这种大数据的生态做互通等等,再到后面随着市场的推广越来越多,就有更多产品化诉求和企业级特性诉求。在 2020 年的时候开始做 DWS,内部叫 3.0 版本,主要就是一个云原生数仓,也是我们本文将要给大家分享的内容。

七、DWS 云原生架构技术解析

7.1、极致弹性、数据共享、高灵活度、高性价比

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
三层解耦

  • 管理层,计算层,存储层独立灵活伸缩。
  • 计算资源以逻辑集群方式组织。

灵活弹性

  • 分钟级单逻辑集群扩缩容。
  • 分钟级快速创建销毁逻辑集群。
  • 快速扩缩容,无数据重分布、拷贝。

一数多用

  • 任意逻辑集群均可承载读写负载。
  • 多逻辑集群间共享数据,无需拷贝。
  • 提供跨逻辑集群建的同时和近实时两种数据共享方式。

按需配置

  • 逻辑集群隔离不同业务。
  • 业务承载量/并发量的线性扩展。
  • 读写分离、不同负载隔离。

7.2、按需弹性实践适应灵活多变的业务需求

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
我们把弹性需求可以分成两大类:一类就是较长周期,随着公司业务的增长逐渐增加的;另外一种是短周期的,可能每天都在变,或者是每天的同时间点的业务负载都不一样,像对于这种比较稍微长周期或者稳态一点的业务,可以用这种在单位 vw 内增加计算资源的方式去来承载。

7.3、湖仓一体,与大数据互联互通

在湖仓一体上进一步增强体验,使用大数据的生态更加简单、维护代价更低,体验横向融合分析。

传统的维护,当外表的数量是一张、两张的时候还比较好维护,当外表有有成千上万张的时候就比较麻烦,你首先要把这些外表都创建出来,其次如果大数据这边把表的结构改了,不管是改了字段的类型或者是新加了字段,外表都需要做同步的维护,维护的代价就会高,而新的湖仓一体就完美解决掉了这个问题。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
无缝访问数据湖

  • 对接 Hive Metastore 元数据管理,直接访问数据湖的数据表定义。
  • 支持主要数据格式:ORC、Parquet、Hudi、Carbon。

融合查询

  • 混合查询数据湖和仓内的任意数据。
  • 查询一步到位输出到仓内/数据湖,无需额外数据中转拷贝。

极致查询性能

  • 使用数仓高质量的查询计划和高效的执行引擎。
  • 使用数仓的负载管理手段,精准控制。

7.4、数据生产线与 AI 生产线的高效配合

AI 有自己的一套系统,即 ModelArts,数据是 DWS,AI 如何访问到 DWS 的数据,DWS 又该如何利用 ModelArts 的模型?主要就是解决这两个问题。数据共享我们可以把数据都放到 obs上去,用开放的格式,这样数据共享的问题就比较好解决;在 AI 模型这方面,我们通过在 DWS 里面写 SQL的形式去使用 ModelArts 的 AI 能力。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
数据生产线→AI 生产线:无缝数据通路

  • 面向批量生产:通过 OBS 共享开放格式数据。
  • 面向快速开发:通过 ConnectorX 等以查询取数的方式嵌入 Python 开发生态,重点是 Pandas。

AI 生产线→数据生产线: AI for Data

  • 提供 SQL 语法,在数据分析过程中提供驱动 AI 训练、应用 AI 推理的能力。
  • 将推理能力引入分析:直接调用部署的推理服务端点,灵活性好;将模型二进制部署为 UDF,性能好。

7.5、灵活可配的性能优化选择

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
在性能方面,存算分离之后关心的就是计算存储,保证性能主要的手段有冷热分区高效缓存、近数据计算和大带宽云存储三个方面,我们来看下图这个效果是非常显著的。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB

7.6、提供按需权衡、灵活可配的缓存

系统会把 obs 上的数据缓存到本地,解决很多性能的问题,缓存现在支持大小可配,想获得更好的性能可以多买一点本地缓存,如果对这个性能没有太高诉求,可以少买,成本完全由自己决定。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB
无缝配合缓存

  • 热数据优先缓存,使用本地的算子下推能力。
  • 冷数据优先下推,使用云存储的近数据计算资源池。

近数据计算

  • 将数据下推到云存储,显著降低数据读取量。

7.7、深度优化存算分离架构

计算和存储分离之后,这种时延天然存在,物理上是不可避免的,在这种时延下,如果不做任何优化,性能肯定会下降,所以在这里做了一个通过并发来换取带宽的手段,虽然单线程作 IO,延迟变高,但是可以开更高的并发的,来把 obs 带宽打满。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB

  • 更低时延:充分利用云存储的带宽优势,弥补其相较传统 MPP 的高延迟劣势。
  • 更优资源调度:单查询充分利用资源,为并发查询提供稳定、可预测的性能保证。
  • 更灵活配置:多级资源池灵活配置。

文章作者:白鹿第一帅,作者主页:https://blog.csdn.net/qq_22695001,未经授权,严禁转载,侵权必究!


总结

传统数据仓库常常需要企业投入大量人力、物力和财力进行维护和升级等工作,这不仅耗时耗力,而且容易带来安全和风险问题。GaussDB (DWS) 云原生数仓利用云计算、自动化和管理工具等技术,可以降低企业的成本和风险,同时提升数据仓库的质量和效率。数字化转型是企业发展的必由之路,而数据仓库是数字化转型的重要基础设施。GaussDB (DWS) 云原生数仓的发展将为企业提供更全面、更优质、更高效的数据处理和分析能力,有助于企业更快速地实现数字化转型,更好地应对市场变化和竞争挑战。

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通,企业级分布式架构方案与实践,开源社区与技术测评(开源布道师),企业级开发业务解决方案,白鹿第一帅,云原生,云原生数仓技术解析,湖仓一体,大数据,GaussDB(DWS),GaussDB


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-726105.html

到了这里,关于GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于postgresl的gaussDB(DWS)地址省市区解析函数

    地址格式为: 省(自治区,直辖市)、市、区。 直辖市的地址格式为, 北京市北京市海淀区xxxxx。 若是北京市海淀区xxx,自己改改就可以了 采用的是笨办法,穷举。 涉及的两个主要内置函数。 1. instr( start_position ,\\\'str1\\\' , \\\'str2\\\' , times) 。 查找str2在str1出现的位置。num是出现的次

    2024年02月15日
    浏览(37)
  • 理论+示例,详解GaussDB(DWS)资源管理

    摘要: 合理地管理和分配系统资源,是保证数据库系统稳定高效运行的关键。 本文分享自华为云社区《GaussDB(DWS)资源管理能力介绍与应用示例》,作者: 门前一棵葡萄树 。 数据库运行过程中使用的公共资源包含:系统资源(CPU、内存、网络等)和数据库共享资源(锁、计数

    2024年02月08日
    浏览(38)
  • GaussDB(DWS)网络流控与管控效果

    摘要: 本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证。 本文分享自华为云社区《GaussDB(DWS)网络流控与管控效果》,作者:门前一棵葡萄树。 上一篇博文GaussDB(DWS)网络调度与隔离管控能力,我们详细介绍了GaussDB网络调度逻辑,并简单介绍了如何应用网络隔离

    2024年02月02日
    浏览(36)
  • GaussDB(DWS)查询过滤器原理与应用

    摘要: GaussDB(DWS)查询过滤器(黑名单)提供查询过滤功能,支持自动隔离反复被终止的查询,防止烂SQL再次执行。 本文分享自华为云社区《GaussDB(DWS)查询过滤器原理与应用》,作者:门前一棵葡萄树 。 GaussDB(DWS)查询过滤器(黑名单)提供查询过滤功能,支持自动隔离反复被

    2024年02月08日
    浏览(53)
  • GaussDB(DWS)中的分布式死锁问题实践

    本文分享自华为云社区《GaussDB(DWS)中的分布式死锁问题实践》,作者: 他强由他强 。 分布式死锁是相对于单机死锁而言,一个事务块中的语句,可能会分散在集群里多个节点(CN/DN)执行,在不同节点上可能都会持有锁,当并发事务进行时可能会导致分布式(全局)死锁,

    2024年02月04日
    浏览(39)
  • GaussDB(DWS)字符串处理函数返回错误结果集排查

    摘要: 在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。 本文分享自华为云社区《GaussDB(DWS)字符串处理函数返回错误结果集排查》,作者: -CHEN111- 。 在使用字符串处理函数时,有时会出现非预期结果的场景。

    2024年02月03日
    浏览(46)
  • GaussDB(DWS)条件表达式函数返回错误结果集排查

    摘要: 条件表达式函数中出现结果集不一致问题,我们首先要考虑是否入参数据类型不一致导致出参不一致。 本文分享自华为云社区《GaussDB(DWS)条件表达式函数返回错误结果集排查》,作者:yd_211369925 。 客户使用greatest获取并返回参数列表中值最大的表达式的值,子查询中

    2024年02月06日
    浏览(43)
  • 【GaussDB(DWS)】数据分布式存储-三种类型的表

    @toc 华为数据仓库服务DWS,集群版本8.1.3.320 集群拓扑结构: DWS采用水平分表的方式,将业务数据表的元组打散存储到各个节点内。这样带来的好处在于,查询中通过查询条件过滤不必要的数据,快速定位到数据存储位置,可极大提升数据库性能。 水平分表方式将一个数据表

    2024年02月13日
    浏览(36)
  • 前端框架技术革新历程:从原生DOM操作、数据双向绑定到虚拟DOM等框架原理深度解析,Web开发与用户体验的共赢

    前端的发展与前端框架的发展相辅相成,形成了相互驱动、共同演进的关系。前端技术的进步不仅催生了前端框架的产生,也为其发展提供了源源不断的动力。 前端,即Web前端,是指在创建Web应用程序或网站过程中负责用户界面(User Interface, UI)构建与交互的部分,是用户与

    2024年04月26日
    浏览(69)
  • GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要: 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 这种问题大部分都是因为PARTITI

    2024年02月06日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包