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

云计算基础-快照与克隆

快照及克隆

什么是快照

快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本)

快照优点

速度快,占用空间小

快照工作原理

在了解快照原理前,首先需要知道两个概念:索引/数据和差分盘

索引和数据(index node / data block)

首先要了解,每一个文件系统都是有两部分组成的:索引和数据(index node / data block),

索引有时候也称为元数据metadata,如图:

index node 有时候也称为metadate(元数据),也叫元素,它是描述数据的数据,比如文件的名字,文件的大小,文件的权限,文件的指针(指针指向文件在硬盘上的物理位置)

所以,快照也叫:基于索引的快照(快照中只包含虚拟机磁盘文件的元数据,不包含真实的文件内容),元数据中只保存文件的描述信息和文件的指针,一个元数据占用256字节的空间大小,查找文件时,先读取文件的元数据,通过元数据的指针找到文件在硬盘的物理位置,从而找到文件。

总结一下:

metadate(元数据):文件的描述信息(文件的名字、大小、时间等及文件的指针:真实的物理数据在硬盘上的位置)

data block:真实的文件

举个不是太恰当的例子:比如有一张图片,放在硬盘上第三行第五列这个小格子内,我们想要打开这个文件,首先操作系统要先找到这个文件的索引(元数据metadate),我们这时可以看到这个文件名字叫“123.jpg”,大小是1MB等信息,当我们打开这个文件时,通过matedate中的指针,该指针指向了硬盘上第三行第五列这个小格子,操作系统找到这个小格子里的文件,从而可以打开文件让我们看到这个图片

差分盘

差分盘是一种与基础盘关联的磁盘类型,它记录了基础盘和自身之间的差异。具体来说,差分盘只存储了对基础盘的修改或增量数据,而不保存基础盘上已存在的数据。

创建快照其实就是创建了一块差分盘,当创建快照时,基础磁盘会置于只读状态,差分盘(快照空间)中会保留基础磁盘的索引信息,所以ROW快照后,虚拟机所有对磁盘的增删改查操作都会重定向到差分盘,从而不影响基础磁盘中已有的数据

计算快照(旧)

功能介绍

虚拟化计算层是基于KVM来实现的,KVM采用的是qcow2的磁盘格式,qcow2支持的快照方式为cow(写时复制),KVM在虚拟化计算层给qcow2打快照的时候,会将生成的快照空间一起保存在原有的qcow2文件中,在删除或恢复快照的时候调用底层的文件系统指令来清理qcow2文件中的快照空间

cow快照在写入(修改)数据时,IO会被放大三倍,更加消耗存储的IO性能,即需要将要修改的数据读出来,写到快照空间内,然后再将新的数据覆盖写到原位置,这样会带来写惩罚:一次写带来了更多的读操作

注意事项

1. 性能影响是因为KVM支持的COW快照技术导致的,打完快照之后数据写入的时候会放大IO(消耗存储的IO性能,新增数据不会对性能产生影响,修改数据时才会影响性能)

2. KVM的快照方案中,快照数据保存在原有的qcow2文件中,如果要满足删除快照对qcow2文件内快照区域进行清理,需要调用底层文件系统指令(如果底层使用ext3,ext4的文件系统,那就可以通过调用KVM的指令,来清除qcow2文件中的快照空间)

3. 深信服超融合使用的是自己开发的aSAN虚拟存储,aSAN文件系统的底层指令不支持删除qcow2文件中的快照空间,所以只能删除快照的索引数据

存储快照

深信服aSAN文件系统无法删除qcow2文件中的快照空间,为了解决这个问题,aSAN开发出了存储快照

存储快照就是在打快照的时候生成的快照空间,写在一个单独的qcow2文件里,而不是放在原来的qcow2文件里

存储快照在清理快照空间的时候,只需要将生成的qcow2文件删除掉即可

采用基于存储的快照方式

1. 采用ROW快照技术,减小对虚拟机性能的影响

