数据备份技术知识梳理(建议收藏)

2023-11-18

所谓数据保护技术是指对当前时间点上的数据进行备份,如果说原始数据被误删除了,可以通过备份数据找回或恢复数据。从底层来分,数据保护可以分为文件级保护和块级保护。

文件级备份

文件级备份:将磁盘上所有文件通过调用文件系统接口备份到另一个介质上。也就是把数据以文件形式读出,然后存储在另一个介质上面。此时备份软件只能感知到文件这一层。

我们知道一般来说,文件在原来的介质上,可以是不连续存放的,通过文件系统来管理和访问。当备份到新的介质上以后,文件完全可以连续存放。正因为如此,没有必要备份元数据,因为利用新介质进行恢复的时候,反正会重构文件系统。

块级备份

块级备份:就是不管块上是否有数据,不考虑文件系统的逻辑,备份块设备上的每个块。

这样好处是不通过调用文件系统接口,速度更快,缺点的是备份的时候会把所有的块复制一遍,但是实际上很多扇区的数据是不对应真实文件的,也就是会备份很多僵尸扇区。而且备份之后,原来不连续的文件一样是不连续的文件,有很多的碎片。

远程文件复制

远程文件复制:通过网络传输到异地容灾点。典型的代表是rsync异步远程文件同步软件。可以监视文件系统的动作,将文件的变化,同步到异地站点。增量复制。


远程卷镜像

这是基于的远程备份。与远程文件复制不同的地方在于,是把块数据备份到异地站点。又可以分为同步和异步复制。

  • 同步复制:必须等数据复制到异地站点以后,才通报上层IO成功消息

  • 异步复制:写入成功即可回复成功,然后通过网络传输到异地。不能保证一致性,但是上层响应快。

基于块的备份措施,一般都是在底层设备上进行,不耗费主机资源。


快照技术

远程镜像确实是对生产数据一种非常好的保护,但是需要镜像卷一直在线,主卷有写IO,那么镜像卷也需要有写IO。

如果想对镜像卷进行备份,需要将停止主卷的读写,然后将两个卷的镜像关系分离。所以当恢复主卷的IO的时候,镜像卷不会再被读写。然后才可以备份镜像卷的数据。

这样会存在一个问题,主卷上还继续有IO,将会导致数据与备份的镜像不一致。所以主卷上所有的写IO动作,会以位图BitMap方式记录下来,BitMap上的每个位表示卷上的一个块,0表示未写入,1表示已写入,所以当拆分镜像以后,被写入了数据,程序将BitMap文件对应位从0变为1。备份完成以后,再做数据同步即可。

可以看出上述过程比较的繁琐,而且需要占用一块和主卷一样大小的镜像卷。

快照技术就是为了解决这种问题,其基本思想是抓取某一时间点磁盘卷上的所有数据。

快照分为:基于文件系统的快照和基于物理卷的快照,下面介绍一下快照的底层原理。

基于文件系统的快照

文件系统管理的精髓:链表、B树、位图,也就是元数据。

文件系统

  • 将扇区组合成更大的逻辑块来降低管理规模。NTFS最大块可以到4KB,也就是8个扇区一组一个簇(Block),这样可以减少管理成本。

  • 文件系统会创建所管理存储空间上所有簇的位图文件。每个位代表卷上的簇(或者物理扇区)是否被使用,如果被使用,则置1。

  • 文件系统保存一份文件和其对应簇号的映射链。因为映射链本身和簇位图也是文件,也有自己的映射链,所以针对重要的元数据,有一个固定的入口: root inode

写入新数据

  • 查找簇位图,找位值为0的簇号

  • 计算所需空间, 分配簇号给文件

  • 将数据写入簇,再去文件——簇号映射图更新

  • 将对应的簇映射关系记录下来,到簇位图将对应位置改为1。

删除数据

  • 直接在簇号映射链中抹掉

  • 簇位图对应簇改为0。

可以看出删除数据实际上不会抹掉实际的数据。所以,最重要的不是数据,而是文件——簇号映射链和位图等元数据。

