K8S对接ceph的RBD块存储
1 PG数量限制问题
1.1 原因分析
1.还是老样子,先创建存储池,在初始化为rbd。
[root@ceph141~]# ceph osd pool create wenzhiyong-k8s 128 128
Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD
(2067 total PG replicas on 7 'in' root OSDs by crush rule) which exceeds the mon_max_pg_per_osd value
of 250
意思说:创建1个存储池wenzhiyong-k8s且指定PG数量是128,副本3个;将会产生128*3=384个PG
但是集群中每个OSD最多只能有250个PG。我是7个OSD,所以集群最大OSD数量是250*7=1750个
目前集群有多个PG了呢?可以通过ceph osd pool ls detail
命令查看并累加得出:1 + 16 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 256 + 32 = 561;但是因为3副本机制,所以当前集群的PG数量还要再乘3为1683个,再加上即将创建的384个PG很明显是超过集群的最大PG1750的
1.2 故障解决方式
- 上策,增加OSD数量。说白了,就是加设备,加机器。
- 中策,调大OSD存储PG的上限,可以临时解决,治标不治本,因为随着PG数量增多,会给该磁盘添加I/O压力。
- 下策,创建存储池时指定略少的PG数量。如:
ceph osd pool create wenzhiyong-k8s 2 2
- 下下策,删除没有用的存储池,已释放PG数量。也可以临时解决,但是要确定的确是没有用的数据,再做操作。
1.临时修改,修改完后可能需要重启集群才能生效。但实测后发现没用
[root@ceph141~]# ceph tell osd.* injectargs --mon-max-pg-per-osd 500
osd.0: {}
osd.0: mon_max_pg_per_osd = '' (not observed, change may require restart) osd_delete_sleep = '' osd_delete_sleep_hdd = '' osd_delete_sleep_hybrid = '' osd_delete_sleep_ssd = '' osd_max_backfills = '' osd_pg_delete_cost = '' (not observed, change may require restart) osd_recovery_max_active = '' osd_recovery_max_active_hdd = '' osd_recovery_max_active_ssd = '' osd_recovery_sleep = '' osd_recovery_sleep_hdd = '' osd_recovery_sleep_hybrid = '' osd_recovery_sleep_ssd = '' osd_scrub_sleep = '' osd_snap_trim_sleep = '' osd_snap_trim_sleep_hdd = '' osd_snap_trim_sleep_hybrid = '' osd_snap_trim_sleep_ssd = ''
osd.1: {}
...
[root@ceph141~]# ceph osd pool create wenzhiyong-k8s 128 128
Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 total PG replicas on 7 'in' root OSDs by crush rule) which exceeds the mon_max_pg_per_osd value of 250[root@ceph141~]# systemctl reboot docker
2.永久修改方式,/etc/ceph/ceph.conf
[osd]
mon_max_pg_per_osd = 100
最终选择了指定少量的存储池
1.创建K8S特用的存储池
[root@ceph141~]# ceph osd pool create wenzhiyong-k8s 2 2
pool 'wenzhiyong-k8s' created2.创建镜像块设备文件
[root@ceph141 ~]# rbd create -s 5G wenzhiyong-k8s/nginx-web
[root@ceph141 ~]#
[root@ceph141 ~]# rbd -p wenzhiyong-k8s ls
nginx-web
[root@ceph141 ~]#
[root@ceph141 ~]# rbd -p wenzhiyong-k8s info nginx-web
rbd image 'nginx-web':size 5 GiB in 1280 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 12214b350eaa5block_name_prefix: rbd_data.12214b350eaa5format: 2features: layering, exclusive-lock, object-map, fast-diff, deep-flattenop_features: flags: create_timestamp: Fri Aug 23 16:34:00 2024access_timestamp: Fri Aug 23 16:34:00 2024modify_timestamp: Fri Aug 23 16:34:00 20243.ceph集群将ceph管理员的秘钥环keyring拷贝到所有的worker节点
[root@ceph141 ~]# scp /etc/ceph/ceph.client.admin.keyring 10.0.0.231:/etc/ceph/
[root@ceph141 ~]# scp /etc/ceph/ceph.client.admin.keyring 10.0.0.232:/etc/ceph/
[root@ceph141 ~]# scp /etc/ceph/ceph.client.admin.keyring 10.0.0.233:/etc/ceph/
2RBD作为volumes
2.1 基于keyring的方式
cat > 03-rdb-admin-keyring.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: deploy-volume-rbd-admin-keyring
spec:replicas: 1selector:matchLabels:apps: ceph-rbdtemplate:metadata:labels:apps: ceph-rbdspec:volumes:- name: datarbd:monitors:- 10.0.0.141:6789- 10.0.0.142:6789- 10.0.0.143:6789# 指定存储池pool: wenzhiyong-k8s# 指定块设备镜像image: nginx-web# 指定文件系统,目前仅支持: "ext4", "xfs", "ntfs"。fsType: xfs# 块设备是否只读,默认值为false。readOnly: false# 指定连接ceph集群的用户,若不指定,默认为adminuser: admin# 指定ceph秘钥环的路径,默认值为: "/etc/ceph/keyring"keyring: "/etc/ceph/ceph.client.admin.keyring"containers:- name: c1image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1volumeMounts:- name: datamountPath: /wenzhiyong-dataports:- containerPort: 80
---apiVersion: v1
kind: Service
metadata:name: svc-rbd
spec:type: NodePortselector:apps: ceph-rbdports:- protocol: TCPport: 80targetPort: 80nodePort: 30033
EOF
1.运用K8S配置文件进入容器测试
/wenzhiyong-data # cd /
/ # rm -rf /wenzhiyong-data/
rm: can't remove '/wenzhiyong-data': Resource busy/ # df -h | grep wen
/dev/rbd0 5.0G 68.1M 4.9G 1% /wenzhiyong-data
/ # ls -l /dev/rbd0
ls: /dev/rbd0: No such file or directory/ # umount /wenzhiyong-data/
umount: can't unmount /wenzhiyong-data: Operation not permitted/ # rm -rf /wenzhiyong-data/
rm: can't remove '/wenzhiyong-data': Resource busy
2.查看该pod调度到了worker232节点
[root@master23104-cephfs]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
deploy-volume-rbd-admin-keyring-6b94f8cc86-nnpjd 1/1 Running 0 6m37s 10.100.2.45 worker232
3.在worker232节点查看,这个rbd挂载给了pod使用
[root@worker232~]# ll /dev/rbd*
brw-rw---- 1 root disk 252, 0 Nov 8 22:38 /dev/rbd0/dev/rbd:
total 0
drwxr-xr-x 2 root root 60 Nov 8 22:38 wenzhiyong-k8s/[root@worker232~]# df -h | grep rbd
/dev/rbd0 5.0G 69M 5.0G 2% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/wenzhiyong-k8s-image-nginx-web
4.删除该应用后,worker232的挂载也随之消失
[root@worker232~]# df -h | grep rbd
[root@worker232~]#
2.2 基于秘钥的方式
1.获取ceph集群的admin账号的key信息并经过base64编码
[root@worker232~]# awk '/key/ {printf "%s", $NF}' /etc/ceph/ceph.client.admin.keyring | more
AQAlsChnHubLJRAAH2s3vhyGrxgba8anloPDtg==
[root@worker232~]# awk '/key/ {printf "%s", $NF}' /etc/ceph/ceph.client.admin.keyring | base64
QVFBbHNDaG5IdWJMSlJBQUgyczN2aHlHcnhnYmE4YW5sb1BEdGc9PQ==
2.编写资源清单并把key封装为secret资源
cat > 04-rbd-admin-key.yaml << EOF
apiVersion: v1
kind: Secret
metadata:name: ceph-admin-secret
type: "kubernetes.io/rbd"
data:# 指定ceph的admin的KEY,将其进行base64编码,此处需要修改! key: QVFBbHNDaG5IdWJMSlJBQUgyczN2aHlHcnhnYmE4YW5sb1BEdGc9PQ==
# 注意,data如果觉得麻烦,可以考虑使用stringData
#stringData:
# key: AQBeYMVm8+/UNhAAV8lxv/CvIm0Lyer1wSp9yA==
---apiVersion: apps/v1
kind: Deployment
metadata:name: deploy-volume-rbd-secrets-keyring
spec:replicas: 1selector:matchLabels:apps: ceph-rbdtemplate:metadata:labels:apps: ceph-rbdspec:volumes:- name: datarbd:monitors:- 10.0.0.141:6789- 10.0.0.142:6789- 10.0.0.143:6789pool: wenzhiyong-k8simage: nginx-webfsType: xfsreadOnly: falseuser: adminsecretRef:# 指定用于存储ceph管理员的secret名称name: ceph-admin-secretcontainers:- name: c1image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v3volumeMounts:- name: datamountPath: /wenzhiyong-dataports:- containerPort: 80
EOF
现象和基于keyring的一样
3RBD结合动态存储类
01 SC
cat > 01-rbd-sc.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:# 指定集群的ID地址,需要改成自己的集群环境,通过ceph -s可以看到clusterID: 12fad866-9aa0-11ef-8656-6516a17ad6dd# 指定存储池pool: wenzhiyong-k8s# 镜像的特性imageFeatures: layeringcsi.storage.k8s.io/provisioner-secret-name: csi-rbd-secretcsi.storage.k8s.io/provisioner-secret-namespace: defaultcsi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secretcsi.storage.k8s.io/controller-expand-secret-namespace: defaultcsi.storage.k8s.io/node-stage-secret-name: csi-rbd-secretcsi.storage.k8s.io/node-stage-secret-namespace: default# 指定文件系统的类型csi.storage.k8s.io/fstype: xfs
# 定义回收策略
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:- discard
EOF
02 rbd secret
cat > csi-rbd-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:name: csi-rbd-secretnamespace: default
# 对于stringData和Data字段有所不同,无需进行base64编码,说白了就是原样输出。
stringData:# 指定用户名是admin,也可以自定义普通用户。userID: admin# 指定admin用户的key(注意要直接用ceph配置文件里面的秘钥)userKey: AQAlsChnHubLJRAAH2s3vhyGrxgba8anloPDtg==
EOF
03 rbd configmap
cat > ceph-config-map.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:name: ceph-config
data:# ceph集群的配置文件"/etc/ceph/ceph.conf",认证要求可以写成 cephx; fsid填写集群IDceph.conf: |[global]fsid = 12fad866-9aa0-11ef-8656-6516a17ad6ddmon_initial_members = ceph141, ceph142, ceph143mon_host = 10.0.0.141,10.0.0.142,10.0.0.143auth_cluster_required = cephxauth_service_required = cephxauth_client_required = cephx# 要求存在keyring这个key,值为空keyring: |
EOF
04 csi configmap
容器存储接口
cat > csi-config-map.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:name: ceph-csi-config
data:# clusterID可以通过"ceph -s"获取集群ID# monitors为你自己的ceph集群mon地址config.json: |-[{"clusterID": "12fad866-9aa0-11ef-8656-6516a17ad6dd","monitors": ["10.0.0.141:6789","10.0.0.142:6789","10.0.0.143:6789"]}]
EOF
05 csi-kms-config-map
cat > csi-kms-config-map.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:name: ceph-csi-encryption-kms-config
data:# 可以不创建这个cm资源,但是需要将csi-rbdplugin-provisioner.yaml和csi-rbdplugin.yaml中kms有关内容注释掉。# - deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml # - deploy/rbd/kubernetes/csi-rbdplugin.yamlconfig.json: |-{}
EOF
06 定义PVC
cat > pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: rbd-pvc01
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2GistorageClassName: csi-rbd-sc
---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: rbd-pvc02
spec:accessModes:- ReadWriteOnceresources:requests:storage: 4GistorageClassName: csi-rbd-sc
EOF
07 创建csi接口
需要这些文件,下载地址:https://github.com/ceph/ceph-csi/tree/release-v3.7/deploy/rbd/kubernetes
==注:==前面6步的文件需要先apply,否则这些pod无法创建
csi-config-map.yaml csidriver.yaml csi-nodeplugin-rbac.yaml
csi-provisioner-rbac.yaml csi-rbdplugin-provisioner.yaml csi-rbdplugin.yaml
[root@master231deploy]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
csi-rbdplugin-l24hj 3/3 Running 0 30m 10.0.0.233 worker233
csi-rbdplugin-provisioner-5dfcf67885-8rk48 7/7 Running 0 30m 10.100.1.30 worker233
csi-rbdplugin-provisioner-5dfcf67885-9wznm 7/7 Running 0 30m 10.100.2.48 worker232
csi-rbdplugin-qz7k6 3/3 Running 0 30m 10.0.0.232 worker232
08 查看rbd image和PVC的关联
1.在ceph集群可以看到有2个rbd image
[root@ceph141~]# rbd ls -p wenzhiyong-k8s
csi-vol-d33df512-9df7-11ef-85fc-4a89d731ca68
csi-vol-d33df570-9df7-11ef-85fc-4a89d731ca68
nginx-web
[root@ceph141~]# rbd info wenzhiyong-k8s/csi-vol-d33df512-9df7-11ef-85fc-4a89d731ca68
rbd image 'csi-vol-d33df512-9df7-11ef-85fc-4a89d731ca68':size 2 GiB in 512 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 392f1fe374022block_name_prefix: rbd_data.392f1fe374022format: 2features: layeringop_features: flags: create_timestamp: Sat Nov 9 01:35:19 2024access_timestamp: Sat Nov 9 01:35:19 2024modify_timestamp: Sat Nov 9 01:35:19 2024
[root@ceph141~]# rbd info wenzhiyong-k8s/csi-vol-d33df570-9df7-11ef-85fc-4a89d731ca68
rbd image 'csi-vol-d33df570-9df7-11ef-85fc-4a89d731ca68':size 4 GiB in 1024 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 392f182ce6323block_name_prefix: rbd_data.392f182ce6323format: 2features: layeringop_features: flags: create_timestamp: Sat Nov 9 01:35:19 2024access_timestamp: Sat Nov 9 01:35:19 2024modify_timestamp: Sat Nov 9 01:35:19 2024
24
[root@ceph141~]# rbd info wenzhiyong-k8s/csi-vol-d33df570-9df7-11ef-85fc-4a89d731ca68
rbd image 'csi-vol-d33df570-9df7-11ef-85fc-4a89d731ca68':size 4 GiB in 1024 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 392f182ce6323block_name_prefix: rbd_data.392f182ce6323format: 2features: layeringop_features: flags: create_timestamp: Sat Nov 9 01:35:19 2024access_timestamp: Sat Nov 9 01:35:19 2024modify_timestamp: Sat Nov 9 01:35:19 2024
相关文章:

K8S对接ceph的RBD块存储
1 PG数量限制问题 1.1 原因分析 1.还是老样子,先创建存储池,在初始化为rbd。 [rootceph141~]# ceph osd pool create wenzhiyong-k8s 128 128 Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 tot…...

ragflow连不上ollama的解决方案
由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…...

ACL与Prefix List(前缀列表)
匹配工具一般搭配其他操作,可实现NAT,路由策略,策略路由,MQC,流量过滤等操作 通配符掩码 我们都知道子网掩码的1是精确匹配,1是大致匹配,1必须连续 我们也知道反掩码的1是大致匹配࿰…...

OpenSSH和OpenSSL升级
需求 centos7.9升级SSH和SSL OpenSSH升级为openssh9.8 OpenSSL升级为openssl-3.4.0 下载openssh最新版本与openssl对应版本 openssh最新版本下载地址 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gzOpenSSL下载地址 这里下载的是3.4.0 wg…...
数据库继续学习
数据库中的外键约束的作用是什么? 外键约束用于在多表操作中保证数据的一致性、完整性和正确性。它确保引用的数据在主表中存在,从而避免孤立记录的出现。 物理外键与逻辑外键的选择? 推荐使用逻辑外键。逻辑外键是指在应用程序层面上实现外键…...
车载以太网-UDPNM
文章目录 UDPNM定义在车载以太网中的作用网络节点状态监测唤醒和睡眠管理网络拓扑发现工作流程消息发送消息接收与处理与其他车载网络协议的比较和协作UDPNM的工作原理是什么?1.消息构建与发送原理消息格式构建发送机制2.消息接收与响应原理接收过程响应机制3.状态管理与定时器…...