2. aSAN底层支持删除快照时释放空间

注意事项

1. 存储快照只能存在于虚拟存储上,外置存储的虚拟机会使用老版本的快照方式

2. 两主机场景不支持存储快照及相关功能,包括快速克隆

COW快照原理(旧)

COW又叫写时复制(新增数据不会对性能产生影响,修改数据时才会影响性能)

1. 创建快照的时候,COW会为原虚拟磁盘创建一张数据指针表,用于保存原虚拟磁盘的物理指针

2. 然后在创建一张新的指针表,作为快照空间的指针表,快照空间的指针表会占用一部分的存储空间,用于保存快照后原虚拟磁盘中被更新的原数据

3. 当虚拟机要删改数据的时候,先将数据写到缓存里等待,等待存储系统先将删改的原数据复制到快照空间里,然后再将缓存中的数据覆盖写到原虚拟磁盘中的位置

4. 最后将虚拟磁盘和快照空间的数据指针对应写到一张映射表里

简单总结:

数据写入时,直接写到虚拟磁盘内,数据修改时,先把要修改的数据读出来,然后将读出来的数据写到快照空间内,然后把修改后的数据覆盖写入到虚拟磁盘原位置中,最后将虚拟磁盘和快照空间的数据指针保存到映射表中

快照后,数据写入(修改)流程

1. 在对虚拟机创建快照时,系统会生成一个动态增长的新磁盘文件(即快照空间)

2. 快照创建完成后,修改原数据时会先将原磁盘数据复制到快照空间里,然后再将缓存里的数据写到原磁盘文件中,最后将原虚拟磁盘和快照空间逻辑地址的对应关系写到映射表

快照在写入数据时,为什么会放大IO?

如图,图上的蓝色部分是数据指针,白色部分是指针对应的存储空间,紫色和黄色表示的是数据块

此时,虚拟机要将【2】这里的数据块【c】修改为数据块【e】,【e】首先会被写到缓存里,存储系统将原来的【c】读出来,然后再复制到快照空间的【ii】位置,此时,数据经历了一次读和一次写。然后再将缓存里的数据【e】覆盖写到原虚拟磁盘,此时io又经历了一次写。

所以,快照后,数据IO会经历一次读和两次写,假设这个数据块是1KB,这已经有了3KB的数据量了,原本1KB的数据IO变为了3KB的数据IO,所以快照后写入数据会放大数据IO量

写入映射表的操作是写入地址指针,这个数据是非常小的,可以忽略掉

快照后数据读取流程

快照创建后,虚拟机读取数据时直接从原虚拟磁盘读取

虚拟机读取数据时,直接根据原虚拟磁盘的指针表读取即可,不用查询映射表和快照空间了,因为修改的数据都保存在原虚拟磁盘里了

如图,在原虚拟磁盘里,e已经是最新的数据了,所以在读的时候,只需要顺序的将aeioud读出来即可

快照恢复流程

快照恢复时,根据映射表将快照空间里的数据回写到原虚拟磁盘,然后删除快照空间

恢复快照后,原磁盘空间是打快照时的旧数据状态,快照删除后,虚拟机是新数据状态

1. 首先根据映射表,找到快照空间上的数据在原虚拟磁盘所对应的位置

2. 然后将数据回写到原虚拟磁盘上,覆盖掉修改后的数据,每一次回写的动作都会进行一次数据的读和数据的写

3. 数据全部回写完成后,再将快照空间和映射表删除掉

快照删除流程

删除快照时,直接删除快照空间以及地址映射表,即可保证当前虚拟机是最新数据的状态(快照内旧的数据也会跟着一起删除)

ROW快照原理(写时重定向)

快照后,数据写入流程

1. 在对虚拟机创建快照时,系统会将虚拟磁盘置为只读,并生成一个动态增长的新磁盘(即快照空间)

2. 快照创建完成后,该虚拟机的所有新增数据和对原数据的修改都写入到新生成的快照空间,并将原虚拟磁盘和快照空间逻辑地址的对应关系写入映射表

