Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云

Ape-DTS 是一款高效、轻量级且功能强大的开源工具,专注于解决数据迁移、同步、校验、订阅与加工的需求。无论是将自建的 MySQL/PostgreSQL 数据库迁移到云端,还是在不同数据库间进行数据迁移,Ape-DTS 都能为您提供便捷且可靠的解决方案。它特别适合于将自建 MySQL 数据库迁移到其他 MySQL 环境(如云端 MySQL、KubeBlocks MySQL),或者其他分析型数据库(例如 ClickHouse、StarRocks),以及消息队列(例如 Kafka)等场景。

https://github.com/apecloud/ape-dts

欢迎扫码添加小助手,备注「DTS」,进入交流群。

为什么选择 Ape-DTS

Ape-DTS 是一款旨在实现 any-to-any 的数据迁移工具:

  • 功能丰富: 支持多种数据库的 库表结构迁移数据全量迁移增量迁移数据校验订正复查数据订阅加工 等能力。
  • 支持广泛: 目前已支持数据库包括 MySQL,Postgres,Redis,Mongo,StarRocks,ClickHouse,Kafka 等。
  • 简单轻量: 不依赖第三方组件和额外存储,完整镜像解压后小于 100 MB。
  • 性能突出,使用 Rust 开发。

Ape-DTS 支持 MySQL,Postgres,Redis,Mongo,StarRocks,ClickHouse,Kafka 等数据库间的迁移,具体如下:

MySQL -> MySQLPostgreSQL -> PostgreSQLMongoDB -> MongoDBRedis -> RedisMySQL -> KafkaPostgreSQL -> KafkaMySQL -> StarRocksMySQL -> ClickHouseMySQL -> TiDBPostgreSQL -> StarRocks
全量迁移
增量同步
数据校验/订正/复查
库表结构迁移

功能亮点

  • 支持多种数据库间的同构异构数据迁移和同步。
  • 支持全量、增量任务的断点续传
  • 支持数据校验、订正。
  • 支持库、表、列级别的过滤和路由。
  • 针对不同源、目标、任务类型,实现不同的并发算法,提高性能。
  • 可加载用户 Lua 脚本,加工正在迁移/同步的数据。
  • 支持将数据发送到 Kafka,供用户自主消费。
  • 支持以 HTTP Server 的方式启动 Ape-DTS 并拉取增量数据,用户可使用 HTTP Client 获取数据并自主消费。

Ape-DTS 的性能表现

Ape-DTS 在多种场景下展现了卓越的性能表现。本文使用 sysbench 生成全量和增量数据,分别使用 Ape-DTS 和 Debezium 执行迁移任务,并对比结果。

以下是 MySQL -> MySQL 的测试,源端 MySQL和目标端 MySQL 均在 8C16G BCC(百度智能云云服务器)机器上使用 Docker 部署。

可以看到,Ape-DTS 的全量/增减迁移性能都显著优于 Debezium。在相同的节点规格(4C8G)下,Ape-DTS 的全量迁移性能约为 Debezium 的 31 倍,Ape-DTS 的增量迁移性能约为 Debezium 的 9 倍

测试一:全量数据迁移

同步方式节点规格RPS(Rows per Second)源 MySQL 负荷(CPU/内存)目标 MySQL 负荷(CPU/内存)
Ape-DTS1C2G714288.2% / 5.2%211% / 5.1%
Ape-DTS2C4G9940314.0% / 5.2%359% / 5.1%
Ape-DTS4C8G12658213.8% / 5.2%552% / 5.1%
Debezium4C8G405121.5% / 5.2%51.2% / 5.1%

测试二:增量数据迁移

同步方式节点规格RPS(Rows per Second)源 MySQL 负荷(CPU/内存)目标 MySQL 负荷(CPU/内存)
Ape-DTS1C2G1500218.8% / 5.2%467% / 6.5%
Ape-DTS2C4G2469218.1% / 5.2%687% / 6.5%
Ape-DTS4C8G2628718.2% / 5.2%685% / 6.5%
Debezium4C8G295120.4% / 5.2%98% / 6.5%

镜像对比

工具镜像大小
Ape-DTS86.4 MB
Debezium1.38 GB

如何使用 Ape-DTS 迁移 MySQL?

