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

第32讲:K8S集群与Cephfs文件系统集成

文章目录

    • 1.在K8S环境下RBD与Cephfs的使用对比
    • 2.Cephfs环境介绍
    • 3.在Ceph集群中为K8S创建单独Cephfs文件系统和认证用户
      • 3.1.创建一个K8S使用的Cephfs文件系统
      • 3.2.将创建的Cephfs文件系统挂载到本地路径
      • 3.3.创建K8S连接Ceph集群使用的认证用户
    • 4.K8S PV存储卷使用Cephfs文件系统
      • 4.1.在Cephfs文件系统中为PV挂载创建子目录
      • 4.2.将K8S连接Cephfs的认证用户信息存储在Secret中
      • 4.3.创建PV存储卷对接Cephfs文件系统
      • 4.4.创建PVC资源从PV中获取存储空间
      • 4.5.创建Pod资源将数据持久化到Cephfs中
      • 4.6.验证Pod资源持久化数据导Cephfs
    • 5.K8S StorageClass存储类使用Cephfs文件系统
      • 5.1.Cephfs-Provisioner客户端简介
      • 5.2.在K8S集群中部署Cephfs-Provisioner客户端
      • 5.3.失败了。。。。。。。
    • 6.K8S Volumes存储卷使用Cephfs文件系统
      • 6.1.在默认的Cephfs文件系统中为Volumes创建子目录
      • 6.2.将K8S连接Cephfs的认证用户信息存储在Secret中
      • 6.3.Volumes存储卷对接Cephfs文件系统
      • 6.4.进入Pod中产生数据验证数据持久化效果

1.在K8S环境下RBD与Cephfs的使用对比

在K8S环境中,大多数情况下都是多个Pod资源同时挂载一个存储端,共享存储中的数据,在这个普遍应用场景下,Ceph集群的RBD块存储和Cephfs文件系统有着非常明显的区别。

  • RBD存储
    • 仅支持同一个Node节点中的多个Pod共享存储中的数据,不支持跨Node节点的Pod挂载同一个RBD存储。
    • Ceph RBD块存储的读写延迟低,性能强。
    • QKubernetes集群对RBD块存储有专门的驱动程序。
  • Cephfs文件系统
    • 支持多个Node节点中多个Pod同时挂载,实现共享存储。
    • 读写延迟性能略逊于RBD块存储。
    • 需要安装第三方的驱动程序。

无论是RBD还是Cephfs与K8S集群集成都没有想象中那么好,RBD不支持跨Node节点的Pod一起使用,而Cephfs则不支持指定使用某个Cephfs文件系统,但是在我不懈努力之下,终于研究出了指定某个Cephfs文件系统的方法。

Cephfs更加友好,起码支持跨节点的Pod都可以同时使用,并且可以指定使用哪一个Cephfs文件系统,我们可以为K8S集群单独创建一个Cephfs文件系统。

Cephfs文件系统常用的几种方式:

  • 为不同的客户端创建不同Cephfs文件系统,挂载时指定使用不同的Cephfs。

  • 集群中只创建一个Cephfs,为不同的客户端在Cephfs文件系统中创建不同的子目录,挂载时指定不同的子目录路径。

在实际生产者中第二种方式最为常见,但是如果一个Ceph集群中要为不同类型的客户端提供存储服务,那么建议创建出多个Cephfs文件系统,客户端通过参数分别指定使用哪一个Cephfs。

2.Cephfs环境介绍

K8S集群连接Cephfs文件系统时,默认情况下是连接的Ceph集群中默认的Cephfs文件系统,也就是数据资源池为cephfs_data和元数据资源池cephfs_metadata的Cephfs文件系统,并且K8S官方的对接Cephfs的文档中,如果Ceph集群中有多个Cephfs文件系统时,中并没有说明使用什么参数可以指定使用某一个的Cephfs文件文件系统。

好在功夫不负有心人,再查阅了大量的资料后,终于找到了可以让K8S各种存储卷指定使用某一个Cephfs文件系统的方法。