也就是说我们要做备份,只需要把某时刻的文件系统中的映射图表保存下来。但是必须保证卷上的数据不被IO写入了,同时又要不应用还不能中断。既然原来的空间不能再写了,我们可以写到其他的空闲区域。

  • 思路一:Copy on First Write (CoFW),在覆盖数据块之前,需要将被覆盖的数据块内容复制出来,放到空闲的空间。

  • 系统中将有两套元数据链,原来的元数据指向当前,快照的元数据链指向历史。原来的存储空间永远是最新的数据,历史数据会逐渐搬出到空闲空间里面。

  • 思路二:Redirect on First Write (RoFW)。先复制元数据,然后将针对源文件的更改都重定向到空余空间,同时更新元数据

  • CoFW不同的是,原来的数据块不会被覆盖。同样的,系统也有两套元数据,一套是快照保存下来的,永远不更新,一套是源文件系统的,不断的更新。

其实只有首次覆盖的时候,才重定向,因为重定向以后的数据块,哪怕被覆盖了,也不影响之前快照保存的数据了。

到这一步,看上去挺完美,实际上存在一个问题: 如果元数据特别大怎么办?对于海量庞大的文件系统,元数据量可能到GB级别。如果复制的话,时间上仍然太多。

我们可以回头想想,实际上元数据可以看做指针,指向具体存储的位置。我们复制到元数据,相当于复制了一堆指针。现在元数据太多了,我们能不能把这个元数据链的指针给复制了?当然可以,元数据有个根入口块,或者称为Super Block,这个块是固定不变的,里面存放有指向下一级元数据链块的指针。

那么操作系统每次载入元数据的时候,都需要从这个地址读入Super Block,从而一层一层的遍历。

基于物理卷的快照

基于物理卷的快照比文件系统快照要简单得多。因为LUN一般在底层磁盘上是恒定的,不像文件系统一样可以随机细粒度的分布。所以可以认为LUN的元数据就是在底层磁盘的起始和结束地址。这样在快照的时候,需要复制的元数据就更少了,但是完成了以后,需要按照一定粒度来做CoFW或者RoFW,还需要记录更多数据映射指针,就比较难受了。

对于实现了块级虚拟化的系统如NetApp、XIV、3PAR等,它们的LUN在底层位置是不固定的,LUN就相当于一个文件,存在元数据链来进行映射管理的维护,所以这些系统实现快照的原理与文件系统快照类似。

基于物理卷的快照,相当于给物理卷增加了“卷扇区映射管理系统”。在底层卷实现快照,可以减轻文件系统的负担。

卷扇区方都是用LBA来编号的,实现快照的时候,程序首先保留一张初始LBA表,每当有新的写入请求的时候,重定向到另一个地方,并在初始的LBA表中做好记录,比如:

原始LBA:卷A的10000号,映射到LBA:卷B的100号。

值得说明的是,文件系统无法感知重定向,文件系统在它的映射图里面还是记录了原始的LBA地址。此时如果来了新的写IO,有两种方式一种是Write Redirect,另外一种是Copy on Write

所谓Write Redirect就是将文件系统的读写请求,重定向到卷B,这样每次IO其实都会查找快照映射表,降低了性能。所以引入了Copy on Write。

所谓Copy on write,就是当写请求来的时候,先把原来的扇区的数据复制一份到空闲卷,然后将新数据写入原卷。不过这种复制操作只发生在原卷某个或者快照之后从未更新过的块上面,若是某个块在快照之后更新过了,说明之前的数据已经转移走了,可以放心的覆盖。

所以Copy on Write实际上是让旧数据先占着位置,等新数据来了以后先把原来的数据复制走,再更新,而且一旦更新了一次,可以直接覆盖。

带来的好处是 ,原卷上的数据随时是最新的状态,每个IO可以直接访问原卷的地址,而不需要遍历映射表。


RoFW方式与CoFW方式比较

不管是RoFW还是CoFW,只要上层向快照后没有更新过的数据块进行写,都需要占用一个新的块。所以如果将所有扇区块都更新了,新卷的容量和原来的容量应该一样大,但是通常不会覆盖百分之百,所以只要预设原容量的30%即可。

IO资源消耗:

  • CoFW方式下,如果要更新一个从未更新的块,需要复制出来,写到新卷,然后覆盖原来的块,需要一次读,2写

  • RoFW方式下,只需要一次写即可,也就是直接重定向到新卷上,然后更新映射图中的指(在内存中进行)。

所以RoFW相对CoFW方式在IO资源消耗与IO延迟上有优势。

由于只有首次覆盖才会Copy或者Redirect,那么如何区分是否是首次覆盖呢?可以使用记录表(文件级快照)或者位图(卷快照)来记录每个块是否被覆盖过。