以下是 Ape-DTS 在 自建 MySQL 数据库迁移到 KubeBlocks MySQL 场景中的实际使用示例。

更多示例可参考: https://github.com/apecloud/ape-dts/tree/main/docs/en/tutorial。

配置文件差异总结

针对不同的任务,配置文件中的 extract_type, sink_type 等其他配置不同。

以下是一个简略的配置文件差异总结。更多具体配置,可参考官网上教程、模板及配置说明:https://github.com/apecloud/ape-dts。

任务类型extract_typesink_type特殊配置说明
库表结构迁移structstructdo_dbs指定需要迁移的数据库
全量迁移snapshotwriteparallel_type=snapshot全量抓取数据快照
增量同步cdcwriteserver_id, do_events基于 binlog 同步数据变更
数据校验snapshotcheck日志输出比较源库与目标库数据一致性
数据订正check_logwritecheck_log_dir指定校验结果日志的路径,用于订正任务
数据复查check_logcheckcheck_log_dir指定校验结果日志的路径

1. 准备工作

1.1 环境准备
工具准备

该示例中使用的 DTS_IMAGE 版本如下:

APE_DTS_IMAGE="docker.io/apecloud/ape-dts:2.0.12"
源库

用本地 Docker 搭建 MySQL。

docker run -d --name some-mysql-1 \
--platform linux/x86_64 \
-it \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD="123456" \
 "$MYSQL_IMAGE" --lower_case_table_names=1 --character-set-server=utf8 --collation-server=utf8_general_ci \
 --datadir=/var/lib/mysql \
 --user=mysql \
 --server_id=1 \
 --log_bin=/var/lib/mysql/mysql-bin.log \
 --max_binlog_size=100M \
 --gtid_mode=ON \
 --enforce_gtid_consistency=ON \
 --binlog_format=ROW \
 --default_time_zone=+08:00
  • 将主机的端口 3307 映射到容器的端口 3306
  • 设置 MySQL root 密码为 123456
  • 使用由 $MYSQL_IMAGE 指定的镜像。

记录源端的 URL:

url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
目标库

我们在 ACK 上使用 KubeBlocks 搭建了 MySQL 集群,更多集群运维操作可参考 KubeBlocks MySQL Examples。

  1. 创建集群。

    # 创建 MySQL 集群
    kbcli cluster create mycluster --cluster-definition mysql -n demo
    
  2. 暴露服务。这里我们通过 LoadBalancer 暴露服务地址。

    # 将集群暴露至公网
    kbcli cluster expose mycluster --type internet --enable=true -ndemo
    

查看到公网地址为: 47.xx.xx.xx,记录为你的 目标地址

记录目标端地址:

url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
1.2 数据准备

登录本地 MySQL,创建测试用的数据库和表。

mysql -h127.0.0.1 -uroot -p123456 -P3307

CREATE DATABASE test_db;
CREATE TABLE test_db.tb_1(id int, value int, primary key(id));
CREATE TABLE test_db.tb_2(id int, value text, primary key(id));

INSERT INTO test_db.tb_1 VALUES(1,1),(2,2),(3,3),(4,4);
INSERT INTO test_db.tb_2 VALUES(5,'a'),(6,'b'),(7,'c'),(8,'d');

2. 库表结构迁移

创建任务配置

请将以下示例配置中的 extractor.url 和 sinker.url 替换为前面记录的源端 URL 和目标端 URL。

核心配置:

  • extract_type=structsink_type=struct:表示迁移的是库表结构。
  • do_dbs:指定需要迁移的数据库。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
extract_type=struct
db_type=mysql
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled

[sinker]
sink_type=struct
db_type=mysql
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[filter]
do_dbs=test_db

[parallelizer]
parallel_type=serial

[pipeline]
buffer_size=100
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
"$APE_DTS_IMAGE" /task_config.ini 
检查目标库
  1. 登录目标库。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 查看数据。

    mysql> SHOW CREATE TABLE test_db.tb_1;
    mysql> SHOW CREATE TABLE test_db.tb_2;
    
3. 同步全量数据
创建任务配置

核心配置

  • extract_type=snapshot:表示全量迁移,抓取源数据库的快照。
  • sink_type=write:表示将数据写入目标数据库。
  • parallel_type=snapshotparallel_size:控制快照并发级别,提高全量迁移效率。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
