MongoDB 备份与恢复综述
目录
一、基本概述
二、逻辑备份
1、全量备份
2、增量备份
3、恢复
三、物理备份
1、cp/tar/fsync
2、WiredTiger 热备份
3、恢复
四、快照备份
一、基本概述
MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引功能。MongoDB 的设计目标是提供高性能、高可用性和易扩展性,广泛应用于各种类型的应用程序中。然而,任何数据库系统都有可能面临数据丢失的风险,因此备份是确保数据安全和可恢复性的重要手段。
备份的重要性不言而喻,它不仅可以保护数据免受硬件故障、软件错误或人为操作失误的影响,还可以在灾难发生时快速恢复业务运营。对于 MongoDB 来说,备份尤其重要,因为它通常用于处理大量数据和高并发访问,一旦出现问题,可能会导致严重的业务中断和数据丢失。
关于 Mongodb 数据库备份,可从逻辑备份、物理备份和快照备份三个方面进行介绍。
Database Layer | mongodump | 逻辑备份 |
File System Layer | cp/tar、fsync | 物理备份 |
Volume/Block Layer | lvm snapshot、第三方快照驱动 | 快照备份 |
(1)逻辑备份是通过导出数据库中的数据到一个文件或一组文件中来实现的。在 MongoDB 中,可以使用 mongodump
工具来进行逻辑备份。mongodump
会将数据库中的每个集合导出为一个 BSON 文件,同时还会生成一个元数据文件,记录集合的名称和其他信息。
逻辑备份的优点是可以跨平台使用,并且可以很容易地恢复到不同的 MongoDB 实例上。缺点是备份过程可能会影响数据库的性能,并且在大型数据集上可能需要较长的时间来完成备份,恢复时速度很慢,特别是回放 oplog 时,速度~非常~非常~非常~慢。
(2)物理备份则是直接复制数据库的文件系统,包括数据文件、日志文件和配置文件等。在 MongoDB 中,可直接拷贝文件系统内数据文件来实现物理备份的,但是不支持热备份。有第三方厂商基于 MongoDB 存储引擎 WiredTiger 原生热备份进行定制,支持热备份。
物理备份的优点是速度快,因为它不需要遍历整个数据库来导出数据,而是直接复制文件。此外,物理备份通常可以在数据库运行时进行,对性能的影响较小。缺点是物理备份可能无法跨平台使用,因为不同操作系统的文件系统格式可能不同。另外,如果数据库在备份过程中发生了变化,那么备份的数据可能不是完全一致的,所以备份过程中需要对数据库加锁,避免数据写入。
(3)快照备份是一种结合了逻辑备份和物理备份特点的方法。它通过创建数据库的快照来实现备份,这个快照包含了数据库在某个时间点的状态。在 MongoDB 中,可以使用 LVM(Logical Volume Manager)或其他存储层的快照功能来实现快照备份。
快照备份的优点是可以提供几乎实时的备份,因为快照的创建速度非常快。此外,快照备份可以在不中断数据库服务的情况下进行。缺点是快照备份依赖于底层存储系统的支持,不是所有的存储系统都支持快照功能。另外,如果数据库在快照之后发生了更改,那么这些更改不会反映在快照中。
二、逻辑备份
mongodump 是 mongo 集成的备份与恢复工具,功能也是十分的强大,其与 mongorestore 配合可以完成大多数场景的数据备份。不过在使用之前需要仔细的阅读相关文档,并实际操作测试其功能特性。而且需要注意,随着不同数据库的版本迭代,该工具的一些功能也会随之变化,需要考虑一些参数的兼容性,和 json 版本的迭代。
使用 mongodump 可以对数据库进行全量备份与增量备份,这个可以在网上搜到很多脚本例子。但其还是存在一些功能缺陷,不过好在其在 github 上开放了源码(golang),用户可以基于其源码根据自己的需求进行修改。
该方案的一个不可忽略的缺点就是性能太低了,远远不如物理备份。虽然可以备份的时候可以集合为单位进行多进程并发,但对数据库的负载也随之增大。所以很多厂商在做灾备产品时都不会考虑它。
1、全量备份
1. 导出数据库 db1 中的集合 t1 至同目录下的dump文件夹下./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t12. 导出至指定同目录下自定义的文件夹./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o selfdir3。 以集合为单位将备份数据输出到 stdout,实现流式备份./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o -
2、增量备份
需要数据库开启 oplog,通过按时间导出 local.oplog.rs 中的 oplog 数据实现增量备份。
可以配合 query 进行数据过滤,比如 时间戳、操作或数据空间的过滤。
./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d local -c oplog.rs --query '{ts:{$gte:Timestamp(1660014692, 1)}, op:{$ne:"n"}}'
3、恢复
恢复时需要使用 mongorestore 工具,恢复增量数据时,需要回放 oplog 日志。
# 恢复集合数据
mongorestore --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin ./13-34/db1/t1.bson
# 回放日志
mongorestore --host 127.0.0.1:27017 --oplogReplay --dir deltaBK/ --oplogFile deltaBK/oplog.rs.bson
三、物理备份
物理备份目前看只支持全量备份。在物理备份期间需要加锁,防止数据库数据写入。
1、cp/tar/fsync
# 1、加锁
db.fsyncLock();
# 2、执行备份操作
cp /usr/local/mongodb/data /backupdir/full
# 3、解锁
db.fsyncUnlock();
2、WiredTiger 热备份
Mongodb 原生数据库不支持物理热备份,但是 WiredTiger 存储引擎是支持热备份的,但是该存储引擎存在一个问题,在热备份过程中,若有数据写入,磁盘空间会快速增长。MongoDB 的保守做法是不支持热备份。
很多第三方厂商(例如 Percona MongoDB、阿里云 MongoDB)基于 WiredTiger 存储引擎(开源)热备份进行了定制,直接支持物理热备份。
3、恢复
恢复时就很简单了,将原生文件拷贝到目标路径下,重新编辑数据库配置文件,重新拉起数据库。
若灾备环境是副本集群,则需要进行如下设置。
# 副本集群下要调整数据库,删除 local 数据库后重启并初始化副本集群
mongod --dbpath /data/db
rs1:PRIMARY> use local
rs1:PRIMARY> db.dropDatabase()
rs1:PRIMARY> use admin
rs1:PRIMARY> db.shutdownServer({force: true})mongod --dbpath /data/db --replSet <replName>
mongo
# 初始化副本集群
rs.initiate( {_id : <replName>,members: [ { _id : 0, host : <host:port> } ]
})
# 若还需要添加从节点,则继续执行
rs.add( "10.90.9.101 : 27018" )
rs.add( "10.90.9.103 : 27018" )
四、快照备份
使用快照工具对数据库数据文件所在卷进行快照操作。下面以 LVM Snapshot 为例。除了本博客介绍的流程以外,还可参考官方教程:
使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linux LVM 快照是 Linux 系统中的一种数据备份技术,用于在特定时间点对逻辑卷进行“瞬间影像”保存。它通过写时复制(COW)技术实现,初始时几乎不占用额外空间,仅记录少量元数据,并与源逻辑卷共享数据块。当源逻辑卷中的数据发生变化时,LVM会将原始数据块的内容复制到快照区域,确保快照始终反映创建时刻的数据状态。这种机制使得快照能够高效利用存储空间,同时保证数据的一致性和可追溯性。在实际应用中,LVM快照常用于数据备份、恢复以及系统测试等场景。
关于快照的详细知识点,可以参考之前写的博客。
快照技术的基本介绍-CSDN博客https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450 我需要备份的数据存放在 /usr/local/mongodb 目录下,需要使用快照对其所在卷进行备份。
详细步骤如下所示,需要注意,目标目录空间需要充足,需要可以完全存放数据库数据所在卷。做快照时 VG 需要有足够的剩余空间。
# 1、查看挂载目录分布,可执行 df -f 或 mount 命令,数据库数据存放在 /usr/local 下,所以我们需要备份 /dev/mapper/centos-root 卷
[root@localhost ~] df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 6.1G 44G 13% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 13M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 1014M 170M 845M 17% /boot
/dev/mapper/centos-home 42G 37M 42G 1% /home
tmpfs 781M 12K 781M 1% /run/user/42
tmpfs 781M 0 781M 0% /run/user/0# 2、创建数据库数据所在 lv 的快照,该快照随着数据库的写入会持续增长
[root@localhost ~] lvcreate --size 10GB --snapshot --name root-snap01 /dev/mapper/centos-rootLogical volume "root-snap01" created.
# 查看 lv 列表
[root@localhost ~] lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Converthome centos -wi-ao---- <41.12groot centos owi-aos--- 50.00groot-snap01 centos swi-aos--- 10.00g root 7.76swap centos -wi-ao---- <7.88g# 3、备份卷数据,快照关联的 lv 卷的全部数据,不是快照数据本身,是快照关联的卷的全部数据,所以备份集占用的空间是该卷的大小
# 可压缩快照数据
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 | gzip > /home/mongodb_snap01.gz
# 或者 dd 将数据重定向到别的路径下
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 of=/root/bkdir/mongodb_snap01# 4、查看备份数据
[root@localhost mongo-dir] du -h /root/bkdir/mongodb_snap01
51G /root/bkdir/mongodb_snap01
恢复过程可参考官方流程。大致是先在目标机上创建 lv 卷,注意不需要格式化,直接将备份的数据卷文件写入创建的 lv 卷,之后挂载到文件系统中访问,重新配置数据库即可,配置数据库的过程可参考上一章“物理备份”的恢复流程。
使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshot
相关文章:

MongoDB 备份与恢复综述
目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引…...
node.js 文件操作
在 Node.js 中,文件操作主要通过内置的 fs(File System)模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换
形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀(Erosion) 腐蚀操作通过消除图像边界来减少图像中的白色区域(前景),使物体的边…...
Spark SQL中的from_json函数详解
Spark SQL中的from_json函数详解 在Spark SQL中,from_json是一个用于解析JSON数据的函数,主要用于将JSON格式的字符串解析为结构化的数据(即StructType或其他Spark SQL数据类型)。这个函数在处理半结构化数据(如JSON日…...
【软件架构】软件的十二种架构简介
软件的十二种架构简介 一、软件的12种架构 1. 单体架构 (Monolithic Architecture)2. 分层架构 (Layered Architecture)3. 事件驱动架构 (Event-Driven Architecture)4. 微服务架构 (Microservices Architecture)5. 服务导向架构 (Service-Oriented Architecture, SOA)6. 客户…...

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
日历热力图,月度数据可视化图表,vue组件 先看效果👇 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间,开始时间是 上一年的今天,例如2024/01/01 —— 2025/01/01,跨度刚…...
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
在Vue 3中,导航守卫(Navigation Guard)用于拦截路由的变化,可以在用户访问页面前进行检查。结合Axios进行token认证机制时,我们可以通过导航守卫在路由跳转时,检查用户的认证状态,确保用户有有效…...
【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程
前言 在大数据和网络爬虫领域,Scrapy 是一个功能强大且广泛使用的开源爬虫框架。它能够帮助我们快速地构建爬虫项目,并高效地从各种网站中提取数据。在本篇文章中,我将带大家从零开始使用 Scrapy 框架,构建一个简单的爬虫项目&am…...

一分钟学习数据安全——白盒加密及安当应用
白盒加密作为一种先进的加密技术,在数据安全、通信安全和信息隐私保护等多个关键领域都有应用。这次的一分钟,让您快速了解一下白盒加密的概念,以及安当产品中的白盒加密应用。 一、什么是白盒加密 简单来说,白盒加密是一种特殊…...

composer安装指定php版本, 忽略平台原因导致的报错
windows下 //composer安装指定php版本, 写出完整的php和composer.phar路径 D:\phpstudy_pro\Extensions\php\php8.1.11nts\php.exe D:\phpstudy_pro\Extensions\composer1.8.5\composer.phar install windows下一些扩展不支持, 如下图, 所以本地composer安装组件时可以忽略 …...
Java 前端详解
Java 前端详解 Java 前端开发主要涉及使用 Java 相关技术和框架来创建用户界面和处理用户交互。虽然 Java 原本是后端开发的主力语言,但它也提供了许多前端开发工具和框架。以下是 Java 前端开发的主要内容和技术栈。 一、Java 前端技术栈 Java Swing 和 AWT AWT (…...

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象
在启动调试或运行应用/服务时,安装HAP出现错误,提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权,但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…...
Javaweb之css
css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...
实施工程师:面试基础宝典
一.运维工程师和实施工程师的区别:工作内容不同、职能不同、工作形式不同 1.工作内容不同: 运维工程师要对公司硬件和软件进行维护。 硬件包括:机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…...

react install
react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤: 使用 Create React App Create React App 是一个官方支持的命令行工具,用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…...

ElasticSearch DSL查询之排序和分页
一、排序功能 1. 默认排序 在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…...
uniapp封装websocket
WebSocket介绍 后端使用的是springbootnetty做websocket的服务端,参考我其他博文 项目使用场景 开发uniapp项目时,需要进行实时通信,比如聊天等。需要封装一个工具类,统一对socket进行管理。 uniapp websocket官方文档࿱…...

【Linux】18.Linux进程控制(2)
文章目录 3. 进程程序替换3.1 单进程版 -- 看看程序替换3.2 替换原理3.3 替换函数函数解释命名理解 3.4 多进程版 -- 验证各种程序替换接口3.5 自定义shell 3. 进程程序替换 3.1 单进程版 – 看看程序替换 makefile mycommand:mycommand.cgcc -o $ $^ -stdc99 .PHONY:clean …...

reactor框架使用时,数据流请求流程
1. 我们在Flux打开时,可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…...
读西瓜书的数学准备
1,高等数学:会求偏导数就行 2,线性代数:会矩阵运算就行 参考:线性代数--矩阵基本计算(加减乘法)_矩阵运算-CSDN博客 3,概率论与数理统计:知道啥是随机变量就行...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...