【数据库技术】NineData数据复制,加速实时数仓构建
8 月 30 日,由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动,引领企业智能化数据管理”的线上联合发布会,圆满成功举办!双方聚焦于实时数据仓库技术和数据开发能力,展示如何通过强大的生态开发兼容性,对接丰富的大数据生态产品,助力企业快速开展数据分析业务,共同探索实时数据驱动的未来企业智能化数据管理解决方案。
本文根据玖章算术技术副总裁陈长城(天羽)在 NineData X SelectDB 联合发布会的主题演讲内容整理。

陈长城,曾任阿里云数据库中台负责人和阿里云数据库生态工具部总经理,前阿里云资深技术专家。带领阿里云数据库基础设施完成三次架构变革,从去 IOE 到分布式、异地多活、容器化和存储计算分离,是历年双 11 大促的数据库核心负责人和容量、架构规划者。主导云原生工具体系架构升级并打造一站式管理能力。发表过多篇技术专利和 VLDB、ICDE 数据库顶会论文。
01 NineData 产品介绍
在数据和云的时代企业数字化面临诸多挑战,从 Gartner 和 Percona 的报告中,我们知道 80%以上的企业会选择多云或混合云,而超过 70%的企业会选择使用多种数据库来满足业务需求。在行业的分析报告中,我们发现,如果企业能够有效使用多源基础架构和新的数据架构,它们的创新能力和整体盈利能力将会明显提升。然而,在数据和云的时代下,企业数据管理的挑战更多,例如数据孤岛、多源异构数据管理复杂度以及开发效率等,都是急需解决的。
基于上述普遍存在的问题和挑战,玖章算术建设了 NineData 云原生智能数据管理平台。最底层 IaaS 接口层统一对接各场景的各种数据源,基于此建设 NineData 数据备份、数据复制、数据对比和 SQL 开发四大核心功能模块,与企业的数据库、搜索、消息队列、数仓等数字系统紧密联动,帮助企业保护数据资产,基于多云和混合云灵活构建基础设施,统一安全管理,提升数据库开发效率。
这里展开介绍一下 SQL 开发,它是一种让企业内外部所有开发者都遵循统一数据访问规范并提升效率的最佳实践产品化,当前企业面对多云和多种数据源,虽然各种数据源有各自的 CLI 或图形管理工具,但存在这些问题:
-
权限分散、审计欠缺,安全管控难度大 ;
-
各个工具建设程度不一,体验一般,开发效率低;
-
无法形成统一规范,数据库生产稳定性缺乏保障;
-
多环境、多种数据源无法统一管理。
针对这些问题,NineData 设计了企业级数据库安全管理能力,通过统一数据源对接各云厂商和自建的各种数据源,设计任务流和审批流、安全规则配置、权限管理与操作审计、SSO 支持等基础组件,将企业的数据(实例、库、表)+ 账号角色 + 操作类型 通过规则引擎统一管理,并内置数据库 SQL 开发的稳定性和安全最佳实践,提供数据库访问权限管理、变更管理、敏感数据管理、数据导入导出等功能。NineData 提供简单 GUI 的个人版和高效协同的企业版两种服务方式,并结合大模型 AIGC 的能力,在自然语音查询数据、表结构设计改写、SQL 优化建议方面提升开发者效率。
企业在数据复制场景下也面临着多数据源、多云数据打通、跨地域长周期复制,以及由此带来的同能和稳定性方面的问题。NineData 数据复制致力于提供数据流动的基础设施。消除不同数据库类型、不同厂商、不同环境下的造成的数据流动难点,帮助企业最大地发挥数据价值。目前 NineData 以及支持 13 种数据源的单双向链路,强劲的复制性能和完善的数据对比功能,具体将在后面展开。
02 数据复制技术架构
先介绍下 NineData 整体架构,基于多云和多源能力,我们构建了数据备份、数据复制、数据对比和 SQL 开发能力。
2.1 多云角度
从多云角度,为了帮助企业统一管理分散在多云或混合云的各种数据源,我们设计了灵活的云原生架构、容器化弹性拉起、网络架构等。
支持专属集群
支持多云的同时,我们通过专属集群的技术,能够让企业独享本身的资源。包括我们可以把企业的 worker 节点放置在企业本地或 VPC 内部,实现数据的内部闭环,提高企业数据安全和 worker 执行效率。
云原生的 SAAS 模式
NineData 作为一个云原生的 SAAS 产品,按需拉起、弹性伸缩是最基本的能力。
网络安全
网络方面,基于安全考虑,很多企业客户不希望暴露数据库的公网端口,因此,我们设计了一个数据库网关,通过这种设计,用户只需拉起一个 NineData 数据库网关,就能够连接我们的中心管理节点,从而建立反向访问通道,能够把散落在各地、以及包括内部的数据源的统一管理。此外,我们的 NineData worker 也可以放到用户本地,实现数据链路的内部闭环,而管理链路依然可以通过中心控制台实现统一的链路管理。
2.2 多源方面
在多源方面,我们主要设计了统一数据源接入层。为了接入众多数据源,我们对数据源的连接池管理、属性配置、连接检查和安全认证做了统一抽象。这样可以将所有的数据源统一接入。我们的四大主要功能模块都使用相同的数据源接入层,实现一次接入所有功能都可用。对于用户来说,就实现了真正的统一管理。
在 NineData 的产品设计中,安全不是单一的任务或功能,而是自始至终灌输在产品设计、开发、运维的全过程中,我们在数据传输加密、运维白屏、操作审计方面做了很多工作,同时 NineData 通过内部测试和三方审计多方位保护数据安全。
一个典型的 NineData 数据复制链路拓扑,当您配置完源和目标之后,NineData 就会让整个链路开始运行。一开始会有一个预检查,检查您的网络连接、账号密码等是否正确。接下来会进行结构复制,抓取和写入全量数据和增量数据。
从产品层面,我们要支持多云多源,除了上面介绍的弹性架构和网络架构外,我们在复制模块的多种数据类型兼容和扩展性做了重要的设计,同时多源异构长期运行必然存在少部分不兼容场景,我们在可观测和可干预方面也重点做了功能设计。数据传输内核模块的底线是保障数据一致,同时在吞吐和延时上具备领先的优势,因此我们在这方面做了很多工作。后面核心特性的分享将围绕这几个点进行展开。
03 数据复制的核心特性
3.1 吞吐能力
以全量性能为例,主要有几个重要的优化项:
大表迁移性能
大表迁移性能是最常见的瓶颈,假设我们在源端有一些数据需要处理,其中有许多表,而且它们的数据量都不同。如果我们同时启动三个并发线程进行处理,那么可能会出现一些数据量小的表已经处理完了,但是一些数据量较大的表仍然在等待单个线程进行处理的情况。如果表级并发,就会类似的问题。因此,为了提高整个效率,我们必须增强表内的并发能力。具体来说,我们需要考虑表的切片是否均匀。为此,我们制定了一项策略,即默认组件支持一键拆分,依次通过主键、非空唯一键、可空唯一键、普通键等这种顺序支持拆分,以尽力最均衡的方式实现并发处理。
并发写入还连带着一个空间问题,在使用过程中,在源端如果您将 100G 的数据写入,在目标端它可能会变成 150G。这是因为如果单个表乱序提交的话,就可能会产生一些数据空洞。为此,NineData 在切片大小和并发顺序方面进行了优化以控制写入放大。
目标库写入
要以对目标库损耗最少的方法写入,才能获得最大性能。解决通道性能,并且它可以线性扩展之后,吞吐量的瓶颈就不在通道上,而在目标库的写入上。因此目标库的写入姿势就非常重要。如果每条 SQL 都需要在目标端进行解析,那么性能肯定会差。因此,我们需要采用一些批量提交的方式。同时在处理压缩开关时,需要注意 CPU 的数量。在 CPU 数量较少的情况下,启用压缩会对性能产生较大的影响。
内存优化
内存优化可以提升吞吐性能。因为整个全量复制的特点是批量加载到内容而且快速写入目标库,然后这个数据就被淘汰了。所以整个 JVM 的参数上做一些针对性的配置优化,从而降低内存和 CPU 开销,提升通道性能。
3.2 低延时
那么 NineData 如何构建低延时呢?我们从多个维度考虑低延时特性。
通道性能
在通道性能角度,包括一些如 Batch、热点数据的合并等。其中热点数据的合并,如果一条记录从 A1 改到 A2,再改到 A3,一般同步模型是全轨迹修改,但开启热点能力后,它可能直接合并成终态的 A3 插入语句,不会插入 A1 或 update A2,通过这种能力直接以终态的数据写入,在内存中把这个队列直接合并掉。在通道性能层面,还有一些其他设计。例如在 redis 的复制链路中,减少队列的序列化代价,从而让整个队列的消耗降到最低。
通道管理层设计
通道管理层面对低延迟的整体系统设计也非常重要,这是在我们多年的实践中得出的经验。要能够以最小的代价面对同步链路中的各种异常。
(a)降低异常情况下重拉的可能。数据库出现延迟,但是数据服务端的日志已经被清除;作为我们云原生的产品,我们会怎么做呢?我们会获取源端数据库的接口,检查是否存在被上传到 OSS 或者其他对象存储的日志。如果有,我们会自动获取并接续上之前的记录,从而避免重新进行全量拉取,减少延时。
(b) 尽量少地回退数据。我们设计了表级别的安全位点。每张表都会有一个自己最新的位点。如果在回放过程中,这张表的位点曾经被使用过,我们会将其抛弃,以避免位点回退。
(c)干净地运维。针对日常的运维操作,NineData 复制线程会使队列中的所有数据都提交完成,使得 16 个线程到达一个一致的位点,然后再关闭进程。通过这种能力,我们实现了一个干净的 cleandown,用户重新启动后就不会遇到需要回放数据,这是非常优雅的方式之一。
3.3 一致性数据同步
数据一致性重要性毋庸置疑,这里从数据一致性和 DDL 结构一致性两方面各重点介绍一个 NineData 的设计特性,同时 NineData 实现了完善的数据对比功能。
数据一致性
数据本身的一致性问题,如何保障事务一致性。举个例子,假设我们有 T1 到 T5 这五个事务,其中 B1 是订单状态,从 B1 创建订单,到 B3 可能是用户付款,这时会产生一个物流订单 L。如果我们采用正常的行级同步方式,订单和物流订单会分别存储在不同的表中,由于行级的并发性,无法保证它们的顺序性。因此,B1 和 L 可能同时出现在目标库中,也就是说在创建订单时,物流订单也已经被创建了。对于在线业务来说,这肯定是违背业务逻辑,无法支持在线业务的正常运行。
因此,我们构建了一个事务一致性能力,用户可以开启事务能力。当用户开启事务能力时,我们会检查 T3 这个事务中的每条记录与之前所有事务是否存在依赖关系。如果存在,T3 将等待其他事务都提交完毕后再提交,确保数据的一致性。因此,第一次提交只会提交 T1 到 T4,T3 会等待 T2 提交完毕后再提交。这是一种保证数据一致性的同步机制。
DDL 变更同步的一致性
DDL 变更同步的一致性问题,具体来说,以表结构为例,如果我们遇到了表结构的变更,一般的解决方法是查看源端的表结构。然而,由于数据日志中大部分只有数据和表名,缺少结构和类型等信息,因此我们需要回查数据源来获取结构信息,并拼接出最终的结果。但是,很可能在回查时源端已经发生了第二次 DDL,导致我们获取到的是已经又被修改过的 DDL,从而拼接出的数据不一致和出现错误。
因此,我们开发了一种 DDL 解析能力,即在 DDL 解析完成后,直接在同步线程解析线程中进行重放。同时,我们记录每个变更的版本,重放的同时生成新版本,旧版本不删除。这样,任何表在任何时刻都可以随时查到其 Meta 结构,而不需要像其他业界实践一样,需要从头开始重新回放一遍。
数据对比
在数据对比方面,NineData 将其作为一个重要的产品能力进行建设,我们认为数据对比对整个数据质量的影响非常重要。因此,在结构对比、数据对比以及订正 SQL 生成等方面,我们在功能上做得非常全面。其次,我们会考虑数据对比对用户的源库和目标库带来的负载。这些负载对于许多生产人员来说非常重要。因此,我们制定了许多策略,例如:仅对不一致的数据进行复检,可以控制并发和限流,设置抽样比例和条件过滤,仅对某一范围内的数据进行比较等等。同时,在性能方面,我们也做有特色的优化。常规的数据对比会拉出源和目标的所有数据,就会耗费大量计算资源和带宽,因此我们做了比较优雅的计算下推,只对不一致数据进行回表再逐个字段对比。
3.4 可扩展性,加速实时数仓构建
在可扩展性方面,如何在 NineData 里面支持快速地新增数据源?意味着我们需要快速支持结构和数据类型的转换,以及快速将通道产品化,这些都是我们的目前重要的思考因素。我们的整个设计思路就希望说,把原来的各种源到目标的这种 N 乘 M 的这种拓扑方法,能够通过 N 加 M 的这种方式来实现。
我们先讲一下数据类型,因为数据类型可能会对于最终一致性,大家会更加的在意,业界无论是在 FiveTran、Airbvte、NIFI、NineData 等方面的开源项目或者还是商用项目中,都定义了很多中间类型。今天,NineData 也是定义了一些中间类型,因为中间类型抽象得越好,它的种类就越少,这意味着新增的数据源我们需要开发 convert 的工作量就越少。因此,如何更好地抽象到更少的样本集里,是整体更好的抽象方法。
第二个抓取和写入模块的插件化,最大程度复用代码,提升产品化效率和稳定性。我们提供了一个叫做关系数据提交框架。该框架把 DDL/DML 的库、表、主键级别冲突等待,事务冲突等待,热点合并和攒批优化 SQL 都抽象出来,使得后面接入的数据源可以天然地具备这些能力。
当前 NineData 已经广泛支持了 MySQL、PostgreSQL、SQLServer、 Redis、MongoDB、Kafka、 ElasticSearch、SelectDB(Doris)等数据库,并在其系列上对接了主流的各云厂商产品。这里重点介绍下 SelectDB 和 ClickHouse 我们的特性设计。
结构复制
NineData 支持了 MySQL 所有 DDL 自动同步到 SelectDB,包括 Distribute Key 的自适应和 SQL 改写,跨库的 create table like SQL 改写等。
数据复制
我们定义了 NineData 中间类型到 SelectDB 数据类型的一一映射,实现数据类型以及字符集映射,同时对于时间类型,支持根据服务端 Global TimeZone 进行跨时区数据迁移。
数据处理
支持在复制过程中筛选同步对象,同时进行操作类型过滤(如只复制 Insert 不复制 Delete)、基于数据计算进行过滤、数据类型转换。
性能优化
除了复制框架支持的写入合并外,NineData 数据复制支持以 Stream 模式进行全量或增量写入,在 MySQL->SelectDB(Doris)的测试中,云上同 Region 测试 30 个并发可以达到 209MB/S,88W RPS(单行平均 250B 左右)。
NineData 在 ClickHouse 的支持上也做了细致的设计,结构映射方面支持用户选择 CollapsingMergeTree 或 ReplacingMergeTree 进行复制,支持了 ClickHouse 各数据类型的映射,包括默认值差异的处理。在性能方面,类似于 Airbyte 的做法会将所有增量数据合成一个文件,因为 ClickHouse 引擎中的许多增删改都是变成直接增加,因此这种方式相对简单。但这种方式会带来较大的延迟。因此,在实现过程中,我们考虑使用 SQL 的方式进行提交,来了多少条就立即转集批提交,可以动态地控制,例如超过 1000 条或 0.5 秒,可以几百毫秒就提交。此外,ClickHouse 的 Jdbc 在解析每条语句时性能较差,因此我们进行了一些优化,采用批量提交的方式来提高性能。
3.5 高可用机制
节点容灾
NineData 所有组件采用高可用架构,规避单点风险。任务节点跑在分布式容器集群上,容灾系统自动检测异常任务、异常节点并自动完成任务跨机漂移容灾。
任务鲁棒性
通过动态内存管理,结合动态分片、动态攒批、流式读写、弹性扩缩容等技术,提升链路对负载的自适应能力,有效保障任务稳定性。
断点续传
所有模块支持定期位点记录,包括结构复制、全量复制、增量复制、数据对比;任意任务或服务节点异常,会基于断点重启任务。通过完善的重试、干预手段,提升劣网、数据高负载、硬件异常等场景下,链路的健壮性。
3.6 可观测可干预能力
可观测性
(1)复制系统针对每个链路有有秒级日志打点,可以查看秒级 RPS,累计 DDL/DML 操作数,队列堆积数等指标,查看任务各模块状态。
(2)实时查看提交线程状态。例如,如果有 16 个线程正在运行,我们会显示这 16 个线程分别在执行哪条 SQL,或者任务是否被 DDL 卡住等信息。可以通过类似于 MySQL Processlist 的方式查看每个线程正在执行哪些操作,已经执行了多长时间等信息。在同步过程中,用户可能会在目标端、新的写入等可能会遇到一些问题,导致这个两边写数据冲突等。因此,我们在可观测性方面不仅会将基本状态完全透露给用户,还会提供每个线程提交的语句。
可干预能力
(1)修改同步对象,对于长期复制任务,用户可能因为业务变化,需要添加新的对象到同步链路中,可以在界面上直接添加,后台会创建新对象的结构初始化、全量和增量,并在追上后合并同步对象到现有链路中。
(2)成熟的异常处理能力。对于异常任务,NineData 会显示具体的报错信息,用户可以进行 SQL 级别的语句订正和重试,或者跳过,从而在少量目标双写或结构不一致情况下,依然可以快速修复任务,保障目标数据的及时性和正确性。
3.6 能力数据复制小结
NineData 数据复制的设计目标是 Any Where、Any Data、AnyTime 的服务客户的数据流动场景。当前主流数据源以及比较完整,兼容适配了各种复杂的网络环境,深度适配 VPN、专线、堡垒机、云厂商 VPC 和私网访问等方案,可以通过 SaaS 服务或专属集群方式服务客户,保障数据安全和复制稳定
04 典型用户案例
4.1 国资云客户
某大型国资云数据复制,客户全国有 30+Region,本身有很多数据需要同步,同时还要提供数据复制产品给他的客户使用,比如该云的客户从其他云厂商或自建系统中迁移上云。包括很多复杂的应用场景,如迁移上云、跨云迁移、跨区域迁移、数据容灾、异地多活等业务场景。也面临非常复杂的网络环境,Region 内部/Region 之间,和其他云厂商与客户自有系统之间等各种链路。客户在考察了市面上主流云厂商、数据复制专门厂商的方案后选择了 NineData。
4.2 跨境电商企业
某跨境电商企业通过 NineData 实现实时数仓,指导运营分析决策。客户的分析和运营活动基于 ClickHouse。MySQL 生产是分散在世界各地,比如日本、韩国等,他将各个地方的在线数据汇聚到国内的 ClickHouse 进行统一分析和运营决策。在这个过程中,他使用了我们的 NineData 复制产品,NineData 在跨地域的复制方面是具备一些优势。我们的解析模块、读取模块和写入模块可以异地部署,解析模块能够靠近用户的源端,写入端能够靠近用户的目的端,从而实现了整个性能的更加优化。
4.3 大型地产企业
某大型地产企业使用 NineData 实现统一数据管理。该企业拥有大量的数据库,但其开发流程涉及许多合作伙伴,例如 ISV 或第三方软件开发提供商。因此,他们需要将数据源的权限控制委托给这些合作伙伴。在以往的人工管理过程中,权限管理变得非常复杂且流程繁琐,难以统一管理。为此,NineData 提供了一个统一管理数据源的解决方案。通过该方案,统一纳管了企业的所有数据源,开发人员的账户初始化、权限申请以及数据开发流程的可视化等均得到了优化,从而大大提升了开发效率和协同效率。
最后,NineData 已经和数据源、云厂商产生了很多密切的合作关系,并且取得云服务、信息安全管理、质量管理等多项认证,在多个行业的头部企业中广泛应用。NineData 致力于为客户提供更加稳定、更智能的数据库服务,帮助客户快速构建统一的数据管理,让每个人用好数据和云,欢迎大家体验使用。
NineData 是新一代的云原生智能数据管理平台,包含了数据复制、SQL 开发、数据备份以及数据对比等多种功能。NineData 采用领先的云原生与 AIGC 技术,为云与 AI 时代的架构设计提供了智能数据管理平台。作为业界首个支持跨云和本地 IDC 无缝打通的平台,能够帮助客户轻松完成数据上云、跨云数据实时传输、ETL、数据备份、企业级智能 SQL 开发、数据库研发规范、生产变更以及敏感数据管理等功能,从而让客户的数据使用更加安全高效。
相关文章:

