学习笔记二十五:持久化存储

news2024/11/16 5:46:49

这里写目录标题

  • 在k8s中为什么要做持久化存储
      • 查看k8s支持哪些存储
      • 常用的如下:
      • 使用存储卷,需要经历如下步骤
  • k8s持久化存储:emptyDir
  • k8s持久化存储:hostPath
      • hostpath存储卷缺点
  • k8s持久化存储:nfs
      • 搭建nfs服务
      • k8snode2和k8snode1上也安装nfs驱动
      • 在k8snode1上手动挂载测试:
      • 创建Pod,挂载NFS共享出来的目录
  • k8s持久化存储: PVC
    • k8s PV是什么
    • k8s PVC是什么
    • k8s PVC和PV工作原理
      • pv的供应方式
      • 绑定
      • 使用
    • 回收策略
    • 创建pod,使用pvc作为持久化存储卷
    • 创建pv
    • 创建pvc,和符合条件的pv绑定
    • 使用pvc和pv的注意事项
    • 删除pvc的步骤:
    • 演示pv用Delete回收策略:

在k8s中为什么要做持久化存储

在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。因为Pod是有生命周期的,如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到pod数据持久化存储。

查看k8s支持哪些存储

kubectl explain pods.spec.volumes
KIND:     Pod
VERSION:  v1
RESOURCE: volumes <[]Object>
DESCRIPTION:
     List of volumes that can be mounted by containers belonging to the pod.
     More info: https://kubernetes.io/docs/concepts/storage/volumes
     Volume represents a named volume in a pod that may be accessed by any
     container in the pod.
FIELDS:
   awsElasticBlockStore	<Object>
   azureDisk	<Object>
   azureFile	<Object>
   cephfs	<Object>
   cinder	<Object>
   configMap	<Object>
   csi	<Object>
   downwardAPI	<Object>
   emptyDir	<Object>
   ephemeral	<Object>
   fc	<Object>
   flexVolume	<Object>
   flocker	<Object>
   gcePersistentDisk	<Object>
   gitRepo	<Object>
   glusterfs	<Object>
   hostPath	<Object>
   iscsi	<Object>
   name	<string> -required-
   nfs	<Object>
   persistentVolumeClaim	<Object>
   photonPersistentDisk	<Object>
   portworxVolume	<Object>
   projected	<Object>
   quobyte	<Object>
   rbd	<Object>
   scaleIO	<Object>
   secret	<Object>
   storageos	<Object>
   vsphereVolume	<Object>

常用的如下:

emptyDir 
hostPath 
nfs 
persistentVolumeClaim
glusterfs
cephfs
configMap
secret

使用存储卷,需要经历如下步骤

  • 定义pod的volume,这个volume指明它要关联到哪个存储上的
  • 在容器中要使用volumemounts挂载对应的存储

经过以上两步才能正确的使用存储卷

k8s持久化存储:emptyDir

Emptydir的官方网址:
https://kubernetes.io/docs/concepts/storage/volumes#emptydir

emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

创建一个pod,挂载临时目录emptyDir

cat emptydir.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-empty
spec:
  containers:
  - name: container-empty
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - emptyDir:
     {}
    name: cache-volume

更新资源清单文件

kubectl apply -f emptydir.yaml 

查看本机临时目录存在的位置,可用如下方法:
查看pod调度到哪个节点

kubectl get pods -o wide | grep empty
pod-empty      1/1     Running     0       10.244.209.152   k8snode1

查看pod的uid

kubectl get pods pod-empty -o yaml | grep uid
uid: 38d60544-8591-468d-b70d-2a66df3a1cf6

登录到k8snode1上

yum install tree -y
tree /var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6
/var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6
├── containers
│   └── container-empty
│       └── c9e06d01
├── etc-hosts
├── plugins
│   └── kubernetes.io~empty-dir
│       ├── cache-volume
│       │   └── ready
│       └── wrapped_default-token-cq5qp
│           └── ready
└── volumes
    ├── kubernetes.io~empty-dir
    │   └── cache-volume
    │       └── aa
    └── kubernetes.io~secret
        └── default-token-cq5qp
            ├── ca.crt -> ..data/ca.crt
            ├── namespace -> ..data/namespace
            └── token -> ..data/token

