k8s存储卷

目录

  • 一、为什么要存储卷?
  • 二、emptyDir存储卷
  • 三、hostPath存储卷
  • 四、 nfs共享存储卷
  • 五、PVC 和 PV
    • 5.1 PV和PVC之间的相互作用遵循的生命周期
    • 5.2 PV 的状态
    • 5.3 一个PV从创建到销毁的具体流程
  • 六、静态创建pv和pvc资源由pod运用过程
    • 6.1 在NFS主机上创建共享目录,并且进行exportfs发布
    • 6.2 在master主机编写pv资源创建yaml
    • 6.3 创建pvc资源,并且设置匹配绑定相应的pv
    • 6.4 挂载共享卷,并且进行共享目录写入测试
    • 6.5 K8S支持的存储卷的访问模式
  • 七、StorageClass + nfs-client-provisioner搭建动态创建pv
    • 7.1 在NFS服务器配置nfs服务
    • 7.2 创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则
    • 7.3 创建 StorageClass,负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联
    • 7.4 挂载共享卷,并且进行共享目录写入测试
  • 八、 总结


一、为什么要存储卷?

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume

二、emptyDir存储卷

当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。

emptyDir可实现Pod中的容器之间共享目录数据,但是emptyDir卷不能持久化数据,会随着Pod生命周期结束而一起删除。

//创建一个模板文件
mkdir /opt/volumes
cd /opt/volumes

kubectl run myapp-demo --image=soscscs/myapp:v1 --port=80 --dry-run=client -o yaml > myapp-demo.yaml

vim myapp-demo.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo
  name: myapp-demo
spec:
  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo
    ports:
    - containerPort: 80
cp myapp-demo.yaml demo1-emptydir.yaml
vim demo1-emptydir.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo
  name: myapp-empty
spec:
  volumes:
  - name: test-vol
    emptyDir: {}

  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: test-vol
      mountPath: /var/www/
  - image: busybox:1.28
    name: busybox-demo
    ports:
    - containerPort: 80
    command: ['/bin/sh','-c','sleep 3600']
    volumeMounts:
    - name: test-vol
      mountPath: /data/

在这里插入图片描述

在这里插入图片描述

kubectl describe pod myapp-empty 

在这里插入图片描述

kubectl exec -it myapp-empty -c myapp-demo sh
//再另外开一个进程
kubectl exec -it myapp-empty -c busybox-demo sh

在这里插入图片描述
在这里插入图片描述

三、hostPath存储卷

hostPath卷将 node 节点的文件系统中的文件或目录挂载到集群中。
hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失。

把Node节点上的目录/文件挂载到容器中,可实现持久化数据存储。但是存储空间会受到Node节点的单机限制,Node节点故障数据就会丢失,且Pod不能实现跨节点共享数据

https://kubernetes.io/docs/concepts/storage/volumes#hostpath

cp myapp-demo.yaml demo2-hostpath.yaml 
vim demo2-hostpath.yaml 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo
  name: myapp-demo
spec:
  volumes:
  - name: hostpath-vol
    hostPath:
      path: /var/www/html/
      type: DirectoryOrCreate
  nodeSelector:
    test: b
  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: hostpath-vol
      mountPath: /usr/share/nginx/html/
      readOnly: false

在这里插入图片描述

kubectl apply -f demo2-hostpath.yaml
kubectl get pods -o wide

在这里插入图片描述
在这里插入图片描述

//进入容器
kubectl exec -it myapp-demo sh

在这里插入图片描述
在这里插入图片描述
在创建Pod时,node02节点的目录会自动挂载到容器的目录上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、 nfs共享存储卷

另开一台节点上安装nfs,并配置nfs服务

在这里插入图片描述

//在master节点部署
cp myapp-demo.yaml demo3.nfs.yaml
vim demo3.nfs.yaml 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo3
  name: myapp-demo3
spec:
  volumes:
  - name: test-nfs
    nfs:
      path: /opt/share
      server: 192.168.154.13

  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: test-nfs
      mountPath: /usr/share/nginx/html
 kubectl apply -f demo3.nfs.yaml
 kubectl get pods -owide
vim demo3.nfs.yaml 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo3
  name: myapp-demo4