对于读IO:

  • CoFW:因为总是更新的源卷,所以源卷总是代表最新的状态,所以任何读IO都会发到源来执行。

  • RoFW:需要首先查询位图来确定目标地址是否被处理过,如果是,则转向重定向后的地址。

RoFW会影响读性能,因为重定向出去以后,数据块排布都是乱的,如果把快照删除后,不好清理战场,严重影响后续的读写性能。

综合来说,RoFW比较吃计算资源,而CoFW比较耗费IO资源。我们知道其实一般来说读比写多,当覆盖第二次以后:

  • CoFW不会发生IO惩罚,读IO一直没有惩罚

  • 对于RoFW,就算完全被Redirect过了,对于读或者写IO,均需要遍历位图,永远无法摆脱对计算资源的消耗。

尤其在LUN卷级快照下,原本卷在底层磁盘分布式是定死的,寻址非常迅速。但是RoFW引入了,LUN的块随机定向到其他的空间的,所以需要记录新的指针链,而且被写出的块不是连续排列的。对性能影响非常明显的。

绝大多数的厂商使用的还是CoFW,但是一些本来就使用LUN随机分块分布模式的存储系统比如XIV、NetApp等,都使用RoFW,因为原本其LUN的元数据链就很复杂,而且原来就是随机分布的,RoFW的后遗症对它们反而是正常的。


快照的意义

快照所保存下来的卷数据,相当于一次意外掉电之后卷上的数据。怎么理解?

上层应用和文件系统都有缓存,文件系统缓存的是文件系统的元数据和文件的实体数据。每隔一段时间(Linux一般是30s)批量Flush到磁盘上。而且不是只做一次IO,有可能会对磁盘做多次IO。如果快照生成的时间恰恰在这连续的IO之间,那么此时卷上的数据实际上有可能不一致。

文件系统的机制是先写入数据到磁盘,元数据保存在缓存里面,最后再写元数据。因为如果先写元数据,突然断电了,那么元数据对应的僵尸扇区的数据会被认为是文件的,显然后果不堪设想。

总之,快照极可能生成不一致的数据。

那么为什么还要用快照呢?

  • 因为快照可以任意生成,而且占用的空间又不大,更重要的是可以在线恢复,不用停机只需要在内存中做IO重定向,那么上层访问就变成以前时间点的数据了。

但是快照会存在不一致的问题,如何解决?既然快照无异于一次磁盘掉电,那么利用快照恢复数据之后,文件系统可以进行一致性检查,数据库也会利用日志来使数据文件处于一致。

另外,现在主流的快照解决方案是在主机上安装一个代理执行快照前,先通知文件系统将缓存中的数据全部Flush到磁盘,然后立即生成快照。

  • 快照还可以预防数据逻辑损坏,也就是比如T1时刻,做了快照,T2时刻,因为管理员操作不当,误删了一个文件,T3的时候,进行了全备份操作。此时,这个文件看似永久丢失了,其实,此时还可以通过快照恢复这个文件。

  • 快照还可以降低一致性备份的窗口。如果没有快照,要对某个卷进行一致性备份,需要暂停写IO,所以备份窗口比较长,需要等待备份停止以后才能继续写IO。使用快照的话,只需要复制元数据,然后在后台进行备份,降低了影响。

  • 备份完毕以后,如何能检测数据是否是真一致的?若没有快照,需要将备份数据恢复到独立的物理空间里面,挂载到另一台机器上。有了快照,可以将快照直接挂载到另一台主机,避免了数据物理恢复导入的过程。

卷Clone技术

快照类似于某时刻的影子,而克隆则是某时刻的实体。每时刻生成了一份可写的快照,就叫对卷某时刻的一份Clone。然后这份Clone内容每被修改的部分是与源卷共享的,所以源卷没了,则Clone就没了,所以叫虚拟Clone。如果把数据复制出来,生成一个独立的卷,则就叫Split Clone,也就是可以得到实Clone

卷Clone最大的好处在于可以瞬间生成针对某个卷可写的镜像,而不管卷的数据量有多大。数据备份系统的基本要件:

  • 备份对象:需要进行备份的备份源。

  • 备份目的:磁盘、磁带等介质

  • 备份通路:网络

  • 备份执行引擎:备份软件

  • 备份策略

下面重点介绍一下备份目的、备份通路、备份引擎等技术细节。