【数据库技术】NineData数据复制,加速实时数仓构建
8 月 30 日,由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动,引领企业智能化数据管理”的线上联合发布会,圆满成功举办!双方聚焦于实时数据仓库技术和数据开发能力,展示如何通过强大的生态开发兼容性…...

Kotlin入门1. 语法基础
Kotlin入门1. 语法基础 一、简介二、在Idea创建一个示例项目三、基本语法1. 第一个程序2. 基本数据类型(1) 数字(2) 类型转换(3) 数学运算位运算 (4)可空类型 3. 函数4. 字符串(1) 字符串拼接(2) 字符串查找(3) 字符串替换(4) 字符串分割 5. null 安全的…...

MVCC简介、工作流程、优缺点
目录 简介 相关概念 工作流程 MVCC优缺点 简介 MVCC(Multi-Version Concurrency Control)即多版本并发控制,是通过维护数据的历史版本,从而解决并发访问情况下的读一致性问题 相关概念 读锁: 也叫共享锁、S锁。若…...

pandas由入门到精通-pandas的数据结构
pandas数据分析-pandas的数据结构 pandas 数据结构Series1. 创建Series数组2. 性质3. 索引4. 运算DataFrame1. 创建Df数组2. 性质3.索引4. 对列进行增删改Index Objects本文介绍pandas中一些常用的属性方法的概述,给读者提供快速学习的架构和思路。表格中提供的一些参数方法没…...