1. 在创建快照时,ROW首先会为原虚拟磁盘创建一张数据指针表,用于保存原虚拟磁盘的物理指针,如上图,蓝色的1-6即原虚拟磁盘的指针,然后将这张指针表的存储空间置为只读模式

2. 再创建一块空的指针表(上图右侧蓝色部分),作为快照空间的数据指针表,他会占用一部分存储空间,用于保存快照后更新的数据,在aSAN上,这块存储空间是动态分配的,并没有一个起始的默认大小,最大不会超过虚拟机配置的磁盘大小

3. 当要对原虚拟磁盘的数据进行删改时,会将删改后的数据写入到快照空间内,然后将原虚拟磁盘的地址指针和快照空间的地址指针对应的写到映射表里

4. 可以看到,ROW在写入的时候只有一次写入操作,只是进行了写、映射表的操作,记录地址的操作影响非常小,是可以忽略掉的

快照后数据读取流程

1. 若读取的数据是快照创建之前已有的数据,且创建快照后未进行修改,则从源虚拟磁盘读取

2. 若读取的数据是快照创建之后增/改的数据,则从快照空间读取

ROW在读数据时会有查询映射表的过程,是对地址指针的查询比起指针写入的影响会大一些,比起数据块的操作(覆盖写入)还是会小很多

快照恢复流程

快照恢复是要回到打快照时旧数据的状态,ROW的旧数据都保存在原虚拟磁盘里,所以快照恢复的时候直接删除快照空间和映射表即可

为什么快照恢复的时候要关闭虚拟机呢?

虚拟机运行的过程中,内存中的数据是会持续的往磁盘中写的,而快照恢复的过程中会对磁盘做回滚操作,不可能做到在新数据写入的同时还能回滚旧数据的

举个直观的例子,现在有一台虚拟机刚装好系统打了个快照然后安装了微信和QQ软件,在正常使用这些软件的时候,突然电脑中毒了,此时想要对虚拟机恢复快照,如果不关闭虚拟机,这些软件会一直向磁盘写数据,占用磁盘上的数据块,而恢复快照是要将这些软件整个给擦除掉,这时候就会发生冲突,现在的快照技术基本上都会将虚拟机重启,不然达不到快照恢复的目的了

快照删除流程

快照删除时,依照映射表将快照空间的数据进行回写,然后删除快照空间

由此可见,COW和ROW的快照删除正好相反,因为COW原虚拟磁盘记录的是新的数据状态,而ROW的原虚拟磁盘记录的是旧的数据状态

COW与ROW对比

读密集型应用:web应用

写密集型应用:数据库应用

删除快照的四种情况

第一种情况

如图,虚拟机当前所处的位置为snap02,当删除snap01的快照时,snap01快照内的增量数据会合并到基础磁盘

第二种情况

虚拟机当前在snap02的位置,当删除snap02的快照时,snap02内的增量数据会合并到快照1

第三种情况

虚拟机当前在snap01的快照位置,删除snap02的快照,snap02的快照会直接删除,无需合并

第四种情况

当前在snap02的快照位置,此时删除所有快照,snap02及以上位置快照内的增量数据都会合并到基础磁盘

ROW删除快照总结

  1. 删除当前位置的快照时,该快照内的增量数据会合并到母盘中
  2. 删除当前位置后面的快照时,后面位置快照空间内的数据会被直接删除,无需合并

快照删除问题

为什么创建快照后,在虚拟机内删除原本属于母盘的文件,快照还能恢复呢?(比如为什么把虚拟机格式化了后,快照还能恢复呢)

因为创建快照后,会将母盘置为只读模式,而快照是基于索引的快照,子盘中保存了母盘所有文件的索引,而快照后虚拟机所有的读写都来自子盘,当删除原本保存在母盘中的文件时,实际上并非真正的将文件删除,只是删除了快照中指向这个文件的索引,所以即使将文件删除,快照也能将该文件恢复

