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

OceanBase 的探索与实践

作者:来自 vivo 互联网数据库团队- Xu Shaohui

本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了解 OceanBase 功能与特性,最后总结了 OceanBase 优缺点与展望。

一、背景

vivo 作为一家以设计驱动创造伟大产品,以智能终端和智慧服务为核心的科技公司,服务全球5亿+用户,用户持续增长,同时数据量也持续增长,在数据库运维过程中遇到如下问题:

  • 分库分表:随着业务数据量的不断增长,MySQL 实例数据量超过了单机容量限制,业务分库分表的需求越来越多,分库分表的改造成本和风险比较高,需要能够兼容 MySQL 的分布式数据库解决分库分表的问题。

  • 成本压力:业务用户基数比较大,每年的数据自然增长规模也很大,需要持续采购新的服务器来满足数据增长需求,存在一定的成本管理压力。

基于上述问题,我们调研了目前市面上兼容 MySQL 且较为成熟的分布式数据库产品后,最终选择了 OceanBase,期待其原生分布式和分区表特性解决 MySQL 的分库分表问题;其极致的数据压缩能力与组户级资源隔离节省存储成本、运维成本。

1.1 原生分布式和分区表特性

OceanBase 的原生分布式架构分为 OBProxy 层, OBServer  层,前者负责数据路由转发,后者负责数据存储与计算。OceanBase 通过可用区(Zone)来划分节点,以便集群内的自动容灾处理和优化策略能更好地工作,根据不同的场景部署不同高可用方案,如:同城三机房三副本部署,三地五中心五副本部署等,同时,通过增加节点实现透明水平扩展,支持业务快速的扩容和缩容,解除我们的单机容量限制。

图片

OceanBase 分布式架构

(图片来源: OceanBase 官网)

1.2 数据压缩能力与组户级资源隔离

OceanBase 的表可设计为分区表,每个分区均衡分布到不同的 OBServer 节点上,每个物理分区有一个用于存储数据的存储层对象,叫做 Tablet,Tablet 有多个副本分布在不同的 OBSever 节点,使用日志流(Log Stream)来做数据持久化和副本之间的数据同步,正常情况下主副本提供服务,当主副本故障时会自动切换从副本,从而保证数据的安全性与可用性,一个集群可创建多个互相之间隔离的数据库"实例",叫做租户(Tenant),可为多个独立业务提供服务,租户间数据隔离,降低部署和运维成本。此外,得益于 LSM-Tree 的存储引擎,OceanBase 具备极致的数据压缩能力,据官方文档及企业案例介绍,可以使存储成本降低60%以上。

总的来说,OceanBase 的原生分区表能很好地解决业务架构中分库分表带来的问题,分区表对上层业务无感知,可以节省大量的改造成本与时间,并降低风险,提高业务可用性,数据压缩能力可以极大地节省我们的存储空间,此外,OceanBase 的性能、可用性、安全性、社区支持等方面也都符合运维预期,满足业务需求。

二、OceanBase 落地实践

为了更顺畅的实现迁移和运维 OceanBase 数据库,在正式迁移前,我们部署了 OceanBase 运维 OCP 平台、日志代理工具 oblogproxy、迁移工具 OMS,具备了集群部署管理、监控报警、备份恢复、日志采集、迁移等运维能力,结合内部数据库运维管理平台,实现了元数据管理、数据查询、数据变更等能力,能够满足 DBA 运维和业务查询变更需要,具备生产上线的条件。

2.1 OCP 平台部署

OceanBase 云平台(OceanBase Cloud Platform,OCP)是一款以 OceanBase 为核心的企业级数据库管理平台,提供对 OceanBase 集群和租户等组件的全生命周期管理服务,也对 OceanBase 相关的资源(主机、网络和软件包等)提供管理服务,能够更加高效地管理 OceanBase 集群,降低企业的 IT 运维成本。

图片

OCP 架构

(图片来源: OceanBase 官网)

OceanBase 云平台包括管理 Agent(Management Agent)、管理服务(Management Service)、元信息数据库(Metadata Repository)、监控数据库(Monitor Repository)、管理控制台(Management Console)和 OBProxy(OceanBase 专用反向代理) 这六个模块,每个模板之前协同工作。OCP 还提供高可用方案,一主多备,解决单点故障问题。