db_type=mysql
extract_type=snapshot
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled

[sinker]
db_type=mysql
sink_type=write
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[filter]
do_dbs=test_db
do_events=insert

[parallelizer]
parallel_type=snapshot
parallel_size=8

[pipeline]
buffer_size=16000
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
"$APE_DTS_IMAGE" /task_config.ini 
检查目标库
  1. 登录目标库。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 检查数据。

    mysql> SELECT * FROM test_db.tb_1;
    +----+-------+
    | id | value |
    +----+-------+
    |  1 |     1 |
    |  2 |     2 |
    |  3 |     3 |
    |  4 |     4 |
    +----+-------+
    
    mysql> SELECT * FROM test_db.tb_2;
    +----+-------+
    | id | value |
    +----+-------+
    |  5 | a     |
    |  6 | b     |
    |  7 | c     |
    |  8 | d     |
    +----+-------+
    
4. 增量任务
创建任务配置

核心配置:

  • extract_type=cdc:表示增量同步,基于源库的 binlog 或 WAL 日志抓取数据变更。
  • sink_type=write:表示将数据写入目标数据库。
  • server_id:Ape-DTS 在该 MySQL 复制组中的标识,由用户指定,取值 [1-2^32 - 1],不得与该复制组中其他 server_id 相同。
  • do_events:指定需同步的事件类型(如 insert, update, delete)。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
db_type=mysql
extract_type=cdc
server_id=2000
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled

[filter]
do_dbs=test_db
do_events=insert,update,delete

[sinker]
db_type=mysql
sink_type=write
batch_size=200
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[parallelizer]
parallel_type=rdb_merge
parallel_size=8

[pipeline]
buffer_size=16000
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
"$APE_DTS_IMAGE" /task_config.ini 
修改源库数据
  1. 登录本地 MySQL。

    mysql -h127.0.0.1 -uroot -p123456 -uroot -P3307
    
  2. 修改数据。

    DELETE FROM test_db.tb_1 WHERE id=1;
    
    UPDATE test_db.tb_1 SET value=2000000 WHERE id=2;
    
    INSERT INTO test_db.tb_2 VALUES(9, 'f');
    
检查目标库
  1. 登录目标 MySQL。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 查看目标端数据。

    mysql> SELECT * FROM test_db.tb_1;
    +----+---------+
    | id | value   |
    +----+---------+
    |  2 | 2000000 |
    |  3 |       3 |
    |  4 |       4 |
    +----+---------+
    
    mysql> SELECT * FROM test_db.tb_2;
    +----+-------+
    | id | value |
    +----+-------+
    |  5 | a     |
    |  6 | b     |
    |  7 | c     |
    |  8 | d     |
    |  9 | f     |
    +----+-------+
    

    可以看到增量数据都已经同步了。

5. 数据校验
在目标端修改数据
  1. 登录目标 MySQL。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 在目标端修改数据,构造和源库的差异。

    DELETE FROM test_db.tb_1 WHERE id=4;         # 删除tb_1数据
    UPDATE test_db.tb_1 SET value=1 WHERE id=2;  # 修改tb_1数据
    
    DELETE FROM test_db.tb_2 WHERE id=5;         # 删除tb_2数据
    
创建任务配置

核心配置

  • extract_type=snapshot:校验基于源库的全量数据快照。
  • sink_type=check:表示校验目标库与源库数据是否一致。
  • 输出日志:校验的差异会记录在日志文件中(如缺失数据和不一致的数据)。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
db_type=mysql
extract_type=snapshot
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled

[sinker]
db_type=mysql
sink_type=check
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[filter]
do_dbs=test_db
do_events=insert

[parallelizer]
parallel_type=rdb_check
parallel_size=8

[pipeline]
buffer_size=16000
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
-v "/tmp/ape_dts/check_data_task_log/:/logs/" \
"$APE_DTS_IMAGE" /task_config.ini 
查看校验结果