备份目的地

备份到本地磁盘

备份目的地是在本地的磁盘,则只需要将数据备份到本地磁盘的另外分区中或者目录中。这样不需要网络,缺点是对备份对象自己的性能影响大。还会对其他的IO密集型程序造成影响。

这种方式一般用于不关键的应用和非IO密集型应用。比如E-mail,对转发实时性要求不高。

备份到SAN上的磁盘

备份到SAN上的磁盘,就是将需要备份的数据,从本次磁盘读入内存,再写入HBA卡缓冲区,然后再通过线缆传送到磁盘阵列上。

  • 优点:只耗费SAN公用网络带宽,对主体影响小。

  • 缺点:对公共网络资源和出口带宽有影响。


备份到NAS目录

备份到NAS目录就是将数据备份到远程共享目录中。比如window中常用的文件夹共享。因为数据一般是通过以太网进行传递的,占用了前端的网络带宽,但是相对廉价,不需要部署SAN。

备份到磁带库

现在出现一种虚拟磁带库,即用磁盘来模拟磁带,对主机来说看到的是一台磁带库,实际上是一台磁盘阵列,主机照样使用磁带库一样来使用虚拟磁带库。要做到这点,就必须在磁盘阵列的控制器上做虚拟化操作,也就是实现协议转换器的作用。可以带来了的好处是:

  • 速度提升

  • 避免机械手这种复杂的机械装置

  • 管理方便


信息生命周期管理

将使用不频繁的数据移动到低速、低成本的设备上。比如只给视频应用分配20GB的空间,但是报告有500GB的空间,剩下的空间是在在磁带库上。

分级存储

  1. 一线磁盘阵列

  2. 二线虚拟磁带库:近期不会被频繁调度。利用大容量SATA盘,性能适中的控制器。

  3. 带库或者光盘库:几年甚至几十年都不访问到。

备份通路

本地备份

数据流向:本地磁盘—>总线—>磁盘控制器—>总线—>内存—>总线—>磁盘控制器—>总线—>本地磁盘。

也即数据从本地磁盘出发,经过本地的总线 和内存,经过CPU少量控制逻辑代码之后,流回本地磁盘。

通过前端网络备份

经过前端网络备份的数据流向是:本地磁盘—>总线—>磁盘控制器—>总线—>内存—>总线—>以太网卡—>网线—>以太网—>网线—>目标计算机的网卡—>总线—>内存—>总线—>目标计算机的磁盘。

数据从本地磁盘出发,流经本地总线和内存,然后流到本地网卡,通过网络传送到目标计算机磁盘。

  • 前端网络:服务器接受客户端连接的网络,也就是服务网络,是服务器和客户端连接的必经之路。

  • 后端网络:对客户封闭,客户的连接不用经过这个网络,用与服务器和存储、应用服务器、数据库服务器的连接。可以是SAN,以太网


通过后端网络备份

通过后端网络备份的数据流向是:本地磁盘—>总线—>控制器—>总线—>内存—>总线—>后端HBA卡—>线缆—>后端交换设备—>线缆—>备份目的的后端网卡—>总线—>内存—>磁盘。

LAN Free备份

备份的时候不经过LAN,也就是不流经前端网络,也叫Frontend Free。这样的好处是不耗费前端网络的带宽,对客户终端接受服务器的数据不影响。

因为前端网络一般是是慢速网络 ,资源非常珍贵。无论是本地、还是网络,都需要待备份的服务器付出代价,即需要读取备份源数据到自身的内存,然后从内存写入备份的目的地。对主机CPU、内存都有浪费。能否不消耗服务器的性能呢?可以,使用Server Free备份。

Server Free备份

Server Free备份的时候,数据不用流经服务器的总线和内存,消耗极少,甚至不消耗主机资源。备份源和备份目标都不会在服务器上,因为如果在服务器上,数据从磁盘读出,要流将总线,然后到内存,这就不是Server Free?那怎么做呢?

  • SCSI的扩展复制命令,将这些命令发送给支持Server Free的存储设备,然后这些设备会提取自身的数据写入备份目的设备,而不是发送给主机。

  • 使用另一台专门做数据移动的新服务器,来代替原来服务器移动备份数据。释放运算压力很大的生产服务器。


备份策略

备份引擎:决定整个数据备份系统应该怎么运作,备份那些内容,什么时候开始备份,备份时间有没有限制等的策略。