12 directories, 7 files

由上可知,临时目录在本地的/var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6/volumes/kubernetes.io~empty-dir/cache-volume/下

k8s持久化存储:hostPath

hostPath Volume是指Pod挂载宿主机上的目录或文件。 hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除,所以只要同一个pod被调度到同一个节点上来,在pod被删除重新被调度到这个节点之后,对应的数据依然是存在的。

把tomcat.tar.gz上传到k8snode1和k8snode2上
链接:https://pan.baidu.com/s/1ky_8YG79bdQr8jv2okjdfA?pwd=amsj
提取码:amsj

ctr -n=k8s.io images import  tomcat.tar.gz

创建一个pod,挂载hostPath存储卷

cat hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-hostpath
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: test-nginx
    volumeMounts:
    - mountPath: /test-nginx
      name: test-volume
  - image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent
    name: test-tomcat
    volumeMounts:
    - mountPath: /test-tomcat
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data1
      type: DirectoryOrCreate 

DirectoryOrCreate表示本地有/data1目录,就用本地的,本地没有就会在pod调度到的节点自动创建一个。
https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

在这里插入图片描述

kubectl apply -f hostpath.yaml 

查看pod调度到了哪个物理节点

kubectl get pods -o wide | grep hostpath
test-hostpath      2/2     Running        10.244.209.153   k8snode1

由上面可以知道pod调度到了k8snode1上,登录到k8snode1机器,查看是否在这台机器创建了存储目录

ll /data1/

上面可以看到已经创建了存储目录/data1,这个/data1会作为pod的持久化存储目录
在k8snode1上的/data1下创建一个目录

cd /data1/
mkdir aa

测试存储卷是否可以正常使用,登录到nginx容器

kubectl exec -it test-hostpath -c test-nginx -- /bin/bash      
cd /test-nginx/ 
ls

/test-nginx/目录存在,说明已经把宿主机目录挂载到了容器里
测试存储卷是否可以正常使用,登录到tomcat容器

kubectl exec -it test-hostpath -c test-tomcat -- /bin/bash
cd /test-tomcat/
ls

/test-tomcat/目录存在,说明已经把宿主机目录挂载到了容器里

同一个pod里的test-nginx和test-tomcat这两个容器是共享存储卷的。

hostpath存储卷缺点

  • 单节点
  • pod删除之后重新创建必须调度到同一个node节点,数据才不会丢失
  • 可以用分布式存储:nfs,cephfs,glusterfs

k8s持久化存储:nfs

NFS:网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

搭建nfs服务

以k8s的控制节点作为NFS服务端

yum install nfs-utils -y

在宿主机创建NFS需要的共享目录

mkdir /data/volumes -pv

配置nfs共享服务器上的/data/volumes目录

systemctl start nfs
vim /etc/exports
/data/volumes *(rw,no_root_squash)

rw 该主机对该共享目录有读写权限
no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限

使NFS配置生效,设置开机自启

exportfs -arv
service nfs restart
systemctl enable nfs
systemctl status nfs

k8snode2和k8snode1上也安装nfs驱动

yum install nfs-utils -y
systemctl enable  nfs –now

在k8snode1上手动挂载测试:

mkdir /test 
mount 192.168.40.180:/data/volumes /test/
df -h
192.168.40.180:/data/volumes   50G  5.2G   45G  11% /test

手动卸载:

umount /test

创建Pod,挂载NFS共享出来的目录

Pod挂载nfs的官方地址:
https://kubernetes.io/zh/docs/concepts/storage/volumes/

cat nfs.yaml
apiVersion: v1
kind: Pod
metadata:
 name: test-nfs-volume