spec:
  nodeName: node02
  volumes:
  - name: test-nfs
    nfs:
      path: /opt/share
      server: 192.168.154.13

  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo
    ports:
    - containerPort: 80
    volumeMounts:
    - name: test-nfs
      mountPath: /usr/share/nginx/html

 kubectl apply -f demo3.nfs.yaml
 kubectl get pods -owide

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 kubectl exec -it myapp-demo3 sh
  cd /usr/share/nginx/html/

 kubectl exec -it myapp-demo4 sh
  cd /usr/share/nginx/html/  

在这里插入图片描述
在这里插入图片描述

五、PVC 和 PV

PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,这个通常都是由运维工程师来定义。

PVC 的全称是 Persistent Volume Claim,是持久化存储的请求。它是用来描述希望使用什么样的或者说是满足什么条件的 PV 存储。

PVC 的使用逻辑:在 Pod 中定义一个存储卷(该存储卷类型为 PVC),定义的时候直接指定大小,PVC 必须与对应的 PV 建立关系,PVC 会根据配置的定义去 PV 申请,而 PV 是由存储空间创建出来的。PV 和 PVC 是 Kubernetes 抽象出来的一种存储资源。
在这里插入图片描述
一个PV可以个一个或多个POD使用,PV是k8s集群里专用的存储资源,是逻辑划分存储设备空间的资源对象。存储资源要提供存储空间给存储资源使用,不能凭空出现
真正提供存储空间的是存储设备,如硬盘挂载的目录,nfs共享的目录,ceph分布式存储等
我们作为K8S集群管理员,可以在K8S集群中创建PV,再从存储设备划分存储空间给PV
然后我的POD想引用哪个PV,得先定义一个PVC,用来描述希望使用什么样的或者说是满足什么条件的 PV 存储,比如多大存储空间,是专用,是一对一,还是一对多
POD会根据PVC去找符合条件的PV进行绑定,最后给POD挂载使用

上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。

创建 StorageClass 需要定义 PV 的属性,比如存储类型、大小等;另外创建这种 PV 需要用到的存储插件,比如 Ceph 等。 有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC,找到对应的 StorageClass,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建需要的 PV 并进行绑定。

动态创建PV
在这里插入图片描述
怎样动态创建PV?
使用StorageClass 引用某一存储设备的存储卷插件,通过调用存储卷插件去到存储设备中动态创建符合PVC需求的存储资源,然后PV和PVC进行绑定,这样Pod就可以使用PV的存储空间

PV是集群中的资源。 PVC是对这些资源的请求,也是对资源的索引检查。

5.1 PV和PVC之间的相互作用遵循的生命周期

PV和PVC之间的相互作用遵循这个生命周期:
Provisioning(配置)—> Binding(绑定)—> Using(使用)—> Releasing(释放) —> Recycling(回收)

Provisioning即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
Binding将 PV 分配给 PVC
UsingPod 通过 PVC 使用该 Volume,并可以通过准入控制StorageProtection(1.9及以前版本为PVCProtection) 阻止删除正在使用的 PVC
ReleasingPod 释放 Volume 并删除 PVC
Reclaiming回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除

5.2 PV 的状态

根据这 5 个阶段,PV 的状态有以下 4 种:
Available(可用):表示可用状态,还未被任何 PVC 绑定
Bound(已绑定):表示 PV 已经绑定到 PVC
Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
Failed(失败):表示该 PV 的自动回收失败

5.3 一个PV从创建到销毁的具体流程

1、一个PV创建完后状态会变成Available,等待被PVC绑定。

2、一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。

3、Pod使用完后会释放PV,PV的状态变成Released。

4、变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。Retain就是保留现场,K8S集群什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。Delete策略,K8S会自动删除该PV及里面的数据。Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

六、静态创建pv和pvc资源由pod运用过程

如图所示我们将选择一台k8s集群之外的服务器作为NFS共享存储服务器,并且按照图中的规格

创建pv,再由k8s集群创建pv资源和pvc资源,最后将其挂载在pod上进行使用
在这里插入图片描述

6.1 在NFS主机上创建共享目录,并且进行exportfs发布