我们K8S对接Ceph集群的Cephfs文件系统的环境如下:

当前集群中存在多个Cephfs文件系统,我们会为K8S集群创建单独的Cephfs文件系统,K8S集群Volume、PV、StorageClass访问Cephfs时,会通过具体的参数指定要使用Ceph集群的哪一个Cephfs文件系统,来实现数据的存储。

3.在Ceph集群中为K8S创建单独Cephfs文件系统和认证用户

3.1.创建一个K8S使用的Cephfs文件系统

1)首先创建Cephfs依赖的数据池和元数据池

[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_data 16 16
pool 'kubernetes_cephfs_data' created
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_metadata 16 16
pool 'kubernetes_cephfs_metadata' created

2)创建一个Cephfs文件系统

[root@ceph-node-1 ~]# ceph fs new kubernetes_cephfs kubernetes_cephfs_metadata kubernetes_cephfs_data
new fs with metadata pool 14 and data pool 13

3)查看集群中所有的Cephfs文件系统

发型当前集群有两个Cephfs文件系统,后面会通过具体的参数,指定存储卷使用某一个Cephfs文件系统。

[root@ceph-node-1 ~]# ceph fs ls
name: kubernetes_cephfs, metadata pool: kubernetes_cephfs_metadata, data pools: [kubernetes_cephfs_data ]
name: cephfs-storage, metadata pool: cephfs2_data, data pools: [cephfs2_metadata ]

4)查看Cephfs文件系统的状态

[root@ceph-node-1 ~]# ceph fs status kubernetes_cephfs
kubernetes_cephfs - 0 clients
=================
+------+--------+-------------+---------------+-------+-------+
| Rank | State  |     MDS     |    Activity   |  dns  |  inos |
+------+--------+-------------+---------------+-------+-------+
|  0   | active | ceph-node-2 | Reqs:    0 /s |    0  |    0  |
+------+--------+-------------+---------------+-------+-------+
+----------------------------+----------+-------+-------+
|            Pool            |   type   |  used | avail |
+----------------------------+----------+-------+-------+
| kubernetes_cephfs_metadata | metadata | 1728k | 17.9G |
|   kubernetes_cephfs_data   |   data   |    0  | 17.9G |
+----------------------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph-node-1 |
+-------------+
+-----------------------------------------------------------------------------------+-------------+
|                                      version                                      |   daemons   |
+-----------------------------------------------------------------------------------+-------------+
|                                        None                                       | ceph-node-2 |
| ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable) | ceph-node-1 |
+-----------------------------------------------------------------------------------+-------------+

3.2.将创建的Cephfs文件系统挂载到本地路径

挂载到本地路径的原因是为了给K8S集群不同类型的存储卷,提供一个子目录,不同的存储卷挂载不同的子目录来存储持久化文件。

使用mount命令中的mds_namespace参数指定要将哪个Cephfs文件系统挂载到本地路径。

[root@ceph-node-1 ~]# mount -t ceph  192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/nginx_conf /nginx_conf/ -o name=admin,mds_namespace=kubernetes_cephfs[root@ceph-node-1 kubernetes_cephfs]# df -hT /kubernetes_cephfs/
文件系统                                                   类型  容量  已用  可用 已用% 挂载点
192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ ceph   18G     0   18G    0% /kubernetes_cephfs

3.3.创建K8S连接Ceph集群使用的认证用户

[root@ceph-node-1 ~]# ceph auth get-or-create client.kubernetes_cephfs mon "allow r" mds "allow rw" osd "allow rw pool=kubernetes_cephfs_data, allow rw pool=kubernetes_cephfs_metadata"
[client.kubernetes_cephfs]key = AQAVMFpi1gm6GBAARrJdTXsxYQwGiA1D7h2jHw==

4.K8S PV存储卷使用Cephfs文件系统

4.1.在Cephfs文件系统中为PV挂载创建子目录

在Cephfs文件系统中为PV类型的存储卷创建独立的子目录,来持久化容器的数据。

现在属于实验环境,如果是线上环境时,还要在子子目录下为不同应用程序挂载分别创建三级目录。

