pv和pvc

news2024/10/7 16:15:23

一、PV和PVC详解

当前,存储的方式和种类有很多,并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中,放了方便我们的使用和管理,Kubernetes提出了PV和PVC的概念,这样Kubernetes集群的管理人员就可以将注意力集中到Kubernetes集群中来,而无需操心后端的存储设备。

pv : 相当于磁盘分区

pvc: 相当于磁盘请求

PersistentVolumeClaim(PVC)是用户存储的请求

PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),

定义的时候直接指定大小,pvc必须与对应的pv建立关系,

pvc会根据定义去pv申请,而pv是由存储空间创建出来的。

pv和pvc是kubernetes抽象出来的一种存储资源。

PV : 持久化卷的意思,是对底层的共享存储的一种抽象

PVC(Persistent Volume Claim)是持久卷请求于存储需求的一种声明(PVC其实就是用户向kubernetes系统发出的一种资源需求申请。)

从上图可以看出,底层的存储可以使各种类型,包括NFS、Ceph、CIFS等等,而Kubernetes会把这些存储统一抽象为PV。PV,即Persistent Volume,是集群中配置的存储资源。PVC,即Persistent Volume Claim,是用户存储的请求,通常我们在一个Pod中定义一个存储卷,定义的时候会指定该存储卷的相关信息,比如空间大小、可读可写等属性。但是PVC并不是真正的存储空间,Pod的PVC和PV之间必须建立某种联系,这样才能使得Pod可以调用实际存储空间。

kind: PersistentVolume
metadata:
  name: pv2
apiVersion: v1  
spec:
  nfs: # 存储类型,与底层真正存储对应
  capacity:  # 存储能力,目前只支持存储空间的设置
    storage: 2Gi
  accessModes:  # 访问模式
  storageClassName: # 存储类别
  persistentVolumeReclaimPolicy: # 回收策略

使用了PV和PVC之后,工作可以得到进一步的细分:

存储:存储工程师维护

PV: kubernetes管理员维护

PVC:kubernetes用户维护

二、PV和PVC生命周期

实际上,不管是PV,还是PVC,都遵循以下生命周期:

2.1 Provisioning

Provisioning,即配置阶段。一般而言,PV的提供方式有两种——静态和动态。

所谓静态提供,就是Kubernetes管理员创建多个PV,这些PV的存储空间等属性已经确定,并且已经和真实的存储设备进行了关联。Pod中的PVC可以根据需要请求这些PV。

所谓动态提供,需要依托与StorageClass的支持,这时Kubernetes会尝试为PVC来动态的创建PV。这样做的好处是避免出现这种情况:部分PVC被分配给了远远超出其资源需求的PV、或者说系统存在很多资源较少的PV,但是一个资源需求很高的PVC缺无法被满足的情况。

2.2 Binding

在动态配置的情况下,用户创建或者已经创建了具有特定数量的PVC后,PVC与PV绑定的过程。

如果没有满足PVC请求需求的PV,那么PVC将无法被创建,因此造成的结果就是相应的Pod也不会被创建。

2.3 Using

即PVC与PC绑定后,Pod对存储空间的使用过程。

2.4 Releasing

当Pod被删除或者对该PV的资源使用结束后,Kubernetes就会删除该PVC对象,相应的也会回收PV资源,这时的PV就会处于这种状态。但是此时的PV还需要处理完毕之前的Pod在该存储卷上存储信息后才能够被使用。

2.5 Reclaiming

PV的回收策略对被释放的PV的处理过程。

2.6 Recycling

根据配置,有时PV会被执行擦除操作,删除掉该存储空间上的所有信息,并且该存储资源也可以被再次使用。

三、访问模式

3.1 PV 的访问模式(accessModes)

模式

解释

ReadWriteOnce

(RWO)

可读可写,但只支持被单个节点挂载。

ReadOnlyMany

(ROX)

只读,可以被多个节点挂载。

ReadWriteMany

(RWX)

多路可读可写。这种存储可以以读写的方式被多个节点共享。不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。

3.2 PV的回收策略(persistentVolumeReclaimPolicy)

策略

解释