源库为基准,检查目标库的数据缺失和不同,校验结果以日志文件输出。

  1. 检查数据缺失。

    cat /tmp/ape_dts/check_data_task_log/check/miss.log
    

    可以看到具体的缺失数据信息。

    {"log_type":"Miss","schema":"test_db","tb":"tb_1","id_col_values":{"id":"4"},"diff_col_values":{}}
    {"log_type":"Miss","schema":"test_db","tb":"tb_2","id_col_values":{"id":"5"},"diff_col_values":{}}
    
  2. 检查数据差异。

    cat /tmp/ape_dts/check_data_task_log/check/diff.log
    

    可以看到输出如下,diff_col_values展示了差异的具体内容。

    {"log_type":"Diff","schema":"test_db","tb":"tb_1","id_col_values":{"id":"2"},"diff_col_values":{"value":{"src":"2000000","dst":"1"}}}
    
6. 数据订正
  • 根据校验日志,反查源库,订正目标库。
创建任务配置

核心配置

  • extract_type=check_log:表示基于校验日志执行数据订正任务。
  • sink_type=write:将订正后的数据写回目标库。
  • check_log_dir:指定校验日志的路径,用于订正任务。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
db_type=mysql
extract_type=check_log
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
check_log_dir=./check_data_task_log

[sinker]
db_type=mysql
sink_type=write
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[filter]
do_events=*

[parallelizer]
parallel_type=rdb_check
parallel_size=8

[pipeline]
buffer_size=16000
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
-v "/tmp/ape_dts/check_data_task_log/check/:/check_data_task_log/" \
"$APE_DTS_IMAGE" /task_config.ini 
查看订正后的结果
  1. 登录目标库。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 查看数据。

    mysql> SELECT * FROM test_db.tb_1;
    +----+---------+
    | id | value   |
    +----+---------+
    |  2 | 2000000 |
    |  3 |       3 |
    |  4 |       4 |
    +----+---------+
    
    mysql> SELECT * FROM test_db.tb_2;
    +----+-------+
    | id | value |
    +----+-------+
    |  5 | a     |
    |  6 | b     |
    |  7 | c     |
    |  8 | d     |
    |  9 | f     |
    +----+-------+
    

    可以看到目标端被删除和更新的数据,都已经被订正了。

7. 数据复查
  • 根据校验日志,反查源库,再次校验目标库
  • 和全量校验的区别在于校验数据的范围:数据复查限定在校验出的 缺失/不同 的数据
修改目标库数据,构造和源库的差异
  1. 登录目标库。

    mysql -h<目标地址> -uape_test -pApe123456789
    
  2. 修改数据。

    DELETE FROM test_db.tb_1 WHERE id=4;   # 删除tb_1数据
    
创建任务配置

核心配置

  • extract_type=check_log:基于校验日志。
  • sink_type=check 用于复查目标库数据。
  • check_log_dir:指定校验日志的路径。
cat <<EOL > /tmp/ape_dts/task_config.ini
[extractor]
db_type=mysql
extract_type=check_log
url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
check_log_dir=./check_data_task_log

[sinker]
db_type=mysql
sink_type=check
url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled

[filter]
do_events=*

[parallelizer]
parallel_type=rdb_check
parallel_size=8

[pipeline]
buffer_size=16000
checkpoint_interval_secs=1
EOL
启动任务
docker run --rm --network host \
-v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
-v "/tmp/ape_dts/check_data_task_log/check/:/check_data_task_log/" \
-v "/tmp/ape_dts/review_data_task_log/:/logs/" \
"$APE_DTS_IMAGE" /task_config.ini 
查看复查结果
  1. 查看数据缺失。

    cat /tmp/ape_dts/review_data_task_log/check/miss.log
    

    可以看到输入日志显示 {“id”:“4”} 缺失。

    {"log_type":"Miss","schema":"test_db","tb":"tb_1","id_col_values":{"id":"4"},"diff_col_values":{}}
    
  2. 查看数据差异。

  • /tmp/ape_dts/review_data_task_log/check/diff.log 为空,符合预期。

更多教程

  • 更多任务类型、教程、任务配置,请参考 Ape-DTS 主页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机&#xff1a;在有限的计算资源下进行扩散模型训练&#xff0c;同时保持质量和灵活性 引入跨注意力层&#xff0c;以卷积方式实现对一般条件输入&#xff08;如文本或边界框…

使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。 模拟&#xff1a;BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…