[root@ceph-node-1 ~]# mkdir /kubernetes_cephfs/pv_storage

4.2.将K8S连接Cephfs的认证用户信息存储在Secret中

我们在前面创建了一个专门用于K8S访问Cephfs文件系统的认证用户,将该用户的Key通过Base64进行加密,然后保存在Secret资源中,最后在创建存储卷的资源编排文件中,引用这个Secret资源。

1)将认证用户的Key进行Base64加密

[root@ceph-node-1 ~]# ceph auth get-key client.kubernetes_cephfs | base64
QVFBVk1GcGkxZ202R0JBQVJySmRUWHN4WVF3R2lBMUQ3aDJqSHc9PQ==

2)将加密后的用户认证Key存储在Secret资源中

[root@k8s-master volumes]# vim cephfs-volumes-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: cephfs-secret
data:key: QVFBVk1GcGkxZ202R0JBQVJySmRUWHN4WVF3R2lBMUQ3aDJqSHc9PQo=

3)创建Secret并查看资源的状态

[root@k8s-master volumes]# kubectl apply -f cephfs-volumes-secret.yaml
secret/cephfs-secret created[root@k8s-master volumes]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
cephfs-secret         Opaque                                1      3m30s

4.3.创建PV存储卷对接Cephfs文件系统

创建一个PV资源采用Cephfs文件系统作为底层存储端。

1)编写资源编排文件

PV指定使用某个Cephfs文件系统主要是通过mountOptions参数来实现的,这个参数是为挂载存储卷时设置一些挂载参数,在宿主机使用mount挂载Cephfs时有参数可以指定挂载哪一个Cephfs,同理在PV中也提供了这种参数,通过这个参数,我们就可以指定使用哪一个Cephfs文件系统了。

[root@k8s-master pv]# cat cephfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: cephfs-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteManymountOptions: 								#指定使用哪一个Cephfs文件系统- mds_namespace=kubernetes_cephfs					#Cephfs文件系统的名称cephfs:										#存储源使用Cephfs类型monitors:									#Monitor组件的地址- 192.168.20.20:6789- 192.168.20.21:6789- 192.168.20.22:6789path: /pv_storage								#挂载Cephfs文件系统中的哪一个子目录user: kubernetes_cephfs							#使用Cephfs文件系统的认证用户readOnly: falsesecretRef:									   #认证用户的Secretname: cephfs-secretpersistentVolumeReclaimPolicy: Recycle

2)创建PV资源并查看资源的状态

[root@k8s-master pv]# kubectl apply -f cephfs-pv.yaml 
persistentvolume/cephfs-pv created[root@k8s-master pv]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                    STORAGECLASS   REASON   AGE
cephfs-pv       10Gi       RWX            Recycle          Available                                                    5m12s

4.4.创建PVC资源从PV中获取存储空间

PV已经创建完成了,下面来创建PVC资源,关联PV,从PV中分配存储空间给Pod资源使用。

1)编写资源编排文件

[root@k8s-master pv]# cat cephfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: cephfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Gi

2)创建PVC并查看资源的状态

[root@k8s-master pv]# kubectl apply -f cephfs-pvc.yaml
persistentvolumeclaim/cephfs-pvc created[root@k8s-master pv]# kubectl get pvc
NAME             STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc       Bound    cephfs-pv       10Gi       RWX                           3s

PVC已经与PV资源进行了绑定,下面就可以给Pod资源使用了。

4.5.创建Pod资源将数据持久化到Cephfs中

使用Cephfs文件系统作为存储源的PV和PVC资源都已经准备就绪了,下面来创建一个Pod资源,挂载PVC,将数据持久化到Cephfs文件系统中。

1)编写资源编排文件

[root@k8s-master pv]# cat cephfs-pv-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: cephfs-pod
spec:containers:- image: nginx:1.15name: cephfs-podports:- name: webcontainerPort: 80protocol: TCPvolumeMounts:- name: datamountPath: /data						#将PVC挂载到/data目录volumes:	- name: datapersistentVolumeClaim:claimName: cephfs-pvc					#关联PVC的名称