在部署时,我们将 OCP 元数据,管理服务等均使用三节点跨机房部署,避免单一节点故障,实现高可用性。由于公司已有一套告警平台,所以在部署时,我们通过 OCP 的告警通道自定义脚本功能实现 OCP 与公司告警服务的对接,让 OCP 的告警能更好地兼容到公司的告警平台。

OCP 工具的另一项重要功能是备份与恢复。在 OCP 中,物理备份由基线数据、日志归档数据两种数据组成,数据备份优先选择 Follower 副本进行备份,当用户发起数据备份请求时,该请求会首先被转发到 RS 所在的节点上,RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务,然后把备份任务分发到 OBServer 节点上并行地执行备份任务,把备份文件数据存放在指定的网络存储,如NFS、S3等。

图片

OCP 备份架构

(图片来源: OceanBase 官网)

OceanBase 数据库支持的备份介质丰富,包括 NFS、阿里云 OSS、腾讯云 COS、AWS S3 ,以及兼容 S3 协议的对象存储。此处值得一提的是,在 OCP上创建备份策略,存储介质为S3,集群发起备份时要把备份文件存放在指定S3目录,如下图所示。

图片

2.2 oblogproxy 工具部署

oblogproxy(OceanBase LogProxy,即 OceanBase 日志代理)是 OceanBase 的增量日志代理,它可以与 OceanBase 数据库建立连接并进行增量日志读取,为下游服务提供变更数据捕获(CDC)的能力。其 Binlog 模式为兼容 MySQL binlog 而诞生,支持现有的 MySQL binlog 生态工具来同步 OceanBase,现有的 MySQL binlog 生态工具可以平滑切换至 OceanBase 数据库。

图片

oblogproxy 架构

(图片来源: OceanBase 官网)

oblogproxy 启动 bc 模块用于拉取 OceanBase clog 并将其转换为 binlog 格式,转换后将其写入到文件,即 binlog 文件,MySQL binlog 生态工具(图中为 Canal 或 Flink-CDC)发起 binlog 订阅请求到 OBProxy,OBProxy 收到 binlog 订阅请求后将其转发至 oblogproxy,接收到 OBProxy 转发的 binlog 订阅请求后启动 bd 模块,bd 模块启动后读取 binlog 文件并对外提供订阅服务,即 binlog dump 。我们通过网络共享存储存放元数据的方式实现oblogproxy 多节点部署,避免单一节点故障,实现高可用。

2.3 OMS 工具部署

OceanBase 迁移服务(OceanBase Migration Service,OMS)是 OceanBase 数据库提供的一种支持同构或异构数据源与 OceanBase 数据库之间进行数据交互的服务,具备在线迁移存量数据和实时同步增量数据的能力。

图片

OMS架构

(图片来源: OceanBase 官网)

OMS 主要服务包含:

  • DBCat,数据对象采集和转换组件。

  • 增量拉取组件 Store、增量同步组件 Incr-Sync、全量导入组件 Full-Import 和全量校验组件 Full-Verification。

  • 基础服务组件,包括集群管理、资源池管理、高可用组件和元数据管理等多个组件,以保证迁移模块的高效调度和稳定运行。

  • 管理控制台,进行一站式迁移调度。

在部署 OMS 时,我们对于 OMS 元数据、迁移服务均使用三节点跨机房部署,避免单一节点故障,实现高可用。在使用 OMS 进行数据迁移、同步等监控与告警方面, OMS 没有重复实现相关组件,而是通过调用 OCP 的告警通道来发送告警。

三、数据库迁移方案与实践

3.1 MySQL 迁移 OceanBase 实践

为了防止迁移过程出现难以解决的问题,我们对迁移可行性进行了评估。经过性能压测、兼容性测试(表结构,查询 SQL,账号等)均符合要求。在进行分区适应性测试时,发现业务使用分区表时,表结构需要做兼容性修改,查询 SQL 也要适配分区表,但结合业务改造成本评估,结果也符合预期。

我们使用 OMS 将 MySQL 数据迁移到 OceanBase,迁移链路支持全量和增量,保证数据的实时同步和全量校验并提供反向增量同步,迁移异常时业务能快速回滚,保证业务可用性。