Leetcode 每日一题 219.存在重复元素 II

目录 问题描述 输入输出格式 示例 算法分析 过题图片 代码实现 复杂度分析 题目链接 总结 问题描述 给定一个整数数组nums和一个整数k&#xff0c;我们需要判断数组中是否存在两个不同的索引i和j&#xff0c;使得nums[i] nums[j]且|i - j| < k。如果存在这样的i和…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

PR的选择与移动

选择工具 可以选择序列上的剪辑&#xff0c;如果需要多选可以按住shift键选中多个剪辑 CtrlA&#xff1a;可以进行全选 编组 选中多个剪辑后“右键-编组“可以将所选的剪辑连接在一起。这时单击任意剪辑都可以选中全部 向前选择轨道工具与向后选择轨道工具 向前选择轨道工具…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…

Python3中赋值运算符说明二

一. 简介 前面文章简单学习了 Python3中一些赋值运算符&#xff0c;文章如下&#xff1a; Python3中赋值运算符上篇-CSDN博客 本文继续学习 Python3中另外一些赋值运算符。 二. Python3 中赋值运算符 1. Python3 中赋值运算符 前一篇文章简单学习了 Python3 中的一些赋值…

如何在 Ubuntu 22.04 上安装和使用 Apache Kafka

简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka&#xff0c;让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程&#xff0c;你将学会如…

群控系统服务端开发模式-应用开发-自动退出发送邮件

一、修改Redis配置文件 将redis.conf里面的notify-keyspace-events参数对应的值改为Ex&#xff0c;具体代码如下&#xff1a; notify-keyspace-events Ex 二、创建控制台命令 在根目录下config文件夹下找到console.php文件修改&#xff0c;具体代码如下&#xff1a; <?p…

前端篇 -- jQuery详细教程

jQuery教程 jQuery官网1.1 jQuery的基本介绍1.2 jQuery 基本开发步骤1.3 jQuery对象和DOM对象 1.3.1 jQuery对象的基本介绍1.3.2 DOM对象转 jQuery对象1.3.3 jQuery对象转DOM对象 1.4 jQuery选择器 1.4.1 jQuery 基本选择器介绍1.4.2 基本选择器1.4.3 层次选择器1.4.4 基础过滤…

【数模学习笔记】模糊综合评价

声明&#xff1a;以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt&#xff0c;仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

相机(Camera)硬件组成详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 写在前面&#xff1a;可以去B站观看一些相机原理的视频来配合学习&#xff0c;这里推荐&#xff1a;推荐1&#xff0c;推荐2&#xff0c;推荐3 相机&#xff08;Camera&#xff09;是一种复杂的光…

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a; 文章目录 String1.String是什么&#xff1f;2.String怎么用&#xff1f;3.常用操作4.底层实现&#xff1f;5.总结&#xff08;重点&#xff09; String 1.String是什么&#xff1f; String就是字符串&…

乘上 SpringBoot 东风,广场舞团掀起律动热潮

2 系统开发环境 2.1 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以Java的发展迅速。…

组件开发的环境准备

目录​​​​​​​ node.js的安装 npm镜像源的修改 pnpm包管理器的安装&#xff08;全局安装&#xff09; 基于pnpm创建脚手架项目 node.js的安装 Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff0c;能够在服务器端执行 JavaScript 代码。 a.下载与安装 …

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

gitee常见命令

目录 1.本地分支重命名 2.更新远程仓库分支 3.为当前分支设置远程跟踪分支 4.撤销已经push远程的代码 5.idea->gitee的‘还原提交’ 需要和本地当前的代码解决冲突 解决冲突 本地工作区的差异代码显示 本地commit和push远程 6.idea->gitee的‘将当前分支重置到此…

Ultra-Fast-Lane-Detection复现、部署及训练

Ultra-Fast-Lane-Detection复现、训练及部署 一、复现二、训练三、部署 一、复现 Github下载源码&#xff1a;https://github.com/cfzd/Ultra-Fast-Lane-Detection &#xff08;1&#xff09;将GPU运算改为CPU运算&#xff1a;.cuda() -> .to(‘cpu’) test.py中33行&…

【Java计算机毕业设计】基于SSM+VUE宠物领养管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…