如果创建了多个快照空间,数据增删改查会怎样?

假设创建了两个快照,当前所处的位置在快照2,此时,图片上的原虚拟磁盘就是快照1,快照空间就是快照2,数据写入会写入到快照2所在的差分盘,数据读取也会从快照2内去读取,相当于是,快照1实际上是原虚拟磁盘的差分盘,但是又打了一个快照2,此时,快照1就相当于是快照2的母盘,快照2就是快照1的差分盘

一致性快照与内存快照

内存快照

保存内存的状态,可以保存内存当前的状态,但是占用磁盘空间大,如果虚拟机内存大小是8GB,那么在打内存快照时,8GB内存不管用没用完,内存快照都会将8GB的内存写入到快照

内存快照拍摄完成后,恢复快照会回到打快照那一刻的状态,也就是开机状态

注意:内存是实时变化的,内存快照只保留打快照那一刻的内存状态,后面的它不管

一致性快照

在创建快照前,强制将脏页写回硬盘,再创建快照,类似于执行了一条sync的命令后再打快照,虚拟机需要安装tools

一致性快照拍摄完成后,保留硬盘当前的状态,恢复快照后,虚拟机自动重新开机

什么是脏页

脏页也叫脏数据,数据在写入时,并不是直接写到硬盘,而是先写入到内存中,在内存中整合后再写到硬盘,已经在内存中改变还没有写到硬盘的数据叫脏数据

内存中的脏数据有30秒存活时间,30秒后数据会被写到硬盘

为什么需要延时30秒再写入硬盘:这样可以防止瞬间的高IO将磁盘占用率打满的情况

查看脏数据存活时间

sysctl -a | grep dirty

【vm.dirty_expire_centisecs = 3000】就是脏数据的存活时间,单位:百分之一秒

实时监控脏页:watch -n 1 'cat /proc/meminfo | grep Dirty',可以看到,当前有40KB的脏数据

脏数据测试

首先查看当前系统的脏数据大小

首先我们拷贝两个文件到家目录的test文件夹下,可以看到,脏数据变大了

这时,我们在30秒内关闭虚拟机电源(非正常关机,正常关机的话脏数据会被写到硬盘),然后再开机,查看那两个文件是否已写入到硬盘,可以看到,数据并没有写到硬盘

执行sync命令可以强制将脏数据写到硬盘,可以看到,执行完sync后,脏页数据直接变为0kB了,此时就算在30秒内关闭虚拟机电源,数据也会被写到硬盘

差分盘体验

首先查看虚拟机的ID号和所属主机,ID号可以理解为系统给这个虚拟机起的名字,可以看到,这台虚拟机运行在CNA01上的

登录CNA01,进去KVM的配置目录 /etc/libvirt/qemu,可以看到这台虚拟机的配置文件

查看这个配置文件,找到虚拟机虚拟磁盘所处的目录,找到如图这一段</disk>开头,</disk>结尾,这一块括起来的中可以看到虚拟机虚拟磁盘文件所处的目录(蓝色框选出来的)

进入这个目录,可以看到虚拟机的虚拟磁盘

此时,我们给虚拟机打个快照

再看一下虚拟机虚拟磁盘所在目录,可以看到,虚拟机多了一块虚拟磁盘,这块虚拟磁盘就是差分盘,差分盘初始大小一般不会超过16MB,这16M中保存了母盘的文件索引

但是有个问题,所有的新数据都是写在快照后的差分盘中的,那虚拟机是怎么知道要往这块盘中写数据的呢

我们再来看一下虚拟机的配置文件(/etc/libvirt/qemu/xxxx.xml)

可以看到,当前虚拟机使用的磁盘就是刚刚的那块差分盘(蓝色),还可以看到这块差分盘的母盘(绿色),所以,虚拟机会把所有的新数据写入差分盘