备份服务器

备份引擎以什么形式体现呢?当然是运行在主机上的程序,所以需要一台计算机来做引擎的执行者。

那么备份服务器的备份策略和规则,怎么传给整个数据备份系统中的服务器?通过以太网,因为以太网扩展性好,适合节点间通信。相对于以太网,SAN更适合传送大量的数据。所以常用前端网络来连接待备份的服务器和备份服务器,因为备份策略的数据包不多。

备份服务器如何与每个待备份的服务器建立通话?怎么通话?规则怎么定?需要待备份服务器上运行一个代理程序,专门解释备份服务器发来的命令,根据命令作出动作。

这个运行在待备份服务器上的程序,就叫备份代理,监听端口,接收备份服务器发来的命令。

介质服务器

若数据备份系统中有一台SCSI磁带机,且多台主机想备份到这台磁带机上。而SCSI磁带机只能同时接到一台主机上。

那么怎么办呢?可以引入一台专门的计算机,只能由这台计算机来操作磁带机。

需要备份的计算机通过以太网将数据发给这台掌管磁带机的计算机,然后写给磁带机。

这样磁带机成为了公用设备,而在整个系统中,只有一台计算机能掌管备份目标,它就类似于一个代理,代理其他服务器执行备份。我们把它称为介质服务器。还有一个问题,如果有多台服务器向介质服务器发出请求,怎么办?当然需要一个协调员,也就是备份服务器,它可以指挥安装在待备份服务器的代理,让每台服务器按照顺序有条理的使用介质服务器提供的备份介质进行备份。

三种备份方式

完全备份:不管文件多大,只要要备份,都需要将文件都备份下来。

差量备份:只备份从上次完全备份以来发生变化的数据。差量备份要求必须做一次完全备份,作为差量的基准点

增量备份:只备份从上次备份以来这份文件中变化过的数据。不管是全备、差备,还是增量备份。

对于数据库的备份,备份软件想知道每个数据文件的变化是不可能的,因为数据库文件内部格式非常复杂,只有自己才能分析和检测出来。所以数据库管理软件有自己的备份工具。第三方备份软件只能调用数据库软件自身提供的命令。

  • 链接:

    https://www.jianshu.com/p/b14ece444676

  • 版权由原作者所有,转载请注明来源和出处

--end--

扫描下方二维码