mkdir -p /opt/k8s/v{1..5}
ls -R k8s/

vim /etc/exports
systemctl status nfs
exportfs -arv

在这里插入图片描述

在这里插入图片描述

//其他两个node节点能不能看到
showmount -e 192.168.154.13

在这里插入图片描述

6.2 在master主机编写pv资源创建yaml

访问模式有:

  • ReadWriteOnce
    卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ReadOnlyMany
    卷可以被多个节点以只读方式挂载。
  • ReadWriteMany
    卷可以被多个节点以读写方式挂载。
//在master主机编写pv资源创建yaml
mkdir pv
cd pv/
vim pv1.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  capacity:
    storage: 1Gi
  nfs:
    path: /opt/k8s/v1
    server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  nfs:
    path: /opt/k8s/v2
    server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  capacity:
    storage: 2Gi
  nfs:
    path: /opt/k8s/v3
    server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  capacity:
    storage: 4Gi
  nfs:
    path: /opt/k8s/v4
    server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  capacity:
    storage: 5Gi
  nfs:
    path: /opt/k8s/v1
    server: 192.168.154.13

kubectl apply -f pv1.yaml
kubectl get pv
 

在这里插入图片描述

6.3 创建pvc资源,并且设置匹配绑定相应的pv

https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims

vim pvc1.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc01
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.4 挂载共享卷,并且进行共享目录写入测试

 kubectl run myapp-demo --image=soscscs/myapp:v1 --port=80 --dry-run=client -oyaml > myapp-demo.yaml
cp myapp-demo.yaml demo1.yaml
vim demo1.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo1
  name: myapp-demo1
spec:
  volumes:
    - name: test-vol
      persistentVolumeClaim:
        claimName: mypvc01

  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: test-vol
      mountPath: /data/
kubectl apply -f demo1.yaml 
kubectl exec -it myapp-demo1 sh
cd /data/
echo 'Hello World' > index.html

在这里插入图片描述
在这里插入图片描述

6.5 K8S支持的存储卷的访问模式

在这里插入图片描述

其中 × 表示支持,- 表示不支持

七、StorageClass + nfs-client-provisioner搭建动态创建pv

StorageClass + nfs-client-provisioner的理解
上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。

创建 StorageClass 需要定义 PV 的属性,比如存储类型、大小等;另外创建这种 PV 需要用到的存储插件,比如 Ceph 等。 有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC,找到对应的 StorageClass,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建需要的 PV 并进行绑定。

Kubernetes 本身支持的动态 PV 创建不包括 NFS,所以需要使用外部存储卷插件分配PV。详见:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

卷插件称为 Provisioner(存储分配器),NFS 使用的是 nfs-client,这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。
Provisioner:用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cepfs)。

7.1 在NFS服务器配置nfs服务

//nfs服务器
mkdir /opt/k8s
vim /etc/exports
/opt/k8s 192.168.154.0/24(rw,sync,no_root_squash)

在这里插入图片描述
在这里插入图片描述

7.2 创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则

//master节点
cd pv/
mkdir sc
cd sc/
unzip nfs-client.zip 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建网络插件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.3 创建 StorageClass,负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联

cd /etc/kubernetes/manifests/
vim kube-apiserver.yaml 

- --feature-gates=RemoveSelfLink=false

在这里插入图片描述

vim pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc01-nfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-client-storageclass

在这里插入图片描述

7.4 挂载共享卷,并且进行共享目录写入测试

vim pod-demo.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp-demo1
  name: myapp-demo1
spec:
  volumes:
    - name: test-vol
      persistentVolumeClaim:
        claimName: mypvc01-nfs

  containers:
  - image: soscscs/myapp:v1
    name: myapp-demo1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: test-vol
      mountPath: /data/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

cp pvc.yaml pvc1.yaml
vim pvc1.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc02-nfs
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-client-storageclass

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、 总结

k8s 存储卷 volumes

  • emptyDir :可实现Pod中的容器之间共享目录数据,但emptyDir存储卷没有持久化数据的能力,存储卷会随着Pod生命周期结束而一起删除
  • hostPath :将Node节点上的目录/文件挂载到容器的指定目录中,有持久化数据的能力,但只能在单个Node节点上持久化数据,不能实现跨节点的Pod共享数据
  • nfs :使用NFS服务将存储设备的共享目录挂载到容器的指定目录中,有持久化数据的能力,且也能实现跨节点的Pod共享数据