此时所有的读写操作都是在这块差分盘中进行的,所以母盘对于虚拟机来说是只读模式

克隆

克隆分为链接克隆和完整克隆,完整克隆就是将虚拟机配置文件及磁盘文件(vmid会更改)完整复制,克隆出来的虚拟机与源虚拟机独立存在。

全量克隆:

全量克隆是指对原虚拟机数据进行一份完整的复制,数据复制完成后,克隆出来的虚拟机才能开机,克隆出来的虚拟机和原虚拟机是完全独立的,原虚拟机损坏不影响全量克隆出来的虚拟机

全量克隆特点:

  1. 克隆出来的虚拟机需要等数据复制完成之后才可以启动,时间取决于源虚拟机数据量大小
  2. 全量克隆出来的的虚拟机数据始终保持独立
  3. 克隆完成后虚拟机性能无任何影响

链接克隆使用的就是快照技术,同样会复制虚拟机的配置文件,但会生成差分盘作为克隆后虚拟机的磁盘,链接克隆的虚拟机依赖源虚拟机的磁盘文件。链接克隆的特点和全量克隆相反

克隆的作用

  1. 业务变更失败方便回退
  2. 业务测试(在测试业务时,如果新搭建测试环境场景有可能耗时较长,或和当前环境有差别,所以可以选择克隆来完全模拟测试环境)
  3. 改变磁盘模式等

虚拟机在克隆的时候,会自动创建一个快照

因为在克隆过程中,原虚拟机数据会持续变化,克隆时会自动生成快照,克隆是从快照中克隆,从而保持数据的一致性,当克隆完成后,系统会自动删除快照,快照中的数据会自动还原到基础磁盘中

模板

模板作用

  1. 批量部署虚拟机
  2. 制作模板流程:
    1. 安装OS,安装tools
    2. 安装所需的应用程序
    3. 将IP地址设置为DHCP方式
    4. 去除个性化信息(MAC地址,计算机名,SID)

WINDOWS自带去除个性化信息的程序 C:\Windows\System32\Sysprep\sysprep.exe

选择进入系统全新体验,勾选通用,选择关机,如果选择重新启动又会生成个性化 信息

  1. 虚拟机关机后,制作为模板
    1. 转换为模板:如,将虚拟机磁盘vhd格式转换为vhdx格式,源虚拟机不存在(模板也可以转换为虚拟机)
    2. 克隆为模板:通过该虚拟机创建一个新的模板,源虚拟机继续存在
    3. 导出为模板,将虚拟机导出为模板文件,方便导入到其他系统或留作备份

相关文章:

云计算基础-快照与克隆

快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录&#xff0c;也就是把虚拟机当前的状态保存下来(快照不是备份&#xff0c;快照保存的是状态&#xff0c;备份保存的是副本) 快照优点 速度快&#xff0c;占用空间小 快照工作原理 在了解快照原理前&#xff0c;…...

使用 RAG 创建 LLM 应用程序

如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人&#xff0c;那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型&#xff08;LLMs&#xff09;经过广泛训练&#xff0c;以理解…...

第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint

2. ip::tcp::endpoint ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是const endpoint_type& peer_endpoint. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在 在 ip::tcp::socket 类内部的一个别名。 libucurl 库采用字符串URL表达目标的地…...

面试浏览器框架八股文十问十答第一期

面试浏览器框架八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;什么是 XSS 攻击&#…...

多线程的基本原理学习

由一个问题引发的思考 线程的合理使用能够提升程序的处理性能&#xff0c;主要有两个方面&#xff0c;第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行&#xff1b;第二个是线程的异步化执行相比于同步执行来说&#xff0c;异步执行能够很好的优化程序的处理性能提…...

C/C++进制转换

十进制转化为二进制 进制转化#include <iostream> using namespace std;void change(int); int main() {int num;cout << "请输入一个十进制数: ";cin >> num;cout << "转化后的二进制数为: ";change(num);return 0; } void chan…...