图片

OMS 数据迁移项目

迁移流程分为8个步骤:

  • 第一步,迁移前配置校验。

  • 第二步,验证 OceanBase租 户与账号。

  • 第三步,数据一致性校验。

  • 第四步,DDL 表结构修改暂停。

  • 第五步,数据同步延迟校验。

  • 第六步,应用切换数据库连接配置,或者修改域名解析。

  • 第七步,KILL 源库残余连接,确保应用连接到OceanBase。

  • 第八步,停止 OMS 数据正向同步,开启反向同步,用于回滚。

图片

以上流程是为确保切换成功,减少迁移风险,并提供了回退预案,最大程度保证业务的可用性与安全性。

迁移了5套 MySQL 集群近20T的数据到 OceanBase 集群,带来如下收益:

  • 云服务存储了海量数据并且数据还在持续快速增长,原本 MySQL 分库分表方案的维护与管理需要巨大成本,而且存在较大的可用性风险。OceanBase 分区表替代了分库分表方案,不仅解除了维护管理成本,高压缩特性也节省了存储成本。

  • 风控集群数据写入量较大,导致主从延迟一直居高不下,存在数据丢失风险,OceanBase 数据强一致性很好的解决这个问题并且存储空间节省70%。

  • 金服归档库使用 tukodb 存储,存在唯一索引失效的问题,tukodb 官方也不再维护,可用性得不到保证,迁移 OceanBase 后,该问题迎刃而解,查询与 DDL 性能有大幅度的提升,分布式水平扩展解决单机容量问题。

3.2 某分布式数据库迁移 OceanBase 实践

由于此前在一些边缘业务应用某分布式数据库,自 OceanBase 上线后,我们也决定将这部分业务统一迁移到 OceanBase。我们考虑了两种迁移方案,第一种方案是基于某分布式数据库的增量同步工具和 KAFKA+OMS,第二种方案是基于 CloudCanal,并进行了方案对比,如下:

图片

CloudCanal 虽然架构简单,但不支持反向同步,增量同步性能较差,不满足业务迁移需求;CDC+KAFKA+OMS 架构虽较复杂,但其与 OceanBase 兼容性更好,支持反向同步便于业务回退,整体性能也更好。因此,最终选择基于 CDC+KAFKA+OMS 的架构方案进行全量迁移和增量同步,同时进行全量校验,并提供反向增量同步。

图片

CDC 把集群的增量数据解析为有序的行级变更数据输出到下游的 Kafka,OMS 通过消费 Kafka 的增量数据写入 OceanBase 完成增量同步。Kafka的数据默认保留7天,如果考虑到数据延迟较大的情况,可以适当调整 Kafka 数据保留时间,同时,OMS 也可以通过增加并发等配置来提高同步速度。

在进行近500亿全量数据同步时,RPS(行/秒)非常低,只有 6000-8000,需要几周才能迁移完成,这显然是不符合预期的。经过分析,发现数据源与目标端均无压力和异常,OMS 服务主机负载也正常,显然问题不在这里。继续分析发现源表的自增主键ID不是连续的,且跨度很大, OMS 默认使用主键来做数据分片,导致全量同步时每次只同步到少量的有效数据,致使 RPS 比较低。

我们修改 source.sliceBatchSize(每个分片记录数)为12000,并把内存调大,调整之后RPS有明显的提高:39,257 /39,254,但仍未达到预期。

通过分析 OMS 的全量同步的 msg/metrics.log 日志,发现wait_dispatch_record_size": 157690,这个指标很高,显示异常:wait_dispatch_record_size 大于 0,表示 OMS 内部计算数据归属分区存在瓶颈,分区表情况下一般都会有积压,分区计算比较耗时,关闭分区计算  sink.enablePartitionBucket=false,并调大 srink.workerNum,RPS 平均能达到50-60W左右,至此迁移性能基本符合预期。

此外,在数据迁移时,我们也遇到三个问题,以下列出问题及解决方案,供大家参考。

  • 问题1

OMS 迁移任务提示  The response from the CM service is not success 。

解决方案