jenkins+ssh+Putty构建windows的IIS服务发布
使用JenkinssshPutty发布windows IIS服务 下面是使用Jenkins、SSH和PuTTY实现Windows IIS服务发布的步骤: 在构建服务器上安装Windows SSH服务、PuTTY和7-Zip软件。在部署服务器上也安装Windows SSH服务和7-Zip软件。在构建服务器上使用批处理命令执行编译&#x…...

服务器和普通电脑有何区别?43.248.189.x
简单来讲,服务器和电脑的功能是一样的,我们也可以把服务器称之为电脑(PC机),只是服务器对稳定性与安全性以及处理器数据能力有更高要求,比如我们每天浏览一个网站,发现这个网站每天24小时都能访…...

Zookeeper的使用
一、Zookeeper简介 分布式协调框架,小型的树形结构数据共享储存系统。 zookeeper的应用场景 集群管理 注册中心 配置中心 发布者将数据发布到ZooKeeper一系列节点上面,订阅者进行数据订阅,当数据有变化时,可及时得到数据的变…...

【实用 Python 库】使用 XPath 与 lxml 模块在 Python 中高效解析 XML 与 HTML
在今天的信息时代,数据无处不在,从网络爬虫到数据挖掘,从文本处理到数据分析,我们时常需要从结构化文档中提取有用的信息。XPath 是一门强大的查询语言,它可以在 XML 与 HTML 等文档中定位特定的元素与数据。而在 Pyth…...