2)创建Pod并查看资源的状态

[root@k8s-master pv]# kubectl apply -f cephfs-pv-pod.yaml
pod/cephfs-pod created[root@k8s-master pv]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
cephfs-pod   1/1     Running   0          11s

4.6.验证Pod资源持久化数据导Cephfs

Pod资源已经创建完成,下面进入到Pod中创建一些文件,看看是否能持久化到Cephfs文件系统中。

1)在Pod资源中写入数据文件

[root@k8s-master pv]# kubectl exec -it cephfs-pod bash 
root@cephfs-pod:/# cd /data/
root@cephfs-pod:/data# touch file{1..10}.txt

2)查看Cephfs文件系统中是否有Pod持久化的数据文件

到查看这一步,就要尽显当初将Cephfs文件系统的根目录挂载到本地路径的好处了,我们可以直接进入到挂载的目录中,查看来自客户端写入的数据。

[root@ceph-node-1 ~]# cd /kubernetes_cephfs/
[root@ceph-node-1 kubernetes_cephfs]# tree pv_storage/
pv_storage/
├── aa
├── file10.txt
├── file1.txt
├── file2.txt
├── file3.txt
├── file4.txt
├── file5.txt
├── file6.txt
├── file7.txt
├── file8.txt
└── file9.txt0 directories, 11 files

Pod数据持久化成功。

5.K8S StorageClass存储类使用Cephfs文件系统

5.1.Cephfs-Provisioner客户端简介

StoragecClass存储类动态分配PV,需要依赖第三方的客户端插件,通过客户端插件连接到Cephfs文件系统,从而自动分配PV资源。

由于K8S没有内置Cephfs的Provisioner,故需要安装第三方的Provisioner客户端

Cephfs-Provisioner主要组件:

  • cephfs-provisioner.go:是cephfs-provisioner(cephfs的storageclass)的核心,主要是watch kubernetes中PVC资源的CURD事件,然后以命令行方式调用cephfs_provisor.py脚本创建PV。
  • cephfs_provisioner.py:python 脚本实现的与cephfs交互的命令行工具。cephfs-provisioner对cephfs端volume的创建都是通过该脚本实现。里面封装了volume的增删改查等功能。

5.2.在K8S集群中部署Cephfs-Provisioner客户端

Cephfs-Provisioner客户端在GitHub的地址:https://github.com/kubernetes-retired/external-storage/tree/master/ceph/cephfs/deploy/rbac

完整的Cephfs-Provisioner客户端资源编排文件内容:

[root@k8s-master cephfs-provisioner]# cat cephfs-provisioner.yaml 
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: cephfs-provisionernamespace: kube-system
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]- apiGroups: [""]resources: ["services"]resourceNames: ["kube-dns","coredns"]verbs: ["list", "get"]---kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: cephfs-provisioner
subjects:- kind: ServiceAccountname: cephfs-provisionernamespace: kube-system
roleRef:kind: ClusterRolename: cephfs-provisionerapiGroup: rbac.authorization.k8s.io---apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: cephfs-provisionernamespace: kube-system
rules:- apiGroups: [""]resources: ["secrets"]verbs: ["create", "get", "delete"]- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: cephfs-provisionernamespace: kube-system
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: cephfs-provisioner
subjects:
- kind: ServiceAccountname: cephfs-provisioner---apiVersion: v1
kind: ServiceAccount
metadata:name: cephfs-provisionernamespace: kube-system---apiVersion: apps/v1
kind: Deployment
metadata:name: cephfs-provisionernamespace: kube-system
spec:replicas: 1selector:matchLabels:app: cephfs-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: cephfs-provisionerspec:containers:- name: cephfs-provisionerimage: "quay.io/external_storage/cephfs-provisioner:latest"env:- name: PROVISIONER_NAMEvalue: ceph.com/cephfs- name: PROVISIONER_SECRET_NAMESPACEvalue: cephfscommand:- "/usr/local/bin/cephfs-provisioner"args:- "-id=cephfs-provisioner-1"serviceAccount: cephfs-provisioner