分析任务 connector.log 日志,提示  CM service is not success,但查看CM服务状态是正常的,分析同步任务的内存使用情况,发现内存严重不足,FGC 次数非常高,导致服务异常,调整CM内存:进入 OMS 容器,修改:/home/admin/conf/command/start_oms_cm.sh,jvm修改为 -server -Xmx16g -Xms16g -Xmn8g

  • 问题2

增量同步 RPS 过低,加大并发后基本也就是 8000 左右,而且数据库与 OMS 并没有明显的压力。

解决方案

分析增量任务 connector.log 日志,发现增量追平全量同步位点时还一直提示有大量的 PRIMARY 冲突,但发现源和目标端的数据并没有异常,不存在数据冲突问题,最后发现是 CDC 写入重复数据的原因,进而使 OMS 无法批量写入,导致 RPS 过低。目前 OMS 版本还没有针对这个场景优化,只能加大写入并发数让 RPS 有一定的提升。

  • 问题3

索引空间放大问题,在集群空间使用率只有50%左右,空间充裕时创建索引时报空间不足:ERROR 4184 (53100): Server out of disk space。

解决方案

分析集群节点空间使用率,集群的节点剩余空间还有一半,空间还是比较充裕的,正常来说不应该会空间不足。从 OBServer 日志可见,索引创建时空间放大了5.5 倍,需要5.41TB,而目前集群只剩余1.4TB,明显空间不足。

OceanBase 4.2.3之前的版本存在索引放大的原因是:

  • 排序时落盘的中间结果,同时有元数据记录;

  • 外部排序有两轮数据记录;

  • 排序的时候,数据是解压缩解码的。

OceanBase 4.2.3及更高版本进行了优化,使用紧凑格式存放中间结果并做压缩,同时,让数据一边写一边释放空间。目前,索引空间放大优化到1.5倍,因此,对于数据较大且增量数据较大的场景可以使用4.2.3之后的版本。

四、总结

总体而言,vivo 互联网业务使用 OceanBase 解决了使用 MySQL 遇到的痛点问题。OceanBase 的性能与数据压缩能力比较优秀,其丰富的生态工具也提供了较为完善的运维能力。后续我们将持续深入 OceanBase 的能力探索,同时期待 OceanBase 对于运维工具的功能细节更加完善,开放更多功能,解决我们遇到的问题。

相关文章:

OceanBase 的探索与实践

作者:来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…...

2024年安全员-A证证模拟考试题库及安全员-A证理论考试试题

2024年安全员-A证模拟考试题库及理论考试试题(一) 单选题 根据《建筑施工企业主要负责人、项目负责人和专职安全生产管理人员安全生产管理规定》,项目负责人每月带班生产时间不得少于本月施工时间的( )。 A. 60% B. …...

安装Docker并使用WSL

引言 Windows Subsystem for Linux (WSL) 是一个在Windows上运行Linux二进制可执行文件(ELF格式)的兼容层。它允许开发者直接在Windows上运行Linux环境,而无需使用虚拟机。Docker是一个开源的应用容器引擎,它允许开发者打包应用以…...

【TCP 网络通信(发送端 + 接收端)实例 —— Python】

TCP 网络通信(发送端 接收端)实例 —— Python 1. 引言2. 创建 TCP 服务器(接收端)2.1 代码示例:TCP 服务器2.2 代码解释: 3. 创建 TCP 客户端(发送端)3.1 代码示例:TCP…...

PostgreSQL和Oracle的sql差异

PostgreSQL和Oracle的sql差异 1.rownum &#xff08;1&#xff09;Oracle分页查询使用rownum&#xff0c;PostgreSQL使用limit offset ORACLEPOSTGRESQLselect * from (select rownum r,e.* from emp e where rownum <5) t where r>0;select * from emp limit 5 offset…...

阻塞队列详解

阻塞队列介绍 队列 是限定在一端进行插入&#xff0c;另一端进行删除的特殊线性表。先进先出(FIFO)线性表。允许出队的一端称为队头&#xff0c;允许入队的一端称为队尾。 数据结构演示网站&#xff1a; https://www.cs.usfca.edu/~galles/visualization/Algorithms.html Q…...

kali安装谷歌输入法