数据库的基本概念
数据库 数据库由表集合组成,它是以一定的组织方式存储的相互有关的数据集合。 表:记录:行,字段(属性):列,以行列的形式就组成了表(数据存储在表中)。 关系数…...

无涯教程-Android - 环境设置
您可以从Oracle的Java网站下载最新版本的Java JDK-Java SE下载,您将在下载的文件中找到有关安装JDK的说明,按照给定的说明安装和配置安装程序。最后,将PATH和JAVA_HOME环境变量设置为引用包含 java 和 javac 的目录,通常分别是java_install_dir/bin和java_install_d…...

将 ChatGPT 与 ReactJS 集成以实现更智能的对话界面
在本博客中,我们将探讨如何使用 Kommunicate 平台将 ChatGPT 与 ReactJS 集成,从而更轻松地在网站上部署和管理聊天机器人。 随着技术世界的不断发展,聊天机器人已成为许多企业不可或缺的一部分,提供高效、个性化的客户交互。在众多可用的人工智能聊天机器人解决方案中,C…...

关于xml中返回string类型代码中用list接收的问题,扫描
1.结论,xml中返回为string的话,在list中只会取出来第一个元素 //根据value查询GetMapping("getTest")public List<HashMap> getTest() {List<HashMap> list dictService.getTest();return list;} <select id"getTest" resultType"jav…...