使用 Coze 搭建 TiDB 助手

导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台&#xff0c;突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理&#xff0c;包括知识库、function call、embedding 模型等关键概念&#xff0c;最后成功演示了如何在 Coze…...

Arduino程序简单入门

文章目录 一、结构1.1 setup()1.2 loop() 二、结构控制2.1 if2.2 if...else2.3 switch case2.4 for2.5 while2.6 do...while2.7 break2.8 continue2.9 return2.10 goto 三、扩展语法3.1 ;&#xff08;分号&#xff09;3.2 {}&#xff08;花括号&#xff09;3.3 //&#xff08;单…...

QT+OSG/osgEarth编译之八十三:osgdb_ogr+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ogr)

文章目录 一、osgdb_ogr介绍二、文件分析三、pro文件四、编译实践一、osgdb_ogr介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_ogr是osgDB模块中的一个插件,它提供了对OGR(开放地理空间联盟)库的支持。 OGR是一个开源的地理空间数据…...

开年炸裂-Sora/Gemini

最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token&#xff0c;可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment&#xff1a;google公司有夸大的传统&#xff0c;所以真实效果需要上…...

vue前端系统启动报错Module not found: Error: Can‘t resolve ‘sass-loader‘

1、确认项目中是否已安装 node-sass 包。sass-loader 是依赖于 node-sass 包的&#xff0c;如果没有安装 node-sass 包&#xff0c;也会导致无法找到 sass-loader 包。 npm ls node-sass安装 node-sass 包&#xff1a; npm install --save-dev node-sass2、确认项目中是否已安…...

HTML | DOM | 网页前端 | 常见HTML标签总结

文章目录 1.前端开发简单分类2.前端开发环境配置3.HTML的简单介绍4.常用的HTML标签介绍 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CS…...

乡政府|乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)

乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…...

存储系统如何规避数据静默错误SDC?

存储系统规避数据静默错误&#xff08;Silent Data Corruption, SDC&#xff09;是一项复杂且关键的任务&#xff0c;涉及多个层次的技术和策略。数据静默错误是指在存储或传输过程中发生的错误&#xff0c;这些错误未被检测出来&#xff0c;因此无法立即纠正&#xff0c;可能导…...

《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)

文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例&#xff1a;配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1&#xff1a;使用 firewalld 配置动态防御区域8.1.4 拓展案例 2&#xff1a;配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…...

Ubuntu Desktop 显示文件路径

Ubuntu Desktop 显示文件路径 1. GUI hot key2. CLIReferences 1. GUI hot key Ctrl L: 显示文件路径 2. CLI right click -> Open in Terminal -> pwd strongforeverstrong:~/Desktop$ pwd /home/strong/DesktopReferences [1] Yongqiang Cheng, https://yongqiang…...

【Java程序设计】【C00270】基于Springboot的moba类游戏攻略分享平台(有论文)

基于Springboot的moba类游戏攻略分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏攻略分享平台 本系统分为系统功能模块、管理员功能模块、以及用户后台功能模块。 系统功能模块&#xff1a;在平台首…...

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统&#xff08;OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能&#xff09; 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…...

模型 4i(趣味、利益、互动、个性)理论

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。以用户为中心营销。 1 模型 4i(趣味、利益、互动、个性)理论的应用 1.1 4i理论在电子商务中的应用 小米公司在其电子商务平台上运用了 4i理论&#xff0c;取得了较好的效果。具体表现如下…...

解线性方程组(二)——Jacobi迭代法求解(C++)

迭代法 相比于直接法求解&#xff0c;迭代法使用多次迭代来逐渐逼近解&#xff0c;其精度比不上直接法&#xff0c;但是其速度会比直接法快很多&#xff0c;计算精度可控&#xff0c;特别适用于求解系数矩阵为大型稀疏矩阵的方程组。 Jacobi迭代法 假设有方程组如下&#xf…...

信息安全技术基础知识