临时隐匿你IP地址 ifconfig 查询kali现在所用ip ifconfig eth0 所需要修改的ip/掩码24 修改临时ip格式命令 安装中文输入法命令 临时隐匿你IP地址 ifconfig 查询kali现在所用ip ifconfig eth0 所需要修改的ip/掩码24 修改临时ip格式命令安装中文输入法命令 apt-get in…...

C语言:编译与链接

本篇博客给大家带来的是代码从运行到生成可执行文件的流程和原理 &#x1f41f;&#x1f41f;文章专栏&#xff1a;C语言 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享 你们的支持就是我创造的动力 今日思想&#xf…...

VTK编程指南<五>:VTK中的坐标系统、空间变换及VTK矩阵详解

1、坐标系统 计算机图形学里常用的坐标系统主要有 4 种&#xff0c;分别是 Model 坐标系统、World 坐标系统、View坐标系统和 Display坐标系统(这些名词在不同的书里的中文表述均有所差别&#xff0c;所以直接使用英文名词表示)&#xff0c;此外还有两种表示坐标点的方式&#…...

Linux centos7 下载MySQL5.7仓库的命令

wget 是一个非常强大的命令行工具&#xff0c;用于从网络上下载文件。它是 Linux 和其他 Unix-like 系统中常用的工具之一。wget 命令的各个参数有着不同的含义&#xff0c;下面是您提供的命令 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.onarch.r…...

Java Serializable 序列化

Java的Serializable接口是Java序列化机制的核心&#xff0c;它允许一个对象的状态被转换为字节流&#xff0c;从而可以方便地进行存储或传输。 序列化后的对象可以被写到数据库、存储到文件系统&#xff0c;或者通过网络传输。 要在 Java 中使一个类可序列化&#xff0c;你需要…...

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析 1. 初始化 QNX 开发环境2. 使用 gdb 解析 Coredump3. 查看 backtrace:bt4. 查看所有线程信息5. 打印线程19的回溯信息6. 打印所有线程的回溯信息7. gdb info 相关的指令8. 查看使用了哪些共享库9. 查看出错的行号及地…...

ORB-SLAM2 ---- 词袋模型BOW

文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道&#xff0c;噪声的影响是不可消除的&#xff0c;而上一帧的误差不可避免的…...

win11无法检测到其他显示器-NVIDIA

https://www.nvidia.cn/software/nvidia-app/ https://cn.download.nvidia.cn/nvapp/client/11.0.1.163/NVIDIA_app_v11.0.1.163.exe 下载安装后&#xff0c;检测驱动、更新驱动。...

基于Java+Swing+Mysql的网络聊天室

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

docker安装Elasticsearch

公网即可拉取镜像&#xff0c;这个镜像是可以拉得到的&#xff0c;版本号根据自己需要的来 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.15运行命令&#xff0c;xxxxxxxxxxxxxxxxxxxxxxxx_password 为自己的密码 docker run -d --name elasticsearch \-…...

Elasticsearch入门之HTTP高级查询操作

前言 上一篇博客我们学习了es的一些基础操作如下&#xff1a; 创建索引&#xff08;创建表 create table&#xff09;查看索引&#xff08;查看表show tables&#xff09;查看单个索引&#xff08;查看单个表show create table&#xff09;删除索引&#xff08;删除表&#x…...

前端知识1html

VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span&#xff1a; <span style"color: red;">hello</span> <span>demo</span> span实现&#xff1a; 标题…...

《黑神话:悟空》闪退,提示D3D12崩溃,游戏崩溃无法启动是什么原因?要怎么解决?

《黑神话&#xff1a;悟空》闪退、D3D12崩溃及游戏无法启动&#xff1a;原因、解决方案与预防措施 作为一名软件开发从业者&#xff0c;我深知电脑游戏运行时可能遇到的各种问题&#xff0c;尤其是像《黑神话&#xff1a;悟空》这样的高品质游戏&#xff0c;其对硬件和系统配置…...

[GESP202312 五级] 烹饪问题

题目传送门 B3930 [GESP202312 五级] 烹饪问题 题目描述 有 N N N 种食材&#xff0c;编号从 0 0 0 至 N − 1 N-1 N−1&#xff0c;其中第 i i i 种食材的美味度为 a i a_i ai​。 不同食材之间的组合可能产生奇妙的化学反应。具体来说&#xff0c;如果两种食材的美味…...