Retain

不清理,保留Volume (需要手动清理)

Recycle

删除数据,即rm -rf /thevolumel*(只有NFS和HostPath支持)

Delete

删除存储资源,比如删除AWS EBS卷(只有AWS EBS,GCE PD,Azure Disk和Cinder支持)

3.3 PV的状态

状态

解释

Available

可用

Bound

已经分配给PVC

ReleasedPVC

解绑但还未执行回收策略

Failed

发生错误

四、实验验证

4.1 安装nfs

# 1、创建目录
[root@k8s ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
 
# 2、暴露服务
[root@k8s ~]# vim /etc/exports
/root/data/pv1  192.168.223.0/24(rw,sync,no_root_squash)
/root/data/pv2  192.168.223.0/24(rw,sync,no_root_squash)
/root/data/pv3  192.168.223.0/24(rw,sync,no_root_squash)
 
# 3、重启服务
[root@k8s ~]#  systemctl restart nfs

4.2 创建pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv1
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain  #回收策略
  storageClassName: nfs    #类别名字
  nfs:                       #nfs存储
    path: /root/data/pv1      #nfs挂载路径
    server: 192.168.15.30    #对应的nfs服务器
 
 
 
 
[root@k8s pv]# kubectl apply -f pv.yaml 
persistentvolume/pv1 created
[root@k8s pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    10Gi       RWX            Retain           Available           nfs                     4s

4.3 PVC

PVC是资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。下面是资源清单文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
  namespace: dev
spec:
  accessModes: # 访问模式
  selector: # 采用标签对PV选择
  storageClassName: # 存储类别
  resources: # 请求空间
    requests:
      storage: 5Gi

PVC 的关键配置参数说明:

访问模式(accessModes)

​用于描述用户应用对存储资源的访问权限

选择条件(selector)

通过Label Selector的设置,可使PVC对于系统中己存在的PV进行筛选

存储类别(storageClassName)

PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的pv才能被系统选出

资源请求(Resources )

描述对存储资源的请求

4.4 实验

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc3
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi # 如果pvc大于pv,则绑定不上

# 1、创建pvc

[root@k8s ~]# kubectl create -f pvc.yaml

persistentvolumeclaim/pvc1 created

persistentvolumeclaim/pvc2 created

persistentvolumeclaim/pvc3 created

# 2、查看pvc

[root@k8s ~]# kubectl get pvc -n dev -o wide

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE

pvc1 Bound pv1 1Gi RWX 15s Filesystem

pvc2 Bound pv2 2Gi RWX 15s Filesystem

pvc3 Bound pv3 3Gi RWX 15s Filesystem

# 3、查看pv

[root@k8s k8s]# kubectl get pv -n dev

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

pv1 1Gi RWX Retain Bound dev/pvc1 4m25s

pv2 2Gi RWX Retain Bound dev/pvc2 4m25s

pv3 3Gi RWX Retain Bound dev/pvc3

创建pods.yaml, 使用pv

apiVersion: v1

kind: PersistentVolume

metadata:

name: pv2

spec:

capacity:

storage: 2Gi

accessModes:

- ReadWriteMany

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /root/data/pv2 #路径和地址全部指向nfs机器

server: 192.168.223.30

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: pv3

spec:

capacity:

storage: 1Gi

accessModes:

- ReadWriteMany

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /root/data/pv3

server: 192.168.223.30

apiVersion: v1

kind: Service

metadata:

name: nginx

labels:

app: nginx

spec:

ports:

- port: 80

name: web

clusterIP: none #无头service

selector:

app: nginx

---

apiVersion: apps/v1

kind: StatefulSet #一个接着一个创建

metadata:

name: web

spec:

selector:

matchLabels:

app: nginx

serviceName: "nginx"

replicas: 3

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: wangyanglinux/myapp:v1

ports:

- containerPort: 80

name: web

volumeMounts:

- name: www

mountPath: /usr/share/nginx/html

volumeClaimTemplates:

- metadata:

name: www

spec:

accessModes: [ "ReadWriteMany" ]

storageClassName: "nfs"

resources:

requests:

storage: 1Gi

[root@k8s pv]# kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

www-web-0 Bound pv3 1Gi RWX nfs 10s

www-web-1 Bound pv2 2Gi RWX nfs 4s

[root@k8s pv]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web-0 1/1 Running 0 17s

web-1 1/1 Running 0 11s

web-2 0/1 Pending 0 5s

[root@k8s pv]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web-0 1/1 Running 0 28s

web-1 1/1 Running 0 22s

web-2 0/1 Pending 0 16s

[root@k8spv]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web-0 1/1 Running 0 29s

web-1 1/1 Running 0 23s

效果测试

#查看pv2的存储

[root@k8s pv]# kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

pv2 2Gi RWX Retain Bound default/www-web-1 nfs 93s

pv3 1Gi RWX Retain Bound default/www-web-0 nfs 93s

[root@k8s pv]# kubectl describe pv pv2

Name: pv2

Labels: <none>

Annotations: pv.kubernetes.io/bound-by-controller: yes

Finalizers: [kubernetes.io/pv-protection]

StorageClass: nfs

Status: Bound

Claim: default/www-web-1

Reclaim Policy: Retain

Access Modes: RWX

VolumeMode: Filesystem

Capacity: 2Gi

Node Affinity: <none>

Message:

Source:

Type: NFS (an NFS mount that lasts the lifetime of a pod)

Server: 192.168.223.30

Path: /root/data/pv2

ReadOnly: false

Events: <none>

#进入挂载目录创建index.html文件

[root@k8s pv]# cd /root/data/pv2

[root@k8s pv2]# ls

[root@k8s pv2]# vim index.html

[root@k8s pv2]# cat index.html

aaaaaa

[root@k8s pv2]# chmod 777 index.html

[root@k8s pv2]# kubectl get pv -o wide

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE

pv2 2Gi RWX Retain Bound default/www-web-1 nfs 4m20s Filesystem

pv3 1Gi RWX Retain Bound default/www-web-0 nfs 4m20s Filesystem

[root@k8s pv2]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web-0 1/1 Running 0 4m14s 10.150.2.120 k8s-node-02 <none> <none>

web-1 1/1 Running 0 4m8s 10.150.1.96 k8s-node-01 <none> <none>

web-2 0/1 Pending 0 4m2s <none> <none> <none> <none>

[root@k8s pv2]# curl 10.150.1.96

aaaaaa

statefulset访问的名称一样,当删除pod的时候 ,名称不变。地址会变。例如web-1一样。

[root@k8s pv2]# kubectl delete pods web-1

pod "web-1" deleted

[root@k8s pv2]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web-0 1/1 Running 0 9m26s

web-1 1/1 Running 0 58s

web-2 0/1 Pending 0 9m14s

[root@k8s pv2]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web-0 1/1 Running 0 9m35s 10.150.2.120 k8s-node-02 <none> <none>

web-1 1/1 Running 0 67s 10.150.1.97 k8s-node-01 <none> <none>

web-2 0/1 Pending 0 9m23s <none> <none> <none> <none>

#新的IP地址访问,一样可以访问到

[root@k8s-master-01 pv2]# curl 10.150.1.97

aaaaaa

[root@k8s-master-01 pv2]#

其余pv类似

五、关于statefulset

匹配 Pod name(网络标识)的模式为: (statefulset 名称)-(序号),比如上面的示例: web-0,web-1,web-2

StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为: $(podname).(headlessserver name),也就意味着服务间是通过Pod域名来通信而非Pod lP,因为当Pod所在Node发生故障时,Pod会被飘移到其它Node 上,Pod IP会发生变化,但是Pod域名不会有变化

tatefulSet使用Headless服务来控制Pod的域名,这个域名的FQDN为: (servicename).(namespace).svc.cluster.local,其中,"cluster.local”指的是集群的域名

根据volumeClaimTemplates,为每个Pod创建一个pvc, pvc的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的volumeMounts.name=www,Podname=web-[0-2],因此创建出来的PVC是www-web-0、www-web-1、www-web-2

删除Pod不会删除其pvc,手动删除pvc将自动释放pv

[root@k8s pv2]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
test-pd   1/1     Running   0          14s
web-0     1/1     Running   0          16m
web-1     1/1     Running   0          8m16s
web-2     0/1     Pending   0          16m
[root@k8s pv2]# kubectl exec -it test-pd -- sh
/ # ping web-0.nginx
ping: bad address 'web-0.nginx'
/ # ping web-0.nginx
PING web-0.nginx (10.150.2.120): 56 data bytes
64 bytes from 10.150.2.120: seq=0 ttl=64 time=4.891 ms
64 bytes from 10.150.2.120: seq=1 ttl=64 time=0.209 ms
64 bytes from 10.150.2.120: seq=2 ttl=64 time=0.196 ms
64 bytes from 10.150.2.120: seq=3 ttl=64 time=0.131 ms
64 bytes from 10.150.2.120: seq=4 ttl=64 time=0.128 ms

5.1 statefulset的启停顺序

有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建(从0到N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态。

有序删除:当Pod被删除时,它们被终止的顺序是从N-1到0。

有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于Running和Ready状态。

5.2 StatefulSet使用场景:

稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现。稳定的网络标识符,即Pod重新调度后其PodName和HostName不变。

有序部署,有序扩展,基于init containers来实现。

有序收缩。

[root@k8s pv2]# kubectl get pods -o wide -n kube-system 
NAME                                    READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
coredns-f68b4c98f-nkqlm                 1/1     Running   2          22d   10.150.0.7      k8s-master-01   <none>           <none>
coredns-f68b4c98f-wzrrq                 1/1     Running   2          22d   10.150.0.6      k8s-master-01   <none>           <none>
etcd-k8s-master-01                      1/1     Running   3          22d   192.168.223.30   k8s-master-01   <none>           <none>
kube-apiserver-k8s-master-01            1/1     Running   3          22d   192.168.223.30   k8s-master-01   <none>           <none>
kube-controller-manager-k8s-master-01   1/1     Running   4          22d   192.168.223.30   k8s-master-01   <none>           <none>
kube-flannel-ds-8zj9t                   1/1     Running   1          11d   192.168.223.30   k8s-node-01     <none>           <none>
kube-flannel-ds-jmq5p                   1/1     Running   0          11d   192.168.223.30   k8s-node-02     <none>           <none>
kube-flannel-ds-vjt8b                   1/1     Running   4          11d   192.168.223.30   k8s-master-01   <none>           <none>
kube-proxy-kl2qj                        1/1     Running   2          22d   192.168.223.30   k8s-master-01   <none>           <none>
kube-proxy-rrlg4                        1/1     Running   1          22d   192.168.223.9  k8s-node-01     <none>           <none>
kube-proxy-tc2nd                        1/1     Running   0          22d   192.168.223.10   k8s-node-02     <none>           <none>
kube-scheduler-k8s-master-01            1/1     Running   4          22d   192.168.223.30  k8s-master-01   <none>           <none>
[root@k8s-master-01 pv2]# dig  -t A nginx.default.svc.cluster.local. @10.150.0.7
 
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t A nginx.default.svc.cluster.local. @10.244.0.7
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26852
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx.default.svc.cluster.local. INA
 
;; ANSWER SECTION:
nginx.default.svc.cluster.local. 30 INA10.111.55.241
 
;; Query time: 7 msec
;; SERVER: 10.150.0.7#53(10.150.0.7)
;; WHEN: 一 08月 06 00:00:38 CST 2021
;; MSG SIZE  rcvd: 107
删除对应的pod、svc、statefulset、pv、pvc 
[root@k8s pv]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
test-pd   1/1     Running   0          18m
web-0     1/1     Running   0          34m
web-1     1/1     Running   0          26m
web-2     0/1     Pending   0          34m
 
[root@k8s pv]# kubectl delete -f pod.yaml 
service "nginx" deleted
statefulset.apps "web" deleted
 
[root@k8s pv]# kubectl get pods
NAME      READY   STATUS        RESTARTS   AGE
test-pd   1/1     Running       0          18m
web-0     0/1     Terminating   0          35m
web-1     0/1     Terminating   0          26m
 
[root@k8s pv]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   22d
 
[root@k8s pv]# kubectl delete statefulsets.apps  --all
No resources found
[root@k8s pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pv2    2Gi        RWX            Retain           Bound    default/www-web-1   nfs                     35m
pv3    1Gi        RWX            Retain           Bound    default/www-web-0   nfs                     35m
 
[root@k8s pv]# kubectl get pvc
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0   Bound     pv3      1Gi        RWX            nfs            35m
www-web-1   Bound     pv2      2Gi        RWX            nfs            35m
www-web-2   Pending                                      nfs            35m

[root@k8s pv]# kubectl delete pvc --all
persistentvolumeclaim "www-web-0" deleted
persistentvolumeclaim "www-web-1" deleted
persistentvolumeclaim "www-web-2" deleted
 
#查看pv显示release状态
[root@k8s pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM               STORAGECLASS   REASON   AGE
pv2    2Gi        RWX            Retain           Released   default/www-web-1   nfs                     36m
pv3    1Gi        RWX            Retain           Released   default/www-web-0   nfs                     36m
 
#编辑pv2的yaml格式、因为 claimRef的显示所以一直显示release的状态,可以通过edit修改pv2的yaml,删除对应的claimRef的那一段
 
[root@k8s pv]# kubectl edit pv pv2 -o yaml
 
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv2"},"spec":{"accessModes":["ReadWriteMany"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/root/data/pv2","server":"192.168.15.31"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs"}}
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2021-12-26T15:34:19Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: pv2
  resourceVersion: "501755"
  uid: 7b9f8b31-f111-4064-9ec7-d06e55f6bebd
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 2Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: www-web-1
    namespace: default
    resourceVersion: "498363"
    uid: 7d47eaf8-8bed-40fc-b790-18e93a8a0398
  nfs:
    path: /root/data/pv2
"/tmp/kubectl-edit-euy6w.yaml" 37L, 1260C
#这时候发现状态已经为 Available状态
[root@k8s pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
pv2    2Gi        RWX            Retain           Available                       nfs                     44m
pv3    1Gi        RWX            Retain           Released    default/www-web-0   nfs                     44m

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】torch.einsum()解析

【Python】torch.einsum()解析 文章目录【Python】torch.einsum()解析1. 介绍2. 示例2.1 Pytorch矩阵乘法2.2 Numpy高阶张量3. 参考1. 介绍 爱因斯坦简记法&#xff1a;是一种由爱因斯坦提出的&#xff0c;对向量、矩阵、张量的求和运算 ∑\sum∑ 的求和简记法。在该简记法当中…

链表面试题

链表面试题1. 删除链表中等于给定值 val 的所有结点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。4. 输入一个链表&#xff0c;输出该链表中倒数第k个结点。5. 将两个有…

延时任务的四种实现方式

什么是延迟任务&#xff1f;顾明思议&#xff0c;我们把需要延迟执行的任务叫做延迟任务。延迟任务的使用场景有以下这些&#xff1a;红包 24 小时未被查收&#xff0c;需要延迟执退还业务&#xff1b;每个月账单日&#xff0c;需要给用户发送当月的对账单&#xff1b;订单下单…

计算机网络之MAC和IP地址

MAC地址 在局域网中&#xff0c;硬件地址&#xff0c;又称为物理地址或MAC地址。 目前现在的局域网中实际上使用的都是6字节的MAC地址&#xff0c;所以每一个以太网设备都具有唯一的MAC地址。 MAC地址的格式 假设传输使用的是IP数据&#xff0c;V2的MAC帧较为简单&#xff…

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测&#xff0c;希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9&#xff0c;否则SonarLint无法连接&#xff08;GitHub-SonarLint-Wiki第一行就有说明&#xff09;&#xff01;&#xff01;&#xff01;S…

【前端】一个更底层库-React基础知识点第2篇

目录属性状态PROPSPROP VALIDATIONSTATEFORMCONTROLLED COMPONENTSMIXINCOMPONENT APICOMPONENT LIFECYCLETOP API上一篇文章也是React基础知识点&#xff0c;了解到了React是什么&#xff1f;为什么要使用React&#xff1f;还知道了JSX概述&#xff0c;JSX嵌入变量&#xff0c…

python Django中的cookies和session会话保持技术

cookies和session都是为了保持会话状态而诞生的两个存储技术会话定义&#xff1a; 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话HTTP协议是无状态的&#xff0c;导致会话状态难以保持Cookies-定义 cookies是保存在客户端浏览器上的…

超简单的卷积和加法融合

神经网络的优化除了之前提到的一些硬件优化手段(AI硬件加速拾遗)之外&#xff0c;还有很多图层方面的优化手段。大家好啊&#xff0c;我是董董灿。 而且图层方面的优化&#xff0c;有时效果更佳。往往一个有效的优化&#xff0c;甚至可以“消除”掉一个算子的存在。 这里的“…

Vue组件-$refs、$nextTick和name属性的使用

Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…

Ubuntu系统新硬盘挂载

Ubuntu系统新硬盘挂载 服务器通常会面临存储不足的问题&#xff0c;大部分服务器都是ubuntu系统&#xff0c;该篇博客浅浅记载一下在ubuntu系统上挂载新硬盘的步骤。本篇博文仅仅记载简单挂载一块新的硬盘&#xff0c;而没有对硬盘进行分区啥的。如果需要更加完善的教程&#…

【C++】平衡二叉搜索(AVL)树的模拟实现

一、 AVL树的概念 map、multimap、set、multiset 在其文档介绍中可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树…

Java文档搜索引擎总结

Java文档搜索引擎总结项目介绍项目使用的技术栈前端页面展示后端逻辑部分索引部分搜索模块部分Web模块部分项目介绍 Java文档搜索引擎项目是一个SSM项目&#xff0c;该项目的前端界面部分是由搜索页面和展示页面组成&#xff0c;后端部分索引模块&#xff08;ScanAnalysis、in…

UNET 对 CARVANA 数据集的分割

目录 1. 介绍 2. UNET 网络 3. dataset 数据加载 4. utils 工具模块 4.1 get_loaders 函数 4.2 check_accuracy 函数 4.3 save_predictions_as_imgs 函数 4.4 完整代码 5. train 函数 5.1 关于导入的库文件 5.2 设置超参数 5.3 train_fn 训练一个epoch函数 5.4 m…

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统&#xff1f;版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且可以对…

主成分分析(PCA)方法 和协方差 相关系数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.主成分分析&#xff08;PCA&#xff09;方法2.算法步骤前言 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种数据降…

Android工厂模式

工厂模式分为三种 :简单工厂模式 、工厂方法模式 、抽象工厂模式 。 目录 简单工厂模式 UML图 实现 使用场景&#xff1a; 优点 &#xff1a; 缺点&#xff1a; 工厂方法模式 UML图 实现 使用场景&#xff1a; 优点&#xff1a; 缺点&#xff1a; 抽象工厂模式 UM…

SpringCloud-负载均衡-Ribbon

文章目录1. 作用&#xff1a;负载均衡2. 应用实战2.1 provider-a代码2.2 provider-b代码2.3 consumer代码2.4 api工具向consumer发送请求查看对provider的调用情况3. ribbon总结3.1 Ribbon 源码核心3.2 如何实现负载均衡的呢&#xff1f;1. 作用&#xff1a;负载均衡 2. 应用实…

演唱会总是抢不到票?教你用Python制作一个自动抢票脚本

人生苦短 我用python 这个大家应该都知道吧&#xff1f; 是中国综合类现场娱乐票务营销平台&#xff0c; 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票&#xff1f; 那么&#xff0c; 今天带大家用Python来制作一个自动抢票的脚本小程序 本文源码python安…

使用Java对稀疏数组的压缩与还原

稀疏矩阵的压缩与还原 稀疏数组中元素个数很少或者有大量的重复值&#xff0c;如果直接保存保存&#xff0c;会浪费很多空间&#xff0c;这时&#xff0c;就可以考虑对数组进行压缩存储。 先定义一个稀疏数组 //创建一个二维数组 11 * 11 int[][] array1 new int[11][11]; /…