一、考点分布 信息安全基础&#xff08;※※&#xff09;信息加密解密技术&#xff08;※※※&#xff09;密钥管理技术&#xff08;※※&#xff09;访问控制及数字签名技术&#xff08;※※※&#xff09;信息安全的保障体系 二、信息安全基础 信息安全包括5个基本要素&#…...

使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南

导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro&#xff0c;作为一个多端统一开发框架&#xff0c;让开发者能够使用一套代码同时适配多个平台&#xff0c;包括鸿蒙系统。文章将详细介绍如何配置开发环境&#xff0c;以及如何利用 Taro 的特性…...

C语言指针(初阶)

文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…...

Python循环语句——for循环的嵌套使用

一、引言 在Python编程中&#xff0c;循环是控制程序流程的重要工具&#xff0c;它允许我们重复执行某段代码&#xff0c;直到满足特定的条件为止。其中&#xff0c;for循环是Python中最常用的循环类型之一。而嵌套循环&#xff0c;即在一个循环内部再嵌套另一个循环&#xff…...

Java创建线程真的有三种方式吗?

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…...

17-k8s控制器资源-job控制

job控制器&#xff1a;就是一次性任务的pod控制器&#xff0c;pod完成作业后不会重启&#xff0c;其重启策略是&#xff1a;Never 1&#xff0c;job控制器案例描述 启动一个pod&#xff0c;执行完成一个事件&#xff0c;然后pod关闭&#xff1b; 事件&#xff1a;计算π的值&a…...

lazarus:LCL 嵌入 fpwebview 组件,做一个简单浏览器

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\lclembed 修改 lclembed.lpr 如下&#xff0c;将 fphttpapp. 注释掉&#xff0c;因为我用不上 a simple…...

c++类和对象新手保姆级上手教学(上)

前言&#xff1a; c其实顾名思义就是c语言的升级版&#xff0c;很多刚学c的同学第一感觉就是比c语言难学很多&#xff0c;其实没错&#xff0c;c里的知识更加难以理解可以说杂且抽象&#xff0c;光是类和对象&#xff0c;看起来容易&#xff0c;但想完全吃透&#xff0c;真的挺…...

可变参数(c/c++)

目录 一、C语言版本 二、C的实现方法 2.1数据包 2.2sizeof...运算符 2.3可变参数模板的使用 2.4emplace_back() 有时候我们在编写函数时&#xff0c;可能不知道要传入的参数个数&#xff0c;类型 。比如我们要实现一个叠加函数&#xff0c;再比如c语言中的printf,c中的emp…...

【数据结构】图

文章目录 图1.图的两种存储结构2.图的两种遍历方式3.最小生成树的两种算法&#xff08;无向连通图一定有最小生成树&#xff09;4.单源最短路径的两种算法5.多源最短路径 图 1.图的两种存储结构 1. 图这种数据结构相信大家都不陌生&#xff0c;实际上图就是另一种多叉树&…...

32.3K Star,再见 Postman,这款开源 API 客户端更香

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 使用 API 工具来调试接口是后端开发经常会使用的&#xff0c;之前一直…...

Python循环语句——continue和break

一、引言 在Python编程中&#xff0c;循环是常见的控制流语句&#xff0c;它允许我们重复执行一段代码&#xff0c;直到满足某个条件为止。而在循环中&#xff0c;continue和break是两个非常重要的控制语句&#xff0c;它们可以帮助我们更加灵活地控制循环的行为。 二、contin…...

C++面向对象程序设计-北京大学-郭炜【课程笔记(三)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;三&#xff09;】 1、构造函数&#xff08;constructor&#xff09;1.1、基本概念 2、赋值构造函数2.1、基本概念2.1、复制构造函数起作用的三种情况2.2、常引用参数的使用 3、类型转换构造函数3.1、什么事类型转换构造函…...

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…...

用HTML、CSS和JS打造绚丽的雪花飘落效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetGBK"><style>* {margin: 0;padding: 0;}#box {width: 100vw;heig…...