PV PVC
PV :K8S在指定的存储设备空间中逻辑划分创建的可持久化的存储资源对象
PVC :是对PV资源对象的请求和绑定,也是一致Pod可挂载的存储卷类型

PV的状态 4 种

  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PV 已经绑定到 PVC
  • Released(已释放):表示 PVC 被删掉,但是资源尚未被回收
  • Failed(失败):表示该 PV 的自动回收失败

创建和使用 静态PV
1)准备好存储设备和共享目录
2)手动创建PV资源,配置 存储卷类型 访问模式(RWO RWX ROX) 存储能力大小
3)创建PVC资源,配置请求PV资源的问模式(必要条件,必须是PV能支持的访问模式)和存储大小(就近选择大于等于指定大小的PV)来绑定PV(一个PV只能绑定一个PVC)
4)创建Pod资源挂载PVC存储卷,配置存储卷类型为 persistentVolumeClaim ,在容器配置中定义存储卷的挂载点

创建和使用 动态PV
1)准备好存储设备和共享目录
2)如果是外置存储卷插件,需要先创建service account账户(Pod应用使用的账户)和RBAC授权(创建角色授予相应资源对象的操作权限,角色与账户绑定),使得 sa 账户具有对PV PVC SC等资源的操作权限
3)创建外置存储卷插件Provisioner的Pod,配置中使用sa账户作为Pod账户,并设置相关环境变量参数
4)创建SC资源(StorageClass),配置中引用之前定义的Provisioner的名称

-------------- 以上过程是一劳永逸的,以后只需要创建PVC时引用StorageClass就可以动态生成相关PV资源 ---------------
5)创建PVC资源,配置中引用StorageClass资源名称。创建PVC资源后会自动创建相关的PV资源。
6)创建Pod资源挂载PVC存储卷,配置存储卷类型为 persistentVolumeClaim ,在容器配置中定义存储卷的挂载点

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

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

相关文章

c++11 标准模板(STL)(std::basic_ofstream)(三)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ofstream : public std::basic_ostream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

【2023 华数杯全国大学生数学建模竞赛】 C 题母亲身心健康对婴儿成长的影响 完整建模方案解析、参考文章及代码

目录 完整思路下载链接&#xff1a;这里获取2023华数杯全国大学生数学建模竞赛题目C 题母亲身心健康对婴儿成长的影响✅ 问题1问题1建模思路✅ 问题2问题2建模思路✅ 问题3问题3建模思路✅ 问题4问题4建模思路✅ 问题5问题5建模思路提供的数据和资料&#xff1a; 完整思路下载链…

【深度学习_TensorFlow】激活函数

写在前面 上篇文章我们了解到感知机使用的阶跃函数和符号函数&#xff0c;它们都是非连续&#xff0c;导数为0的函数&#xff1a; 建议回顾上篇文章&#xff0c;本篇文章将介绍神经网络中的常见激活函数&#xff0c;这些函数都是平滑可导的&#xff0c;适合于梯度下降算法。 写…

iphone卡在恢复模式怎么办?修复办法分享!

iPhone 卡在恢复屏幕问题是 iPhone 用户在软件更新或恢复期间的常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将探讨 iPhone 卡在恢复屏幕上的主要原因&#xff0c;以及如何轻松修复它。 iPhone卡在恢复屏幕问题上没有一个特别的原因&#xff0c;但…

[CKA]考试之检查可用节点数量

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 检查集群中有多少节点为Ready状态&#xff08;不包括被打上 Taint&#xff1…

games106 homework1实现

games106 homework1 gltf介绍图&#xff1a; 骨骼动画 动画相关属性&#xff1a; 对GLTF的理解参照了这篇文章&#xff1a; glTF格式详解(动画) GLTF文件格式详解 buffer和bufferView对象用于引用动画数据。 buffer对象用来指定原始动画数据, bufferView对象用来引用buff…

《面试1v1》Kafka的ack机制

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

C# 使用堆栈实现队列