spec:
 containers:
 - name: test-nfs
   image: nginx
   imagePullPolicy: IfNotPresent
   ports:
   - containerPort: 80
     protocol: TCP
   volumeMounts:
   - name: nfs-volumes
     mountPath: /usr/share/nginx/html
 volumes:
 - name: nfs-volumes
   nfs:
    path: /data/volumes
server: 192.168.40.180

path: /data/volumes #nfs的共享目录
server:192.168.40.180是k8smaster机器的ip,这个是安装nfs服务的地址

kubectl apply -f nfs.yaml
kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nfs-test-76ffd8fdd6-5cbsk   1/1     Running   0          4s
nfs-test-76ffd8fdd6-9kk48   1/1     Running   0          4s
nfs-test-76ffd8fdd6-pt748   1/1     Running   0          4s
kubectl get pods -owide
NAME                        READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
nfs-test-76ffd8fdd6-5cbsk   1/1     Running   0          36s   10.244.121.44   k8snode1   <none>           <none>
nfs-test-76ffd8fdd6-9kk48   1/1     Running   0          36s   10.244.102.94   k8snode2   <none>           <none>
nfs-test-76ffd8fdd6-pt748   1/1     Running   0          36s   10.244.102.92   k8snode2   <none>           <none>

登录到nfs服务器,在共享目录创建一个index.html

cd /data/volumes/
pwd
/data/volumes
vim index.html 
Hello, Everyone
My name is xianchao
My Chat is luckylucky421302

请求pod,看结果

curl 10.244.102.94

通过上面可以看到,在共享目录创建的index.html已经被pod挂载了
上面说明挂载nfs存储卷成功了,nfs支持多个客户端挂载,可以创建多个pod,挂载同一个nfs服务器共享出来的目录;但是nfs如果宕机了,数据也就丢失了,所以需要使用分布式存储,常见的分布式存储有glusterfs和cephfs

k8s持久化存储: PVC

参考官网:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

k8s PV是什么

PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像pod是k8s集群资源一样。 PV是容量插件,如Volumes,其生命周期独立于使用PV的任何单个pod。

k8s PVC是什么

PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建pod时可以定义这个类型的存储卷。 它类似于一个pod。 Pod消耗节点资源,PVC消耗PV资源。 Pod可以请求特定级别的资源(CPU和内存)。 pvc在申请pv的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

k8s PVC和PV工作原理

PV是群集中的资源。 PVC是对这些资源的请求。
PV和PVC之间的相互作用遵循以下生命周期:

pv的供应方式

  • 可以通过两种方式配置PV:静态或动态。
  • 静态的:集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API中,可供使用。
  • 动态的:当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态

使用

  1. 需要找一个存储服务器,把它划分成多个存储空间;
  2. k8s管理员可以把这些存储空间定义成多个pv;
  3. 在pod中使用pvc类型的存储卷之前需要先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;
  4. pvc被创建之后,就可以当成存储卷来使用了,我们在定义pod时就可以使用这个pvc的存储卷
  5. pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了;
  6. 我们在创建pvc的时候,应该确保和底下的pv能绑定,如果没有合适的pv,那么pvc就会处于pending状态。

回收策略

当我们创建pod时如果使用pvc做为存储卷,那么它会和pv绑定,当删除pod,pvc和pv绑定就会解除,解除之后和pvc绑定的pv卷里的数据需要怎么处理,目前,卷可以保留,回收或删除:

  • Retain:当删除pvc的时候,pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略
  • Delete:删除pvc时即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

创建pod,使用pvc作为持久化存储卷

创建nfs共享目录,在宿主机创建NFS需要的共享目录

mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p

配置nfs共享宿主机上的/data/volume_test/v1…v10目录

cat /etc/exports
/data/volumes 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)

重新加载配置,使配置成效

exportfs -arv

创建pv

参考:https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/#reclaiming

cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v1 
  labels:
    app: v1
spec: 
  nfs:
   server: 192.168.40.180
   path: /data/volume_test/v1
  accessModes: ["ReadWriteOnce"]
  capacity:
   storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v2
  labels:
    app: v2