【前端demo】CSS border-radius可视化 原生实现
文章目录 效果原理代码 前端demo系列目录:https://blog.csdn.net/karshey/article/details/132585901 效果 参考: Fancy Border Radius Generator (9elements.github.io) https://border-radius.com/ CSS border-radius 新玩法(含可视化生成工具) - …...

Qt Creator使用Clang Format方法
Qt Creator使用Clang Format 习惯性的想格式化代码,发现Qt Creator默认居然是没有代码格式化的,只有一个缩进。 Qt Creater中有个插件:beautifier,在"帮助->关于"插件中,开启“Beautifier”即可…...

智慧矿山2.0:煤矿智能化综合管理AI大数据监管平台建设方案设计
一、行业背景 能源与煤矿是我国国民经济的重要物质生产部门和支柱产业之一,同时也是一个安全事故多发的高危行业,施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。煤矿智能化既是未来趋势,更是产业发展需求,建设智慧…...

Linux——(第一章)Linux的入门
VMwear workstations下载及安装 Ubuntu server 18.04安装 VScode下载与安装 使用VS Code连接远程服务器 MobaXterm的下载安装及远程连接 Filezila的下载、安装与使用(向服务器传输文件) 目录 1.概述 2.Linux和Windows的区别 3.VM的安装与使用 1.概述 …...