订餐|网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 &#xff08;1&#xff09;用户注册界面 &#xff08;2&#xff09;用户登录界面 &#xff08;3&#xff09;菜品详情界面 &#xff08…...

从零开始学howtoheap:解题西湖论剑Storm_note

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…...

Rust 基本环境安装

rust 基本介绍请看上一篇文章&#xff1a;rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup&#xff0c;可以轻松地安装 Rust 编译器&#xff08;rustc&#xff09;、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台&#xff0c;以及…...

【电源】POE系统供电原理(二)

转载本博客文章&#xff0c;请注明出处 ​ 上一篇文章中&#xff0c;有提到POE系统工作原理及动态检测机制&#xff0c;下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成&#xff0c;如下图所示。 图1 POE供电系统 PSE控制器的主要作用&#xff…...

GPU独显下ubuntu屏幕亮度不能调节解决方法

GPU独显下屏幕亮度不能调节&#xff08;假设你已经安装了合适的nvidia显卡驱动&#xff09;&#xff0c;我试过修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash acpi_backlightvendor" &#xff0c;没用。修改和xorg.conf相关的文件&#xff0c;…...

Linux篇:网络基础1

一、网络基础&#xff1a;网络本质就是在获取和传输数据&#xff0c;而系统的本质是在加工和处理数据。 1、应用问题&#xff1a; ①如何处理发来的数据&#xff1f;—https/http/ftp/smtp ②长距离传输的数据丢失的问题&#xff1f;——TCP协议 ③如何定位的主机的问题&#…...

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章&#xff0c;转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客&#xff1a; LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台&#xff1a;rk3568 2、开发板:…...

C#系列-C#访问MongoDB+redis+kafka(7)

目录 一、 C#中访问MongoDB. 二、 C#访问redis. 三、 C#访问kafka. C#中访问MongoDB 在C#中访问MongoDB&#xff0c;你通常会使用MongoDB官方提供的MongoDB C#/.NET Driver。这个驱动提供了丰富的API来执行CRUD&#xff08;创建、读取、更新、删除&#x…...

(12)Hive调优——count distinct去重优化

离线数仓开发过程中经常会对数据去重后聚合统计&#xff0c;count distinct使得map端无法预聚合&#xff0c;容易引发reduce端长尾&#xff0c;以下是count distinct去重调优的几种方式。 解决方案一&#xff1a;group by 替代 原sql 如下&#xff1a; #7日、14日的app点击的…...

记录 | 验证pytorch-cuda是否安装成功

检测程序如下&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell&#xff0c;运行情况如下...

LeetCode 239.滑动窗口的最大值 Hot100 单调栈

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…...

463. Island Perimeter(岛屿的周长)

问题描述 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有…...

如何解决缓存和数据库的数据不一致问题

数据不一致问题是操作数据库和操作缓存值的过程中&#xff0c;其中一个操作失败的情况。实际上&#xff0c;即使这两个操作第一次执行时都没有失败&#xff0c;当有大量并发请求时&#xff0c;应用还是有可能读到不一致的数据。 如何更新缓存 更新缓存的步骤就两步&#xff0…...

linux系统下vscode portable版本的python环境搭建003:venv

这里写自定义目录标题 python安装方案一. 使用源码安装&#xff08;有[构建工具](https://blog.csdn.net/ResumeProject/article/details/136095629)的情况下&#xff09;方案二.使用系统包管理器 虚拟环境安装TESTCG 本文目的&#xff1a;希望在获得一个新的系统之后&#xff…...

使用TinyXML-2解析XML文件

一、XML介绍 当我们想要在不同的程序、系统或平台之间共享信息时&#xff0c;就需要一种统一的方式来组织和表示数据。XML&#xff08;EXtensible Markup Language&#xff0c;即可扩展标记语言&#xff09;是一种用于描述数据的标记语言&#xff0c;它让数据以一种结构化的方…...