网页核心页面设计(第8章)
一、伪元素 伪元素是 CSS 中的一种选择器,用于选择某些特定的元素或元素的一部分,而这些元素本身并不存在于文档的结构中。伪元素使得网页设计师可以更灵活地控制样式,从而可以为元素的内容、框架或文本提供额外的样式,增强网页的…...

在PowerShell下运行curl命令出现错误:Invoke-WebRequest : 无法处理参数,因为参数名称“u”具有二义性
今天在Windows 11下测试Nanamq的HTTP API,按照其文档输入: curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/subscriptions" 结果出现二义性错误: 而且输入curl --help命令想看看参数说明的时候ÿ…...

医疗花费预测——协方差矩阵和热力图
引言 在医疗数据分析中,预测个人的医疗花费是一个重要的课题。这不仅有助于个人健康管理,也为医疗资源的合理分配提供了数据支持。本篇博客,我们将探讨如何利用协方差矩阵和热力图来分析和预测个人的医疗花费。我们将以DataFountain提供的数…...
react antd tabs router 基础管理后台模版
在构建 React 后台管理系统时,使用标签页的方式展示路由是一种高效且用户友好的设计模式。这种实现方式通常允许用户在多个页面之间快速切换,并保留页面的状态,类似于浏览器的多标签页功能。 需求分析 1.动态标签页:根据用户的导…...

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化队列、销毁队列、判断队列是否为空、进队列…...

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…...
GIT CLONE ERROR: remote: [session-ec426a86] Access denied
报错信息: remote: [session-ec426a86] Access denied 错误原因: 1.更换了不同的GIT仓或者账号 2.之前设置了默认账号密码信息 3. git init 只初始化了GIT项目,并没有清空原有的账号密码配置 处理方法: win11需要到个人文件…...

GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!
MoonBit 编程语言正式被 Github 收录!这对于一个仅有两年发展时间的编程语言来说是一种高度认可,期待未来由 MoonBit 编写的项目数量快速增长,早日成为首个由国人研发迈进 10 万➕ 用户的编程语言。 最近用户数已经接近 3 万(数据…...

PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...

docker安装Elasticsearch和Kibana
上传文件 加载tar包 安装 1.安装elasticsearch 通过下面的Docker命令即可安装单机版本的elasticsearch: docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elastics…...

【Linux】文件管理必备知识和基本指令
【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要):06.rmdir指令 && rm 指令(重要):rmdir指令rm指令 0…...

欢迪迈手机商城设计与实现
文末获取源码和万字论文,制作不易,感谢点赞支持。 题目:欢迪迈手机商城设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管…...
量化交易系统开发-实时行情自动化交易-3.4.2.3.数字货币市场深度数据
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取市场深…...

有序集合ZSET【Redis对象篇】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

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

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...