[代码随想录10]栈和队列

前言 栈和队列在STL中扮演的什么角色呢&#xff1f;我们知道STL的六大组件是&#xff1a;容器&#xff0c;适配器&#xff0c;算法&#xff0c;迭代器&#xff0c;空间配置器&#xff0c;仿函数&#xff0c;而我们今天要学的栈和队列就是属于适配器里面的&#xff0c;为什么栈和…...

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面

前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中&#xff0c;命令行使用还是不太方便的&#xff0c;因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…...

Java、JavaWeb、数据库-图书管理系统

这一章主要是把上一章写在网页里的java 代码从网页中分离出来&#xff0c;放在专门的servlet类中。每一个servlet类对应一个数据库的表。 规范性问题&#xff1a; 1、dao包存放有关数据库的信息&#xff1a;BaseDao包就放数据库加载驱动和增删改和关闭资源&#xff1b;而其他…...

轻量化特征融合 | YOLOv8 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...

U盘文件乱码:原因、恢复、预防与总结

U盘文件乱码现象解析 U盘作为我们日常生活中常用的便携式存储设备&#xff0c;时常会遭遇文件乱码的问题。这种乱码现象通常表现为文件名变成一堆无意义的字符&#xff0c;文件内容无法正常查看&#xff0c;甚至文件根本无法被打开。当我们在电脑上插入U盘&#xff0c;准备查看…...

OpenStack介绍

OpenStack概述 OpenStack是一个开源的云计算管理平台软件,主要用于构建和管理云计算环境。它允许企业或组织通过数据中心的物理服务器创建和管理虚拟机、存储资源和网络等云计算服务。其核心组件包括计算(Nova)、网络(Neutron)、存储(Cinder、Swift)等。这些组件相互协作…...

OpenGL编译用户着色器shader

shader相信很多朋友们都听说过&#xff0c;shader就是运行再GPU上的程序。虽然是这么说&#xff0c;但是我们发现&#xff0c;很多IDE开发工具比如说visual studio 没有办法直接去运行shader代码。这是因为&#xff0c;许多编译器不会自动将shader文件编译成可执行的代码然后发…...

C++ 已经知道,中序和后序,推算前序的方法。

已经知道&#xff0c;中序和后序&#xff0c;推算前序的方法。 #include<iostream> using namespace std; string ldr_str,lrd_str;//中序遍历和后序遍历 void build(int l1,int r1,int l2,int r2){if(l1>r1) return ;//边界条件,说明已经没有元素了cout<<lrd_s…...

unity打包到安卓帧率降低

这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考...

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…...

DO、DTO、VO都是干什么的?

DO、DTO、VO 是三个常见的Java 对象&#xff0c;它们都是用来承载数据的&#xff0c;但是在不同的场景下有着不同的用途. 1.DO(Domain Object):领域对象&#xff0c;也称为实体对象。D0 通常用于数据库表的映射&#xff0c;DO中包含了实体的属性以及对实体的操作方法。DO 对应…...

深入探索 Node.js:构建强大的后端应用

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现

在探索大语言模型的创意应用过程中&#xff0c;我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作&#xff0c;实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...

【Git】:远程操作

目录 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置 Git 忽略特殊文件 给命令配置别名 我们可以自己搭建⼀台运行 Git 的服务器&#xff0c;不过现阶段&#xff0c;为了学 Git 先搭个服务器绝对是小题大作。好在这个世界上有个叫 GitHub 的神奇的网站&#xff0…...

服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析

Linux操作系统是世界上流行的操作系统之一&#xff0c;被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统&#xff08;EXT2/EXT3/EXT4/Reiserfs/Xfs&#xff0…...

基于python django的药材数据可视化系统的设计与实现,可对各类药材数据做一个统计分析可视化

研究背景 随着中医药文化的不断传承与发展&#xff0c;传统中药材的市场需求逐渐增加。然而&#xff0c;随着药材种类繁多、来源复杂、品质参差不齐&#xff0c;如何高效地管理、分析与展示中药材的相关数据&#xff0c;成为现代中药产业面临的重要课题。传统的药材数据管理方…...