十六、策略模式
一、什么是策略模式 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法…...

Python装饰器
什么是python装饰器? 顾名思义,从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数࿰…...

【Spring】使用自定义注解方式实现AOP鉴权
AOP,是一种面向切面编程,可以通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在软件开发中,鉴权(Authentication)是一项非常重要的安全措施,用于验证用户身份和权限。在应用程序中&…...

Go几种读取配置文件的方式
比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级(从高到低&am…...

每日一题(反转链表)
每日一题(反转链表) 206. 反转链表 - 力扣(LeetCode) 思路: 可以定义一个新的newhead结构体指针。再定义cur指针和next指针互相配合,将原链表中的节点从头到尾依次头插到newhead链表中,同时更…...

某人事系统架构搭建设计记录
首发博客地址 https://blog.zysicyj.top/ 先大致列一下基础情况 架构必须是微服务 场景上涉及大量查询操作,分析操作 存在临时大量写入的场景 并发并不高 对高可用要求较高,不能挂掉 对安全要求高 要能过等保测试等三方测试 使用人数并不多,十…...

uniapp 实现切换tab锚点定位到指定位置
1.主要使用uniapp scroll-view 组件的scroll-into-view属性实现功能 2.代码如下 <scroll-view:scroll-into-view"intoView"><u-tabsclass"tabs-list"change"tabChange":list"tabList"></u-tabs><view id"1&…...

华纳云:ssh登录22号端口拒绝连接Ubuntu?
如果您在尝试使用SSH登录Ubuntu服务器的时候遇到了22号端口拒绝连接的问题,您可以尝试以下几个步骤来解决问题: 确认SSH服务已启动: 确保Ubuntu服务器上的SSH服务已经正确启动。您可以在服务器上运行以下命令来检查SSH服务的状态:…...

python conda实践 sanic框架gitee webhook实践
import subprocess import hmac import hashlib import base64 from sanic.response import text from sanic import Blueprint from git import Repo# 路由蓝图 hook_blue Blueprint(hook_blue)hook_blue.route(/hook/kaifa, methods["POST"]) async def kaifa(req…...

LeetCode——无重复的最长子串(中等)
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…...

【SQL】关系模型与查询和更新数据
一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键,但联合主键并不常用。 1.2 外键 FOREIGN KEY …...

【Centos8_配置单节点伪分布式Spark环境】
安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接: jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk(java8) # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …...

【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识①【16分】
一、系统集成的特点 官方解释: 1、信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等; 2、信息系统集成是指将计算机软件、硬件、网络通信、信息安全等技术和产品集成为能够满足用户特定需求的信息系统;显著特点如下&am…...

揭秘特权账号潜在风险,你中招了吗?
什么是特权账号? 特权账号指在企业运营过程中,为相关业务运营、系统管理、系统运维等人员赋予的系统维护、权限增加、数据修改删除、导出等高级权限的系统账号。这些账号多数连接企业核心资源,保障企业内部各项业务正常运作。然而࿰…...