spec:
  nfs:
   server: 192.168.40.180
   path: /data/volume_test/v2
  accessModes: ["ReadOnlyMany"]
  capacity:
   storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v3
  labels:
    app: v3
spec:
  nfs:
   server: 192.168.40.180
   path: /data/volume_test/v3
  accessModes: ["ReadWriteMany"]
  capacity:
   storage: 3Gi
kubectl apply -f pv.yaml
kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   55s
v2     2Gi        ROX            Retain           Available                                   55s
v3     3Gi        RWX            Retain           Available                                   55s

  • RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问
  • ROX: readonlymany: 多路只读,允许不通node节点的pod以只读方式访问
  • RWX: readwritemany: 多路读写,允许不同的node节点的pod以读写方式访问

创建pvc,和符合条件的pv绑定

cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v1
spec:
  accessModes: ["ReadWriteOnce"]
  selector:
    matchLabels:
      app: v1
  resources:
    requests: 
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: v2
  resources:
    requests: 
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: v3
  resources:
    requests: 
     storage: 3Gi

kubectl apply -f pvc.yaml 
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           17s
pvc-v2   Bound    v2       2Gi        ROX                           17s
pvc-v3   Bound    v3       3Gi        RWX                           17s

看到pvc的status都是bound状态,就说明pvc跟pv已经绑定了
创建pod,挂载pvc

cat pod_pvc.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc
  template: 
    metadata:
      labels:
         cunchu: pvc
    spec:
      containers:
      - name: test-pvc
        image: xianchao/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-html
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:
          claimName: pvc-v1
        name: nginx-html
kubectl apply -f pod_pvc.yaml
kubectl get pods -l cunchu=pvc
NAME                        READY   STATUS    RESTARTS   AGE
pvc-test-65b6487489-84tlz   1/1     Running   0          6m51s
pvc-test-65b6487489-9kdgd   1/1     Running   0          6m51s
pvc-test-65b6487489-xpb7n   1/1     Running   0          6m51s

cd /data/volume_test/v1
mkdir lucky
kubectl exec -it pvc-test-65b6487489-84tlz -- /bin/bash
root@pvc-test-65b6487489-84tlz:/# cd /usr/share/nginx/html/
root@pvc-test-65b6487489-84tlz:/usr/share/nginx/html# ls
lucky

使用pvc和pv的注意事项

  • 我们每次创建pvc的时候,需要事先有划分好的pv,这样可能不方便,那么可以在创建pvc的时候直接动态创建一个pv这个存储类,pv事先是不存在的
  • pvc和pv绑定,如果使用默认的回收策略retain,那么删除pvc之后,pv会处于released状态,我们想要继续使用这个pv,需要手动删除pv,kubectl delete pv pv_name,删除pv,不会删除pv里的数据,当我们重新创建pvc时还会和这个最匹配的pv绑定,数据还是原来数据,不会丢失。
  • 经过测试,如果回收策略是Delete,删除pv,pv后端存储的数据也不会被删除
  • 回收策略:persistentVolumeReclaimPolicy字段

删除pvc的步骤:

  • 需要先删除使用pvc的pod
  • 再删除pvc
kubectl delete -f pod_pvc.yaml 
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           36s
pvc-v2   Bound    v2       2Gi        ROX                           22m
pvc-v3   Bound    v3       3Gi        RWX                           22m
kubectl delete pvc pvc-v1

演示pv用Delete回收策略:

vim pv-1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v4
  labels:
    app: v4
spec:
  nfs:
   server: 192.168.40.180
   path: /data/volume_test/v4
  accessModes: ["ReadWriteOnce"]
  capacity:
   storage: 1Gi
  persistentVolumeReclaimPolicy: Delete
kubectl apply -f  pv-1.yaml
vim pvc-1.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v4
spec:
  accessModes: ["ReadWriteOnce"]
  selector:
    matchLabels:
      app: v4
  resources:
    requests:
      storage: 1Gi