在集群中部署Cephfs-Provisioner客户端。

[root@k8s-master cephfs-provisioner]# kubectl apply -f cephfs-provisioner.yaml
clusterrole.rbac.authorization.k8s.io/cephfs-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-provisioner created
role.rbac.authorization.k8s.io/cephfs-provisioner created
rolebinding.rbac.authorization.k8s.io/cephfs-provisioner created
serviceaccount/cephfs-provisioner created
deployment.apps/cephfs-provisioner created

当看到Cephfs-Provisioner客户端的Pod资源处于Running状态就表示部署成功了。

[root@k8s-master cephfs-provisioner]# kubectl get pod -n kube-system | grep cephfs
cephfs-provisioner-67dd56fb57-l7xxm         1/1     Running   0          21m

5.3.失败了。。。。。。。

6.K8S Volumes存储卷使用Cephfs文件系统

Volumes类型的存储卷无法像PV、PVC等通过mountOptions参数指定要使用的Cephfs文件系统,因此Volumes存储卷只能使用默认的Cephfs文件系统,基于这种场景,我们可以在默认的Cephfs文件系统中创建出多个子目录供不同的客户端去使用,这也是Cephfs文件系统最常用的方法。

6.1.在默认的Cephfs文件系统中为Volumes创建子目录

所谓默认的Cephfs文件系统指的是数据资源池为cephfs_data、元数据资源池为cephfs_metadata的Cephfs文件系统。

在Cephfs文件系统中为Volumes类型的存储卷创建独立的子目录,来持久化容器的数据。

1)默认的Cephfs文件系统的创建方法

1.创建元数据资源池
[root@ceph-node-1 ~]# ceph osd pool create cephfs_metadata 16 16
pool 'cephfs_metadata' created2.创建数据资源池
[root@ceph-node-1 ~]# ceph osd pool create cephfs_data 16 16
pool 'cephfs_data' created3.创建Cephfs文件系统
[root@ceph-node-1 ~]# ceph fs new cephfs-storage cephfs_metadata cephfs_data
new fs with metadata pool 8 and data pool 9

2)挂载Cephfs文件系统

[root@ceph-node-1 ceph-deploy]# mount -t ceph  192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /kubernetes_cephfs/ -o name=admin

3)为Volumes存储创建子目录

[root@ceph-node-1 ~]# mkdir /kubernetes_cephfs/volumes_storage

6.2.将K8S连接Cephfs的认证用户信息存储在Secret中

可以直接使用admin用户连接Ceph集群,也可以专门创建一个。

1)将认证用户的Key进行Base64加密

[root@ceph-node-1 ~]# ceph auth get-key client.admin | base64
QVFCSVdVaGlFbWFGT0JBQTZKcjZpdFVlSGlMVlZPZVlGVnBSb2c9PQ==

2)将加密后的用户认证Key存储在Secret资源中

[root@k8s-master volumes]# vim cephfs-volumes-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: cephfs-volumes-secret
data:key: QVFCSVdVaGlFbWFGT0JBQTZKcjZpdFVlSGlMVlZPZVlGVnBSb2c9PQ==

3)创建Secret并查看资源的状态

[root@k8s-master volumes]# kubectl apply -f cephfs-volumes-secret.yaml
secret/cephfs-secret created[root@k8s-master volumes]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
cephfs-secret         Opaque                                1      3m30s

6.3.Volumes存储卷对接Cephfs文件系统

创建一个Pod资源使用Volumes存储卷,将Pod资源的数据持久化到Cephfs文件系统中的子目录里。

1)编写Pod资源的资源编排文件