docker及docker exec命令学习笔记

docker exec 是一个常用的 Docker 命令&#xff0c;允许你在已经运行的容器中执行命令或启动新的进程。以下是详细介绍和常见用法&#xff1a; 基本语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]参数详解 1. CONTAINER指定目标容器的名字或容器 ID。可以通过以下命…...

【pyspark学习从入门到精通24】机器学习库_7

目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分&#xff1a;在现实世界中&#xff0c;我们并不总是有目标特征的奢侈条件&#xff0c;因此我们需要回归到无监督学习的范式&#xff0c;在那里我们尝试在数据中发现模式。 在出生数据…...

Unity 策略游戏地图上的网格是如何实现的

在Unity中实现策略游戏地图上的网格&#xff0c;主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释&#xff1a; 一、地图数据的处理 收集地图数据&#xff1a;这包括地形高度、地形纹理、建筑物、树木等…...

【MySQL 进阶之路】锁详解

MySQL 锁详解 1. 锁的基本概念 锁在数据库中是用来保证数据一致性和防止并发冲突的一种机制。MySQL 中的锁可以分为不同的类型和粒度&#xff0c;每种锁都有特定的使用场景和特点。了解锁的类型、作用以及如何避免锁带来的问题是提升数据库性能和避免数据冲突的关键。 2. 锁…...

RK3588--解码H264(mpp-dec-h264-to-yuv-file)

1. 简介 源码下载:https://download.csdn.net/download/mao0514/90096131 本例完成H264格式文件解码,并保存为yuv格式文件。参考mpp_dec_test重写,进行了一部分精简。 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体…...

解决Conda虚拟环境中pip下载包总是到base环境的问题

conda本地创建的虚拟环境使用pip安装一些包总是安装到base环境中&#xff0c;导致无法正确进行环境隔离&#xff0c;下面是一些解决办法 方法一、使用python -m pip安装 1.1、验证虚拟环境的pip版本是哪个版本&#xff0c;如下所示&#xff0c;本人的demo虚拟环境直接使用pip…...

PyCharm 中设置虚拟环境

在 PyCharm 中设置虚拟环境的步骤如下&#xff1a; 1. 创建新项目时设置虚拟环境 1. 打开 PyCharm 并选择 New Project。 2. 在 Location 中指定项目路径。 3. 在右侧的 Python Interpreter 下&#xff0c;选择 New Environment。 Environment: 选择 Virtualenv。 Loca…...

M9484C VXG 矢量信号发生器- 110GHz-

M9484C VXG 矢量信号发生器 - 110GHz- M9484C VXG 是一款矢量信号发生器&#xff0c;在每个通道上提供 2.5 GHz 调制带宽&#xff0c;能够生成高达 54 GHz 的信号。 这款 VXG 矢量信号发生器可以组成经过校准和同步的全方位综合解决方案&#xff0c;帮助您更快测试下一代无线…...

机器学习详解(3):线性回归之代码详解

文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播&#xff1a;forward_propagation代价函数&#xff1a;cost_function反向传播&#xff1a;backward_propagation参数更新&#xff1a;update_parameters训练方法&#xff1a;train代码运行结果 3 使用Py…...

工业检测基础-工业相机选型及应用场景

以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据&#xff1a; 2D相机 检测原理&#xff1a;基于二维图像捕获&#xff0c;通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景&#xff1a;广泛应用于平面工件的外观检测&#xff0c;如检测…...

标准状态下一个气体分子每秒平均碰撞次数的估算

要估算在标准状态&#xff08;0C, 1个大气压&#xff09;下&#xff0c;一个气体分子在1秒内与其他分子的碰撞次数&#xff0c;我们可以使用一些基本的物理和化学原理。这个过程涉及到气体动力学理论&#xff0c;特别是麦克斯韦-玻尔兹曼分布。 计算气体分子的平均速率&#xf…...

使用PHPUnit使用本地调试代替远程调试,快速提高开发效率

Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架&#xff0c;但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…...

Android 镜像模式和扩展模式区别探讨-Android14

Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...

链表头文件大更新!!!

引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能&#xff0c;让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件&#xff0c;定义了一个模板类 LinkedList&#xff…...