kubectl apply -f pvc-1.yaml
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           5m4s
pvc-v2   Bound    v2       2Gi        ROX                           28m
pvc-v3   Bound    v3       3Gi        RWX                           28m
pvc-v4   Bound    v4       1Gi        RWO                           33s

cat pod_pvc-2.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test-1
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc-1
  template: 
    metadata:
      labels:
         cunchu: pvc-1
    spec:
      containers:
      - name: test-pvc
        image: xianchao/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-html
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:
          claimName: pvc-v4
        name: nginx-html
kubectl apply -f pod_pvc-2.yaml
cd /data/volume_test/v4/
ls
mkdir lucky
kubectl exec -it pvc-test-1-744c9dbc96-5b6c2 -- /bin/bash
root@pvc-test-1-744c9dbc96-5b6c2:/# cd /usr/share/nginx/html/
sbin/  share/ src/   
root@pvc-test-1-744c9dbc96-5b6c2:/# cd /usr/share/nginx/html/
root@pvc-test-1-744c9dbc96-5b6c2:/usr/share/nginx/html# ls
lucky

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

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

相关文章

Vue+Echarts 图表 x轴y轴添加单位字段

需求 代码 两个选择其中一个即可&#xff0c;Y轴也是如此设置 xAxis:{name: 月,// 这个设置只在末尾添加单位axisLabel: {formatter: {value}月 // 在每个x轴坐标都添加了单位} }yAxis:{name: 月,// 这个设置只在末尾添加单位axisLabel: {formatter: {value}月 // 在每个x轴坐…

这个提示词,别人不说,自己绝对想不到

AGI火了一年了&#xff0c;不知道大家的热情还在不在&#xff0c;还有没有在跟进相关的知识&#xff0c;技术&#xff0c;工具与最佳实践。对于我&#xff0c;Claude已经是常驻电脑右下角。 很多朋友问我&#xff0c;说哪些岗位会被颠覆掉&#xff0c;哪些人会被淘汰&#xff0…

【Redis】高并发分布式结构服务器

文章目录 服务端高并发分布式结构名词基本概念评价指标1.单机架构缺点 2.应用数据分离架构应用服务集群架构读写分离/主从分离架构引入缓存-冷热分离架构分库分表&#xff08;垂直分库&#xff09;业务拆分⸺微服务 总结 服务端高并发分布式结构 名词基本概念 应⽤&#xff0…

Mac电脑Android Studio和VS Code配置Flutter开发环境(图文超详细)

一、安装Android Studio 官网地址&#xff1a; https://developer.android.google.cn/ 历史版本下载地址&#xff1a; https://developer.android.com/studio/archive?hlzh-cn 二、安装Xcode 到App Store下载安装最新版本&#xff0c;如果MacOS更新不到13.0以上就无法安装…

Ajax学习笔记第5天

无论做什么&#xff0c;都请记得那是为自己而做&#xff0c;那就毫无怨言&#xff01; 【1. 跨域】 1.什么是跨域 跨域是指浏览器不能执行其他网站的脚本。它是浏览器同源策略造成的&#xff0c;是浏览器对JS实施的安全限制。 2.常见的跨域场景 3.什么事同源策略 &#xff…

python + requests接口自动化测试详解

框架详细教程前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&…

电子学会C/C++编程等级考试2023年05月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符串插入 有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。 时间限制:1000 …

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测(自注意力机制)

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09; 目录 分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

Jmeter(十八):硬件性能监控指标详解

硬件性能监控指标 一、性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况&#xff0c;最大的用户数 2.平均响应时间ART&#xff0c;找出时间较长的业务 3.每秒事务数TPS&#xff0c;服务器的处理能力 性能测试涉及的内容 1.客户端性能测试&#xff1a;web前…

Xcode15 模拟器 Rosetta 模式