添加好友,备注【交流】
可私聊交流,也可进资源丰富学习群

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据备份技术知识梳理(建议收藏) 的相关文章

  • 在 eclipse indigo 中找不到 Window builder pro

    我读到 Eclipse Indigo 安装了 Window Builder Pro 插件 但我不知道它在哪里 文件 新建 项目没有给我选择 Window Builder Pro 的选项 如何找到它 您需要将此更新站点添加到 Eclipse
  • java格式化表格输出

    所以我正在尝试格式化我的输出 System out println Menu nItem tItem t tPrice tQuantity for int i 0 i
  • 如何为流数据创建 Flux/Publisher

    我正在使用轮询方法定期获取数据 新数据可能随时到达 我想向我的客户公开一个反应式接口 因此 我想创建一个发布者 Flux 它会在新数据可用时发布新数据并通知订阅者 我怎么做 我看到的所有 Flux 示例都是针对数据已知 可用的情况 实际上
  • 有人在实际应用程序中使用短和字节原始类型吗?

    我自 2004 年以来一直使用 Java 进行编程 主要是企业和 Web 应用程序 但我从来没有用过short or byte 而不是只是为了了解这些类型如何工作的玩具程序 即使在一个for loop100次 我们通常会选择int 我不记得
  • 如何使用流对 Map 中的值求和?

    我想要与流等效的内容 public static
  • 如何通过Java编码在运行时将My Jar加载到ClassPath?

    我正在 Net Beans 中使用 Swing 我有自己的 jar 其中包含类和方法 我将使用 JAVA Reflection API 调用这些类和方法 但在此之前我想在运行时将 Jar 加载到类路径中 我有一个 J 按钮 单击该按钮我将获
  • 编译错误:computeFrames 选项不支持 JSR/RET

    当我编译 java 文件时 在 IntelliJ 项目上出现此错误 没有列出特定的源文件 但它失败并出现此错误 删除以下编译器标志可修复该错误 source 1 5 target 1 5 然而 这些需要在那里 因为我们的目标是 Java 5
  • bash 别名中允许使用哪些字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我最近添加了 alias cd alias cd alias cd 到我的 bash aliases 文件 玩弄这个 我注意到在别名时 被
  • Struts 2 动态变量

    我正在尝试使用 set 标签在 Struts2 中创建动态变量
  • 验证在子类上调用此方法时是否调用了重写的超类方法

    我将用这个例子来展示我的问题 我有一个带有方法的类foo 该类有一个重写此方法的子类 子类的方法调用超类的方法 我可以验证一下吗 我不想测试什么foo在超类中确实如此 我只需要验证它是否被调用 我知道重构可以有所帮助 优先考虑组合而不是继承
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • equals 和 hashcode 的不同字段

    我同意这篇文章的声明在Java中重写equals和hashCode时应该考虑哪些问题 https stackoverflow com questions 27581 overriding equals and hashcode in jav
  • 使用 WGET 运行 cronjob PHP

    我尝试执行一个 cron 并每 5 分钟运行一个 url 我尝试使用 WGET 但我不想下载服务器上的文件 我只想运行它 这是我使用的 crontab 5 wget http www example com cronit php 除了 wg
  • 如何使用 Solr 索引 pdf 内容?

    我正在尝试使用 SolrJ 索引一些 pdf 文档 如下所述http wiki apache org solr ContentStreamUpdateRequestExample http wiki apache org solr Cont
  • 对需要强制转换的 Java 泛型感到困惑

    我对以下代码感到困惑 import java util ArrayList import java util LinkedList import java util List public class GenericsTest
  • 构造函数中的同步块

    我有一个带有静态变量的类 如下所示 private static Object sMyStaticVar 如果我想在构造函数中为这个 var 赋值 我有这样的代码 if sMyStaticVar null sMyStaticVar new
  • while 循环无法访问代码

    当我编译这段代码时 public static void main String args int x 0 while false System out println hello 它显示编译时错误无法访问代码 但是当我将这段代码修改为 p
  • Java 中的 ConcurrentHashMap 和 Hashtable [重复]

    这个问题在这里已经有答案了 Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别 哪个对于线程应用程序更有效 ConcurrentHashMap 和 Hashtable 锁定机制 Hashtable属于Co
  • Java无限信号量

    想知道如何not使用信号量限制连接 或任何东西 所以你可能会想 这听起来很愚蠢 但是 它稍微简化了我的代码 因为它让我可以统一处理有限和无限的情况 请注意 我并不是在寻找有关如何编写类似内容的建议 if limited semaphore