232 使用堆栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;、、、&#xff09;&#xff1a;pushpoppeekempty 实现 类&#xff1a;MyQueue void push(int x)将元素 x 推到队列的末尾 int pop()从队列的开头移除并返回元素 in…

基于总线加锁和缓存锁(CPU实现原子操作的两种方式)

总线锁 总线锁就是使用处理器提供的一个 LOCK&#xff03;信号&#xff0c;当一个处理器在总线上输出此信号时&#xff0c;其他处理器的请求将被阻塞住&#xff0c;那么该处理器可以独占共享内存。 CPU和内存之间的通信被锁&#xff01;&#xff01; 如果多个 处 理器同 时对 …

Vue-函数式组件

最近在开发项目的时候&#xff0c;定制了一个公司内部样式的Modal模态框组件。 Modal组件伪代码 <!-- Modal/index.vue--> <template><div class"modal-container" id"modalContainer"><!-- Modal Content --><div class&quo…

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

(4)(4.4) 使用测试版和开发版

文章目录 4.4 使用测试版和开发版 4.4.1 测试版 4.4.2 最新开发版本 4.4.3 自定义固件构建服务器 4.4.4 固件的局限性 4.5 测试 4.4 使用测试版和开发版 4.4.1 测试版 在稳定版(Stable)发布之前&#xff0c;会发布测试版(Beta)。如果你想尝试较新的功能或帮助开发人员飞行…

The Battle of Chibi

题目链接 题意&#xff1a;在n个数的数组中找m个数的严格递增子序列 思路&#xff1a;动态规划dp[i][j]代表以a[i]结尾并且长度为j的子序列方案数 则有状态转移方程&#xff1a; 其中a[i]<1e9&#xff0c;而数组并不能开这么大&#xff0c;所以考虑离散化 离散化后的状态转移…

AutoSAR系列讲解(实践篇)11.6-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

荐读 | 《揭秘云计算与大数据》

当我们回顾过去几十年的科技进步时&#xff0c;云计算和大数据在现代科技发展史上无疑具有里程碑式的意义&#xff0c;它们不仅改变了我们的生活方式&#xff0c;而且对各行各业产生了深远的影响。 在这个数字化时代&#xff0c;云计算和大数据技术已经成为推动全球发展的关键…

python 将excel 多行进行分组合并

def exc():"""# 需要用到分组的概念:将角色和业务单据的进行分组,结果合并为一行"""df pd.read_excel(test33.xlsx)# 设置需要分组的字段cols [姓名, 科目]#agg() 其中的参数字段为之后输出的表格中的列字段df df.groupby(cols).agg({姓名: f…

JSP--Java的服务器页面

jsp是什么&#xff1f; jsp的全称是Java server pages,翻译过来就是java的服务器页面。 jsp有什么作用&#xff1f; jsp的主要作用是代替Servlet程序回传html页面的数据&#xff0c;因为Servlet程序回传html页面数据是一件非常繁琐的事情&#xff0c;开发成本和维护成本都非常高…

Stable Diffusion VAE:改善图像质量的原理、选型与使用指南

VAE Stable Diffusion&#xff08;稳定扩散&#xff09;是一种用于生成模型的算法&#xff0c;结合了变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;和扩散生成网络&#xff08;Diffusion Generative Network&#xff09;的思想。它通过对变分自…

vue2-v-show和v-if有什么区别,使用场景分别是什么?

1、v-show和v-if的共同点 在vue中&#xff0c;v-if和v-show的作用效果是相同的&#xff08;不含v-else&#xff09;&#xff0c;都能控制元素在页面是否显示&#xff0c;在用法上也相同。 当表达式为true的时候&#xff0c;都会占据页面的位置 当表达式为false的时候&#xff…

如果网站用了CDN,我怎么找到它的真实IP?

0x01 验证是否存在CDN 方法1&#xff1a; 很简单&#xff0c;使用各种多地 ping 的服务&#xff0c;查看对应 IP 地址是否唯一&#xff0c;如果不唯一多半是使用了CDN&#xff0c; 多地 Ping 网站有&#xff1a; http://ping.chinaz.com/ http://ping.aizhan.com/ http://ce.…