打开Xcode15的方式其实没有Rosetta 选项了&#xff0c;但是可以跑Xcode默认Rosetta 模拟器。在xcode中如下方式打开&#xff1a; Product -> Destination -> Destination Architectures -> 打开Show Rosetta Destinations 然后用这些带Rosetta的模拟器运行&#xff1…

嵌入式应用选择正确的系统设计方法:第一部分

现代嵌入式开发设计的功能规格丰富&#xff0c;并且必须在成本&#xff0c;性能等方面遵守多项其他要求&#xff0c;因此它们本质上是复杂的。因此&#xff0c;在设计大型系统时&#xff0c;我们需要方法和框架来帮助指导我们的决策。 在这个由三部分组成的系列的第一部分中&a…

2023年国赛如何运行脚本文件

1、设备脚本文件运行&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1xqLvO0k7LIJVLkzcL0KohQ?pwdwgzj 提取码&#xff1a;wgzj 二维码 2、linux虚拟机脚本文件运行 链接&#xff1a;https://pan.baidu.com/s/1vzRt01AT4u77ynel1KWCaw?pwdwgzj 提取码&#xff1…

马应龙-600993 三季报分析(20231030)

马应龙-600993 基本面分析 基本情况 公司名称&#xff1a;马应龙药业集团股份有限公司 A股简称&#xff1a;马应龙 成立日期&#xff1a;1994-05-09 上市日期&#xff1a;2004-05-17 所属行业&#xff1a;医药制造业 周期性&#xff1a;0 主营业务&#xff1a;主要从事中西药制…

正则表达式引擎比较(翻译自:A comparison of regex engines)

原文&#xff1a; A comparison of regex engines – Rust Leipzig 引言 正则表达式&#xff08;或简称regex&#xff09;通常用于模式搜索算法。 有许多不同的正则表达式引擎提供不同的表达式支持、性能约束和语言绑定。 基于 John Maddock 之前的工作 (regex comparison)和…

C++前缀和算法的应用:统计中位数为 K 的子数组

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 的数组 nums &#xff0c;该数组由从 1 到 n 的 不同 整数组成。另给你一个正整数 k 。 统计并返回 nums 中的 中位数 等于 k 的非空子数组的…

【用Percona Toolkit给mysql大表在不锁表的情况下建索引】

用Percona Toolkit给mysql大表在不锁表的情况下建索引 安装Percona Toolkit建立索引 安装Percona Toolkit 共分为两步骤&#xff1a; 配置仓库 安装文档1 安装 安装文档2 建立索引 由于mysql8默认使用的是caching_sha2_password&#xff0c;认证方式&#xff0c;而Percona…

javaEE -11(10000字HTML入门级教程)

一&#xff1a; HTML HTML 代码是由 “标签” 构成的. 例如&#xff1a; <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. 为开始标签, 为结束标签.少数标签只有开始标签, 称为 “单标签”.开始标签和结束标签之间, 写的是标签的内容. (h…

软件工程:小组开发过程技术(VS VSS UNIX C++)

&#xff08;注&#xff1a;这个东西是2007年写的&#xff0c;算是个缅怀&#xff0c;或是个吐槽。所有注都是本次发布新加的。&#xff09; 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序&#xff0c;实现在小组规模的初级开发过程。这不…

【Linux】——使用yum进行软件安装和卸载Win和Linux文件交互

个人主页点击直达&#xff1a;小白不是程序媛 Linux系列专栏&#xff1a;Linux被操作记 目录 前言&#xff1a; Linux软件包管理器yum 什么是软件包 ​编辑软件查找 如何安装软件 如何卸载软件 lrzsz的使用 将Windows的文件传送到Linux 将Linux的文件传送到Windows …

Linux作业ssh双向免密登陆

目录 步骤一&#xff1a;双方都生成非对称密钥 步骤二&#xff1a;将生成的id_rsa.pub文件发送到对端 步骤三&#xff1a;检测 步骤一&#xff1a;双方都生成非对称密钥 [rootserver ~]# ssh-keygen -t rsa [rootnode1 ~]# ssh-keygen -t rsa 查看是否生成&#xff1a; 步…