随机推荐

  • BeagleBone 实施 Yocto 项目

    特点 Yocto 项目生产工具和流程 支持为嵌入式软件创建 Linux 发行版 独立于架构 BeagleBone Black 是一个平台 允许用户根据自己的喜好快速轻松地执行安装和自定义 从 Yocto Project 构建系统的基本介绍开
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 第五届蓝桥杯—— 基础练习:数列特征

    问题描述 给出n个数 找出这n个数的最大值 最小值 和 输入格式 第一行为整数n 表示数的个数 第二行有n个数 为给定的n个数 每个数的绝对值都小于10000 输出格式 输出三行 每行一个整数 第一行表示这些数中的最大值 第二行表示这些数中
  • C++11中的原子操作(atomic operation)

    所谓的原子操作 取的就是 原子是最小的 不可分割的最小个体 的意义 它表示在多个线程访问同一个全局资源的时候 能够确保所有其他的线程都不在同一时间内访问相同的资源 也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问 这有点类似互斥对象
  • AIops | 一文了解日志异常检测

    作者 李旭光 中国农业银行研发中心责编 晋兆雨出品 CSDN云计算头图 付费下载于视觉中国 背景介绍 日志是有关系统运行状态的描述 例如Linux的系统日志 数据库系统的日志以及分布式系统的日志等 日志是运维人员查看系统运行状态 寻找系统故
  • Java Eclipse进行断点调试

    如何调试Java程序 大家最开始学习Java 都会觉得IDE调试好高端有木有 其实很简单了 下文会尽量简单直观的教会你在Eclipse中调试 其他的IDE调试步骤也是类似的 1 在你觉得有错的地方设置断点 在代码行数前 点击右键 注意是右键
  • MATLAB基础语法总结

    主体参照 全网最全MATLAB学习归纳总结 建模学习必备 MATLAB讲解PPT和MATLAB官方帮助文档这里对该教程做一定的完善与汇总 1 MATLAB编辑器常用快捷键 1 1 编辑器窗口操作 编辑器窗口操作 自动整理代码 用鼠标选中代码
  • 【粉丝问答11】如何实现内网穿透

    本文章由网友 邓工 投稿 VX A18665908735 问题描述 起因 最近公司要做一个4G模块带GNSS 全球导航卫星系统 定位功能的产品 上传传感器数据和设备定位数据到服务器上 我们选择了simcom7600G一个支持全球通的4G模块
  • 基于Docker安装的MindSpore-1.2 GPU版本

    技术背景 在前面一篇博客中 我们介绍过MindSpore CPU版本的Docker部署以及简单的案例测试 当时官方还不支持GPU版本的Docker容器化部署 经过MindSpore团队的努力 1 2 0版本的MindSpore GPU终于推
  • XCTF攻防世界Web12道简单题

    0x00 准备 内容 在xctf官网注册账号 即可食用 目录 目录 0x01 view source2 0x02 get post3 0x03 robots4 0x04 backup6 0x05 Cookie7 0x06 disabled
  • SSE3和SSSE3 Intrinsics各函数介绍

    SIMD相关头文件包括 include
  • Linux入门篇-01 台式机安装Linux系统

    材料 台式机 U盘 内存大于8G CentOs7 下载地址 点击跳转 步骤一 U盘启动电脑 启动成功画面 选择第一个 按E 或者 Tab键 进行编辑 vmlinuz initrd initrd img inst stage2 hd LABE
  • 传感器响应时间与滤波器截止频率的关系

    1 传感器响应时间与滤波器截止频率的关系 详细看 https blog csdn net Old Street article details 108087826 2 滤波器中关于截止频率的理解 http www 360doc com co
  • 孤立森林算法(Isolation Forest Algorithm)Python实现

    孤立森林算法 Isolation Forest Algorithm Python实现 孤立森林算法是一种用于检测异常值的无监督机器学习算法 它通过构建一棵随机划分的二叉树来判断数据点的异常程度 以此来识别异常值 本文将介绍孤立森林算法的原理
  • ubuntu20.04 安装 Sophus库 slambook2

    ubuntu20 04 安装 Sophus库 slambook2 slambook2 实践部分 需要我们自行安装 sophus 库 但是相关的依赖很多 而且sophus分为模板类和非模板类两种 安装起来还是比较繁琐的 slambook2中采
  • QT在子线程发送信号给主线程,主线程信号槽函数没有反应的解决办法

    在编写线程时遇到了一个问题 即子线程发送信号给主线程 主线程信号槽函数没有反应 这个问题卡了半天 最终找到解决办法 自己记录一下 问题 在子线程的run函数发送了一个信号 在主函数中定义了一个信号槽函数用来响应这个信号 但是槽函数不执行 修
  • 我要写一篇关于酒店管理系统论文,请说一说酒店管理系统的研究背景

    酒店管理系统的研究背景是指针对旅游业和酒店业的扩大发展 以及客户服务需求的日益增加 许多酒店已经使用酒店管理系统来提高服务质量和管理效率 酒店管理系统的研究着重于通过使用软件和信息技术来有效地管理酒店的各项运营活动 从而提升酒店的服务质量
  • 机器学习之多元线性回归

    1 多元线性回归模型 定义 具有多个特征的线性回归模型 多元线性回归模型 见下图 多元线性回归总结 参数 模型 损失函数 梯度下降算法 见下图 注意 梯度下降算法每次都是同时更新wj和b 2 多维特征 多维特征 x1 x2 xn 其中xj表
  • 【Linux学习笔记】7. Linux文件IO详解(附代码实例)

    Linux文件I O 前置知识 Linux文件I O分为系统IO和标准IO 常用于系统编程 系统I O通过文件描述符 fd 来操作文件 标准I O通过文件流 FILE 来操作文件 Linux下可以使用man命令来查看使用手册 学习和使用这些
  • 数据备份技术知识梳理(建议收藏)

    所谓数据保护技术是指对当前时间点上的数据进行备份 如果说原始数据被误删除了 可以通过备份数据找回或恢复数据 从底层来分 数据保护可以分为文件级保护和块级保护 文件级备份 文件级备份 将磁盘上所有文件通过调用文件系统接口备份到另一个介质上 也