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

2024阿里巴巴全球数学竞赛决赛中的数列题解析(分析与方程方向第4题)
早点关注我,精彩不错过! 上周给大家聊了一道有LLM背景的阿里数赛题,详情请戳: 2023阿里巴巴全球数学竞赛决赛中的LLM背景题解析(应用与计算数学部分第2题) 看起来大家还比较喜欢看这种具体问题求解和思路分…...

学java的第3天 后端商城小程序工作
1.数据库的大坑 特殊字段名 ’我的图片表中有一个字段是描述我写成desc了,正好是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官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata配置管理原理解析 说到Seata中的配置管理,大家可能会想到Seata中适配…...

深入理解C# log4Net日志框架:功能、使用方法与性能优势
文章目录 1、log4Net的主要特性2、log4Net框架详解配置日志级别 3、log4Net的使用示例4、性能优化与对比5、总结与展望 在软件开发过程中,日志记录是一个不可或缺的功能。它可以帮助开发者追踪错误、监控应用程序性能,以及进行调试。在C#生态系统中&…...
BDD 100K dataset 的标签数据结构(json文件)
最近在筛选自己需要的labels,所以要弄清楚这个数据集的数据结构才行: 1.整个json文件以列表形式储存 2.每张图片以一个字典形式储存 3.存储图片的字典内的以‘name’为key的键值对对应的‘value’是我需要的图片名称信息 4.存储图片的字典内的以‘label…...

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

使用kali Linux启动盘轻松破解Windows电脑密码
破解分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。谢谢!! 效果展示: 使用kali Linux可以轻松破解Windows用户及密码 准备阶段: (…...
Vue2中跨组件共享公共属性的方法、优缺点与实现
一、vuex(最常用) 优缺点 优点:集中管理状态,组件间解耦,易于调试和测试。缺点:学习成本较高,对于小项目可能过于复杂。 适用场景 大型、复杂的单页面应用(SPA)。需要全局…...

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

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note
一道GoPwn,此外便是ret2syscall的利用。然而过程有不小的曲折,参考 返璞归真 师傅的wp,堪堪完成了复现。复现过程中,师傅也灰常热情回答我菜菜的疑问,感谢!2024全国大学生信息安全竞赛(ciscn&am…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...