[root@k8s-master volumes]# vim cephfs-volumes-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: cephfs-pod-volumes
spec:containers:- name: cephfs-pod-volumesimage: nginx:1.15volumeMounts:- mountPath: "/data"name: cephfs-volumevolumes:- name: cephfs-volumecephfs:									#使用cephfs类型monitors:								 #monitor集群的地址- 192.168.20.21:6789- 192.168.20.22:6789- 192.168.20.23:6789path: /volumes_storage					#挂载文件系统中的哪一个子目录user: admin								#连接Ceph集群的用户secretRef: 								#用户的Secret资源名称name: cephfs-volumes-secret

2)创建Pod资源并查看资源的状态

[root@k8s-master volumes]# kubectl apply -f cephfs-volumes-pod.yaml
pod/cephfs-pod-volumes created[root@k8s-master volumes]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
cephfs-pod-volumes   1/1     Running   0          4m18s

6.4.进入Pod中产生数据验证数据持久化效果

1)产生数据

[root@k8s-master volumes]# kubectl exec -it cephfs-pod-volumes bash
root@cephfs-pod-volumes:/# cd /data/
root@cephfs-pod-volumes:/data# touch web{1..5}.index
root@cephfs-pod-volumes:/data# ls
web1.index  web2.index	web3.index  web4.index	web5.index

2)查看Cephfs文件系统中的数据持久化结构

之前已经将文件系统挂载到本地路径了,可以直接看到一级一级目录的数据内容。

[root@ceph-node-1 ~]# tree /kubernetes_cephfs/
/kubernetes_cephfs/
└── volumes_storage├── web1.index├── web2.index├── web3.index├── web4.index└── web5.index1 directory, 5 files

相关文章:

第32讲:K8S集群与Cephfs文件系统集成

文章目录 1.在K8S环境下RBD与Cephfs的使用对比2.Cephfs环境介绍3.在Ceph集群中为K8S创建单独Cephfs文件系统和认证用户3.1.创建一个K8S使用的Cephfs文件系统3.2.将创建的Cephfs文件系统挂载到本地路径3.3.创建K8S连接Ceph集群使用的认证用户 4.K8S PV存储卷使用Cephfs文件系统4…...

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境: 某单位一台某品牌DS5300存储,1个机头4个扩展柜,50块硬盘组建2组RAID5磁盘阵列(一组raid5阵列有27块成员盘,存放Oracle数据库文件;另外一组raid5阵列有23块成员盘)。存储…...

使用Ubuntu 22.04安装Frappe-Bench【二】

系列文章目录 第一章 使用VMware创建Ubuntu 22.04【一】 文章目录 系列文章目录前言什么是Frappe-Bench?使用安装ERPNext能实现什么效果? 官网给了一个说明 一、使用Ubuntu 22.04安装Frappe-Bench一、安装要求二、安装命令三、 可能出现问题 总结 前言 …...

MySQL增删改查

1.创建数据库: 使用CREATE DATABASE语句 CREATE DATABASE school;show databases; 列出MySQL数据库管理系统的数据库列表 2.切换数据库: 使用USE语句选择要操作的数据库 USE school;select database (); 当前所在库mysql> select…...

Java跳出循环的四种方式

1、continue,break,return continue:跳出当前层循环的当前语句,执行当前层循环的下一条语句。   continue标签 break:跳出当前层循环。 break标签:多层循环时,跳到具体某层循环。 return:结束所有循环…...

直播预告|飞思实验室暑期公益培训7月10日正式开启,报名从速!

01 培训背景 很荣幸地向大家宣布:卓翼飞思实验室将于7月10日正式开启为期两个月的暑期公益培训!本次培训为线上直播,由中南大学计算机学院特聘副教授,RflySim平台总研发负责人戴训华副教授主讲。 培训将基于“RflySim—智能无人…...

3-2 梯度与反向传播

3-2 梯度与反向传播 主目录点这里 梯度的含义 可以看到红色区域的变化率较大,梯度较大;绿色区域的变化率较小,梯度较小。 在二维情况下,梯度向量的方向指向函数增长最快的方向,而其大小表示增长的速率。 梯度的计算 …...

【qt】如何获取本机的IP地址?

