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 -> MySQL | PostgreSQL -> PostgreSQL | MongoDB -> MongoDB | Redis -> Redis | MySQL -> Kafka | PostgreSQL -> Kafka | MySQL -> StarRocks | MySQL -> ClickHouse | MySQL -> TiDB | PostgreSQL -> 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-DTS | 1C2G | 71428 | 8.2% / 5.2% | 211% / 5.1% |
Ape-DTS | 2C4G | 99403 | 14.0% / 5.2% | 359% / 5.1% |
Ape-DTS | 4C8G | 126582 | 13.8% / 5.2% | 552% / 5.1% |
Debezium | 4C8G | 4051 | 21.5% / 5.2% | 51.2% / 5.1% |
测试二:增量数据迁移
同步方式 | 节点规格 | RPS(Rows per Second) | 源 MySQL 负荷(CPU/内存) | 目标 MySQL 负荷(CPU/内存) |
---|---|---|---|---|
Ape-DTS | 1C2G | 15002 | 18.8% / 5.2% | 467% / 6.5% |
Ape-DTS | 2C4G | 24692 | 18.1% / 5.2% | 687% / 6.5% |
Ape-DTS | 4C8G | 26287 | 18.2% / 5.2% | 685% / 6.5% |
Debezium | 4C8G | 2951 | 20.4% / 5.2% | 98% / 6.5% |
镜像对比
工具 | 镜像大小 |
---|---|
Ape-DTS | 86.4 MB |
Debezium | 1.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_type | sink_type | 特殊配置 | 说明 |
---|---|---|---|---|
库表结构迁移 | struct | struct | do_dbs | 指定需要迁移的数据库 |
全量迁移 | snapshot | write | parallel_type=snapshot | 全量抓取数据快照 |
增量同步 | cdc | write | server_id , do_events | 基于 binlog 同步数据变更 |
数据校验 | snapshot | check | 日志输出 | 比较源库与目标库数据一致性 |
数据订正 | check_log | write | check_log_dir | 指定校验结果日志的路径,用于订正任务 |
数据复查 | check_log | check | check_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。
-
创建集群。
# 创建 MySQL 集群 kbcli cluster create mycluster --cluster-definition mysql -n demo
-
暴露服务。这里我们通过 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 -P3307CREATE 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=struct
和sink_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
检查目标库
-
登录目标库。
mysql -h<目标地址> -uape_test -pApe123456789
-
查看数据。
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=snapshot
和parallel_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
检查目标库
-
登录目标库。
mysql -h<目标地址> -uape_test -pApe123456789
-
检查数据。
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
修改源库数据
-
登录本地 MySQL。
mysql -h127.0.0.1 -uroot -p123456 -uroot -P3307
-
修改数据。
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');
检查目标库
-
登录目标 MySQL。
mysql -h<目标地址> -uape_test -pApe123456789
-
查看目标端数据。
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. 数据校验
在目标端修改数据
-
登录目标 MySQL。
mysql -h<目标地址> -uape_test -pApe123456789
-
在目标端修改数据,构造和源库的差异。
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
查看校验结果
以源库为基准,检查目标库的数据缺失和不同,校验结果以日志文件输出。
-
检查数据缺失。
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":{}}
-
检查数据差异。
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
查看订正后的结果
-
登录目标库。
mysql -h<目标地址> -uape_test -pApe123456789
-
查看数据。
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. 数据复查
- 根据校验日志,反查源库,再次校验目标库
- 和全量校验的区别在于校验数据的范围:数据复查限定在校验出的 缺失/不同 的数据
修改目标库数据,构造和源库的差异
-
登录目标库。
mysql -h<目标地址> -uape_test -pApe123456789
-
修改数据。
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
查看复查结果
-
查看数据缺失。
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":{}}
-
查看数据差异。
- /tmp/ape_dts/review_data_task_log/check/diff.log 为空,符合预期。
更多教程
- 更多任务类型、教程、任务配置,请参考 Ape-DTS 主页。
相关文章:
Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云
Ape-DTS 是一款高效、轻量级且功能强大的开源工具,专注于解决数据迁移、同步、校验、订阅与加工的需求。无论是将自建的 MySQL/PostgreSQL 数据库迁移到云端,还是在不同数据库间进行数据迁移,Ape-DTS 都能为您提供便捷且可靠的解决方案。它特…...
SpringBoot中使用MyBatis-Plus详细介绍
目录 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 2.定义Mapper(也叫dao)层的接口 3.MyBatis-Plus中常用注解 4. 使用MyBatis-Plus时要做如下配置 5.条件构造器 Wrapper 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 My…...
Buuctf Web题解
写在前面, 本人小白一枚,记录一下web做题过程,大部分为个人理解可能有些地方写的不够明确还请见谅。当然由于刚入手web题,所以有些题会没有思路,这时会参考其他大佬的题解过程。本文会一直更新,由于是第一次…...
Linux 支持多个spi-nor flash
1. 需求 通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。 2. 技术简介 对于spi-nor flash驱动通常不需要驱动开发人员手搓,一般内核会有一套固定的驱动,而且走的是内核的MTD子系统那一套,市…...
APP、小程序对接聚合广告平台,有哪些广告变现策略?
开发者对接聚合广告平台,可以让自身流量价值最大化,获得更多的广告曝光机会,对接单一的广告联盟容易造成广告填充不足,收益不稳定的问题。#APP广告变现# APP开发者根据应用的生命周期、用户特征和产品定位,选择最适合…...
RPC设计--应用层缓冲区,TcpBuffer
为什么需要应用层的buffer 为了方便数据处理,从fd上直接读写然后做包的组装、拆解不够方便方便异步发送,将数据写到应用层buffer后即可返回,让epoll即event_loop去异步发送。提高发送效率,多个小包可合并发送 buffer 设计 可以…...
微服务的问题
1.创建maven项目 然后配置对应的maven地址 2.创建父工程 删掉其中的src文件 在父pom中进行版本依赖和管理 如下图所示 3.在子文件中进行添加依赖 然后刷新maven进行下载...
开源模型应用落地-知识巩固-如何正确搭建生产级AI服务(一)
一、前言 将大语言模型集成至vllm,能够显著实现推理加速,让模型在处理任务时更加高效快捷,极大地提升了响应速度,减少用户等待时间。具体而言,一方面它能大幅提高吞吐量,vLLM 借助 PagedAttention巧妙地对attention中缓存的张量进行高效管理,从而达成比 HuggingFace Tra…...
Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)
Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码) 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…...
SpringSpringBoot常用注解
Spring 和 Spring Boot 是 Java 开发中广泛使用的框架,它们提供了许多注解来简化配置和开发过程。以下是一些 Spring 和 Spring Boot 中常用的注解: Spring 常用注解 Component 用于标注一个类为 Spring 容器的一个组件,Spring 会自动…...
【机器人】振动分析和控制工具之Bode图
Bode 图完整介绍 Bode 图由两个部分组成: 幅值图 (Magnitude Plot):描述系统对不同频率输入信号的增益大小(幅值响应)。相位图 (Phase Plot):描述系统输出信号相对于输入信号的相位差。 Bode 图的横轴是频率&#x…...
基于SpringBoot的“外卖点餐系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“外卖点餐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能图 用户功能界面 订单管理界面 配送单管理…...
第十七章 使用 MariaDB 数据库管理系统
1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代,互联网上每天都会生成海量的数据信息,数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量…...
sql多表联查图文
内连接(INNER JOIN) 语法: SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 表2.列名;示例: SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 表2.列名;左外连接(LEFT JOIN) 语法 SELECT 列名 FROM…...
网络安全——防火墙
基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…...
单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能
感谢您提供的详细日志信息。根据您的反馈,问题可能出在 pyautogui 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题: 1. **确保 pyautogui 正确执行点击操作**: - 我们将添加更多的调…...
图片底部空白缝隙解决法方案(CSS)
当我想实现一个垂直轮播图时,图片底部会出现一个空白缝隙导致切换轮播图片显示不完整。 这里可以用两个方法解决 一、给图片添加(垂直对齐)vertical-align:baseline|middle|top; vertical-align属性的值可以是 (1)关键字值:baseline|midd…...
URI 未注册(设置 语言和框架 架构和 DTD)
一、问题描述:在springboot项目中的resources中新建mybatis-config.xml文件时,从mybatis文档中复制的代码报错:URI 未注册(设置 | 语言和框架 | 架构和 DTD) 二、解决:在Springboot项目的设置->架构和DTD中添加 红色的网址&…...
STL-string类
目录 string类的意义 C语言原始的字符串 字符串类题目 string类 string类文档 auto和范围for auto是个关键字 范围for string类的接口 string的模拟实现 浅拷贝 深拷贝 写时拷贝 string类的意义 C语言原始的字符串 字符串是以\0结尾的字符的合集,为了方便操作,C标准库提…...
HTML前端开发-- Iconfont 矢量图库使用简介
一、SVG 简介及基础语法 1. SVG 简介 SVG(Scalable Vector Graphics)是一种基于 XML 的矢量图形格式,用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真,非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…...
C++的一些经典算法
以下是C的一些经典算法: 一、排序算法 冒泡排序(Bubble Sort) 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换…...
LNMP和Discuz论坛
文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...
华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的SGD优化器案例实现
SGD优化器基本原理讲解 随机梯度下降(SGD)是一种迭代方法,其背后基本思想最早可以追溯到1950年代的Robbins-Monro算法,用于优化可微分目标函数。 它可以被视为梯度下降优化的随机近似,因为它用实际梯度(从…...
μC/OS-Ⅱ源码学习(3)---事件模型
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始,进入事件源码的学习。 事件模型 在一个多任务系统里,各个任务在系统的统筹下相继执行,由于执行速度极快&a…...
UnityShaderLab 实现黑白着色器效果
实现思路:取屏幕像素的RGB值,将三个通道的值相加,除以一个大于值使颜色值在0-1内,再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现: ShaderLab实现: Shader "Bl…...
【Linux】文件管理必备知识和基本指令
【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要):06.rmdir指令 && rm 指令(重要):rmdir指令rm指令 0…...
移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX
演示地址: http://134.175.123.194:8811 admin admin 演示视频: https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报(内置Modbus TCP/RTU/ASCII,GPS协…...
CSS 浮动定位
浮动定位 float : 浮动定位 left 左浮动right 右浮动 clear : 清除浮动 leftrightboth 浮动定位会导致 元素脱离正常文档流 、 对应的 父 元素 也可能会产生 高度坍塌 。 解决 父元素 高度坍塌的方案有: 1) 父元素 添加 overflow , 值 为 除 visible 之…...
vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案
声明 因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7,后台为192.168.20.7:5480 后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来 第一阶段…...
Android Webview 详解
一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前:Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后:直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & 调用…...
如何使用程序查询域名whois信息?
直接使用TCP协议向WHOIS服务器的43端口发送查询请求即可返回WHOIS信息。 一些国际域名(.COM/.NET/.CC等)需要继续向各注册商的WHOIS服务服务发送查询请求来获取详细信息。 大部分New gTLD来说,服务器是“whois.nic.[后缀]”,例如.red的WHOIS服务器为whoi…...
解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败
😉 你好呀,我是爱编程的Sherry,很高兴在这里遇见你!我是一名拥有十多年开发经验的前端工程师。这一路走来,面对困难时也曾感到迷茫,凭借不懈的努力和坚持,重新找到了前进的方向。我的人生格言是…...
复杂系统如何架构?
一张图看懂整个后端系统架构 下图展示了整个后端系统架构,包括数据库、应用服务器、API网关等,展示了它们是如何协同工作的。 一些小贴士 CDN是现代互联网架构中不可或缺的一部分,特别是对于那些需要向全球用户提供高性能和高可用性服务的网站…...
leetcode 3224. 使差值相等的最少数组改动次数
题目链接:3224. 使差值相等的最少数组改动次数 题目: 给你一个长度为 n 的整数数组 nums ,n 是偶数 ,同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中,你可以将数组中任一元素替换为 0 到 k 之间的任一…...
C# 小案例(IT资产管理系统)
开发工具:visual studio 2022 语言:C# 数据库:Sql Server 2008 页面展示 一、登录 二、主窗体 三、用户管理 四、资产管理 五、关于 Java版地址:基于若依开发物品管理系统(springbootvue)_若依物品管理系统-CSDN博客 Python版…...
React第十四节useState使用详解差异
一、useState() Hook 使用 useState视图更新用法 1、写法: import { useState } from react const [name, setName] useState(Andy)利用数组解构写法, 第一个参数是自定义的属性,用于初始化时候渲染,如上面代码,初…...
ubuntu 安装 docker详细教程
1. 准备工作 1.1系统更新 sudo apt update sudo apt upgrade -y 1.2 检查系统版本 lsb_release -a 2.安装docker 2.1. 安装依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 2.2 添加docker 官方GPG密钥 curl -fsSL https…...
图书管理系统|Java|SSM|JSP| 前后端分离
【一】可以提供远程部署安装,包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、M…...
Apache Echarts和POI
目录 Apache ECharts 介绍 入门 绘制一个简单的图表 Apache POI 介绍 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 导出Excel表格 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观…...
ubuntu下的chattts 学习8(结束):长文本的语音转换优化及总结
代码 import ChatTTS import torch import numpy as np import torchaudio import re# 设置环境变量以避免内存碎片化 import os os.environ[PYTORCH_CUDA_ALLOC_CONF] expandable_segments:True# 使用 CPU 进行计算 device torch.device(cpu)chat ChatTTS.Chat() chat.loa…...
Luckysheet 实现 excel 多人在线协同编辑(全功能实现增强版)
前言 感谢大家对 Multi person online edit(多人在线编辑器) 项目的支持,mpoe 项目使用 quill、luckysheet、canvas-editor 实现的 md、excel、word 在线协同编辑,欢迎大家Fork 代码,多多 Start哦~ Multi person online edit 多人协同编辑器…...
最新VMware Workstation Pro领先的免费桌面虚拟化软件基于 x86 的 Windows 桌面虚拟化软件下载安装保姆级教程,直接下载,持续更新
目录 说明 安装程序下载 方法一:直接下载 方法二:官网下载 安装教程 说明 这几天重装电脑,想装VMware Workstation,搜了之后才发现它竟然对个人用户免费了,一个字:爽!终于可以结束百度序列号…...
GitHub使用
太久不用GitHub发现自己又有些不会了,突发奇想为何不把每次看到的有指导意义的博客收录一下以便下次查阅呢 如何上传文件夹到GitHub上(配图详解)?_github上傳資料夾-CSDN博客 github上如何删除自己的仓库_github删除仓库-CSDN博…...
阿里云服务器Linux(centos)系统安装nginx1.20.2
阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖(基于c语言) yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载:http://nginx.org/en/do…...
linux 用户名密码设置
安装linux时默认的密码最小长度是5个字节,但这并不够,要把它设为8个字节。修改最短密码长度需要编辑login.defs文件#vi /etc/login.defs PASS_MAX_DAYS 99999 ##密码设置最长有效期(默认值) PASS_MIN_DAYS 0 ##密…...
MySQL是否可以配合Keepalived实现高可用
MySQL是否可以配合Keepalived实现高可用 是的,MySQL 可以配合 Keepalived 实现高可用性。通常,使用 Keepalived 与 MySQL 配合的方式主要是通过配置 虚拟IP(VIP) 来实现主从数据库的自动切换,从而保证在主数据库宕机时…...
windows下 mysql开启 binlog日志
一、查看是否开启 binlog -- 方式一 show binary logs;-- 方式二 show VARIABLES like log_bin 说明没有开启 方式一 :you are not using binary logging 方式二:log_bin off 二、编辑 my.ini 配置文件 默认安装地点位于:C:\ProgramDat…...
59. 螺旋矩阵 II
59. 螺旋矩阵 II class Solution { public:vector<vector<int>> generateMatrix(int n) {// for(int i0;i<n;i){ 这样的遍历方式不对// for(int j 0;j<n;j){// generateMatrix[i][j] // }// } //初始化矩阵vector<vector<int&…...
XML 查看器:深入理解与高效使用
XML 查看器:深入理解与高效使用 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它通过使用标签来定义数据结构,使得数据既易于人类阅读,也易于机器解析。在本文中,我们将探讨 XML 查看器的功能…...
JDBC学习
配置文件 application.yml spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/rbac?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTC driver-class-name: com.mysql.jdbc.Driverrbac为我自己本地的数据库&…...