需要用到这个类QHostInfo和pro里面添加network模块 用这个类的静态函数forName()来获取该主机名的信息 返回的就是这个类 这个QHostInfo类就包括主机的IP地址信息 用静态函数addresses()来获取 返回的是一个QHostAddress的容器 QList<QHostAddress>addrList hostIn…...

芯片的PPA-笔记

写在前面&#xff1a;这个仅记录自己对芯片PPA的一些思考&#xff0c;不一定正确&#xff0c;还请各位网友思辨的看待&#xff0c;欢迎大家谈谈自己的想法。 1 此次笔记的起因 记录的原因&#xff1a;自己在整理这段时间的功耗总结&#xff0c;又看到工艺对功耗的影响&#x…...

2024阿里巴巴全球数学竞赛决赛中的数列题解析(分析与方程方向第4题)

早点关注我&#xff0c;精彩不错过&#xff01; 上周给大家聊了一道有LLM背景的阿里数赛题&#xff0c;详情请戳&#xff1a; 2023阿里巴巴全球数学竞赛决赛中的LLM背景题解析&#xff08;应用与计算数学部分第2题&#xff09; 看起来大家还比较喜欢看这种具体问题求解和思路分…...

学java的第3天 后端商城小程序工作

1.数据库的大坑 特殊字段名 ’我的图片表中有一个字段是描述我写成desc了&#xff0c;正好是mysql中的关键字 就不能使用了 2.后端编写 2.1可以把请求分开 在商品浏览页中 只显示商品的大致信息 当用户再点击其他按钮时在发出请求 2.2把请求合并 把数据整合到一起 利用ass…...

DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解决方案架构图:CI/CD解决方案架构图描述:程序员写好代码之…...

Apache Seata配置管理原理解析

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata配置管理原理解析 说到Seata中的配置管理&#xff0c;大家可能会想到Seata中适配…...

深入理解C# log4Net日志框架:功能、使用方法与性能优势

文章目录 1、log4Net的主要特性2、log4Net框架详解配置日志级别 3、log4Net的使用示例4、性能优化与对比5、总结与展望 在软件开发过程中&#xff0c;日志记录是一个不可或缺的功能。它可以帮助开发者追踪错误、监控应用程序性能&#xff0c;以及进行调试。在C#生态系统中&…...

BDD 100K dataset 的标签数据结构(json文件)

最近在筛选自己需要的labels&#xff0c;所以要弄清楚这个数据集的数据结构才行&#xff1a; 1.整个json文件以列表形式储存 2.每张图片以一个字典形式储存 3.存储图片的字典内的以‘name’为key的键值对对应的‘value’是我需要的图片名称信息 4.存储图片的字典内的以‘label…...

AcWing 1550:完全二叉搜索树

【题目来源】https://www.acwing.com/problem/content/1552/【题目描述】二叉搜索树 (BST) 递归定义为具有以下属性的二叉树&#xff1a; &#xff08;1&#xff09;若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值 &#xff08;2&#xff09;若它的右…...

使用kali Linux启动盘轻松破解Windows电脑密码

破解分析文章仅限用于学习和研究目的&#xff1b;不得将上述内容用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。谢谢&#xff01;&#xff01; 效果展示&#xff1a; 使用kali Linux可以轻松破解Windows用户及密码 准备阶段&#xff1a; &#xff08…...

Vue2中跨组件共享公共属性的方法、优缺点与实现

一、vuex&#xff08;最常用&#xff09; 优缺点 优点&#xff1a;集中管理状态&#xff0c;组件间解耦&#xff0c;易于调试和测试。缺点&#xff1a;学习成本较高&#xff0c;对于小项目可能过于复杂。 适用场景 大型、复杂的单页面应用&#xff08;SPA&#xff09;。需要全局…...

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024亚太杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…...

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn&#xff0c;此外便是ret2syscall的利用。然而过程有不小的曲折&#xff0c;参考 返璞归真 师傅的wp&#xff0c;堪堪完成了复现。复现过程中&#xff0c;师傅也灰常热情回答我菜菜的疑问&#xff0c;感谢&#xff01;2024全国大学生信息安全竞赛&#xff08;ciscn&am…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...