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

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.还是老样子&#xff0c;先创建存储池&#xff0c;在初始化为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…...

使用 OpenCV 进行 Android 开发

在本节中&#xff0c;我们将创建一个简单的应用程序&#xff0c;它除了加载 OpenCV 之外什么都不做。在下一节中&#xff0c;我们将扩展它以支持相机。 除了这个说明&#xff0c;你还可以使用一些视频指南&#xff0c;例如这个 打开 Android Studio 并选择Empty Views Activi…...

ubuntu下 grep 如何过滤包括G或者T字符串

在 grep 中&#xff0c;你可以通过使用正则表达式来匹配包含 G 或者 T 的字符串。例如&#xff1a; 1. 过滤包括 G 或 T 的字符串&#xff1a; grep -E G|T filename -E 表示启用扩展正则表达式&#xff08;也可以用 egrep&#xff09;。G|T 表示匹配 G 或 T。 2. 不区分大…...

【C语言】整数每一位数字出现次数

提相信你是最棒哒&#xff01;&#xff01;&#xff01; 文章目录 题目描述 题目代码 法一解析版C 法二解析版C 总结 题目描述 给出两个整数 M 和 N&#xff0c;求在序列[M, M 1, M 2,…, N - 1, N]中每一个数码出现了多少次。 输入格式 输入两个整数 M 和 N 。 输出格式…...

opencv Mat To Heif

高效率图像文件格式&#xff08;英语&#xff1a;High Efficiency Image File Format, HEIF&#xff1b;也称高效图像文件格式&#xff09;是一个用于单张图像或图像序列的文件格式。它由运动图像专家组&#xff08;MPEG&#xff09;开发&#xff0c;并在MPEG-H Part 12&#x…...

[GStreamer] gstbasesink 的 chain 函数

chain函数的定位&#xff1a; chain函数是上一个element到当前element的入口&#xff0c;chain函数处理完毕后&#xff0c;上一个函数的push_buffer 就得以返回。因此通常情况下 parent element 的核心逻辑都在 chain 函数里&#xff0c;再通过再 chain 函数里调用虚函数让 ch…...

评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2403.05075 近年来&#xff0c;机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率&#xff0c;以期实现人工通用智能&#xff08;AGI&#xff09;。其中&#xff0c;大规模语言模型&a…...

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础 OpenCV的视频教学&#xff1a;https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV视频捕获 在 OpenCV 中&#xff0c;cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频&#xff0c;或者从视频文件中读取帧。以下是如何使用…...

Springboot 2.7+解决跨域问题,到底是在SpringBoot中添加拦截器还是修改Nginx配置

文章目录 1摘要2 核心代码2.1 SpringBoot 全局跨域拦截器2.2 Nginx 配置跨域处理2.3 Nginx 和 SpringBoot 同时添加允许跨域处理会怎么样&#xff1f; 3 推荐参考资料 1摘要 跨域问题报错信息: Referrer Policy:strict-origin-when-cross-origin跨域问题是在前后端分离的情况…...

在Mac上安装多个Java版本

1、获取 Homebrew 的历史版本库 执行下面命令来获取 Homebrew 的历史版本库 brew tap homebrew/cask-versions2、安装java //java8 brew install java8 --cask//java11 brew install java11 --cask//java17 brew install --cask homebrew/cask-versions/microsoft-openjdk17…...

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。&#xff08;/data/prometheus/可根据自己需要调整&#xff09; global:scrape_interval: 15s # By default, scrape targets ev…...

HTTP中GET和POST详细理解

HTTP中GET和POST 简单来说 GET 的语义是从服务器获取指定的资源&#xff0c;这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中&#xff0c;URL 规定只能支持 ASCII&#xff0c;所以 GET 请求的参数只允许 ASCII 字符 &#xff0c;而且浏览器…...

Vant UI Axure移动端元件库:提升移动端原型设计效率

UI框架的选择对于提升开发效率和用户体验至关重要。Vant UI&#xff0c;作为一款基于Vue.js的轻量、可靠的移动端组件库&#xff0c;自2017年开源以来&#xff0c;凭借其丰富的组件库、良好的性能以及广泛的兼容性&#xff0c;在移动端开发领域崭露头角&#xff0c;赢得了众多开…...

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…...

【ESP32】ESP-IDF开发 | DAC数模转换器+余弦波输出例程

1. 简介 ESP32上的数字模拟转换器 (DAC) 带有 2 个 8 位通道&#xff0c;因此可输出2路模拟信号。在低功耗模式下也可由 ULP 协处理器通过控制寄存器来实现完全控制。内部自带余弦波形生成器&#xff0c;可用于生成余弦波形/正弦波形&#xff0c;用户可调整频率、振幅、相位和直…...

java中的递归

大家好&#xff0c;今天我们来学习一下java中的递归&#xff0c;相信大家应该也对递归有一点了解吧&#xff0c;如果没有也没有关系&#xff0c;我们现在就来了解一下。 五、递归 自身中包含了自己,遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问…...

残差网络连接,使得输入与输出的尺寸一样

def forward(self, x):out self.layer1(x)out self.layer2(out)# 使用插值将输入x上采样至与layer2输出相同的尺寸x F.interpolate(x, size(out.size(2), out.size(3)), modebilinear, align_cornersFalse)# 确保x的通道数与out匹配x x[:, :out.size(1), :, :] # 选择前ou…...

SAP SD学习笔记18 - 投诉处理4 - 请求书订正依赖,投诉处理流程的总结

上一章讲了 Credit/Debit Memo依赖&#xff0c;Credit/Debit Memo。Credit Memo依赖 本质上是一张受注票&#xff1b;Credit Memo 本质上是一张请求票。 SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖&#xff0c;Credit/Debit Memo-CSDN博客 本章继续讲本图中的内容…...

记录下nginx接口代理配置问题

其中api和api1是前面定义的upstream&#xff0c;ip相同只是端口不同。 一开始/api1/直接 像api一样 proxy_pass http://api1这样是不行的&#xff0c;因为会代理到 后端的 /api1/...接口&#xff0c;而后端实际接口地址是 /api/..... 所以必须像上面写法才能将外网的 /api…...

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc&#xff1a; 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本&#xff1a;3.2.0 flink版本&…...

001-Redis介绍

目录 一、Redis 简介 二、Redis 特性 三、Redis 下载安装 四、Redis 可视化管理界面工具 一、Redis 简介 1.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的 key-value 数据库。 2. 它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,它是一种 NoS…...

数据结构---单链表

目录 一、概念 二、分类 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 三、接口实现 1.定义结构 2、申请节点 3、尾插 4、头插 5、尾删 6、头删 7.查找&#xff0c;也可以充当修改 8、在pos之前插入x 9、在pos之后插入x ​编辑 10、删除pos位置 …...

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…...

在做题中学习(78):数组中第K个最大元素

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决topK问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogN) 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#xff0c;随机选择基准…...

药剂学试卷

1【单选题】在倍氯米松气雾剂中加入四氟乙烷是用作 C A、 助悬剂 B、 乳化剂 C、 抛射剂 D、 防腐剂 2【单选题】一步制粒机可完成的工序是 B A、 粉碎→混合→制粒→干燥 B、 混合→制粒→干燥 C、 过筛→制粒→混合→干燥 D、 过筛→制粒→混合 3【单选题】小檗碱片包…...

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切 文章目录 0 论文工作1 方法2 实验结果 0 论文工作 最近提出的高斯Splatting方法实现了高质量的实时三维场景新视角合成。然而&#xff0c;它仅仅关注外观和几何建模&#xff0c;缺乏细粒度的物体级场景理解。为了解决…...

力扣143.重排链表

题目描述 题目链接143. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff…...

本文介绍麒麟信安服务器系统(kylinsec)的安装。

本文介绍麒麟信安服务器系统&#xff08;kylinsec&#xff09;的安装。 下载 在开源欧拉官方找到商业版本的介绍找到相关产品&#xff1a; https://www.openeuler.org/zh/download/commercial-release/ 麒麟信安kylinsec下载地址&#xff1a; https://mirrors.kylinsec.com…...

单链表---回文结构

判断某一个单链表是否是回文结构&#xff0c;是返回true、不是返回false。 所谓的回文结构&#xff0c;就是类似对称结构&#xff1a; 对于奇数与偶数个结点均是如此。 那么就有思路&#xff1a;①找到链表的中间结点②逆置后半部分或前半部分③比较两者 ①找中间结点&#x…...

Java --- 反射

目录 一.什么是反射&#xff1f; 二.反射的核心方法和功能&#xff1a; 1.获取类的元信息&#xff1a; 2. 动态实例化对象&#xff1a; 3. 访问字段&#xff08;包括私有字段&#xff09;&#xff1a; 4. 调用方法&#xff08;包括私有方法&#xff09;&#xff1a; 5.…...

python编程Day12-属性和方法的分类

私有和公有 在python中 定义类的时候&#xff0c;可以给 属性和方法设置 访问权限&#xff0c;即规定在什么地方可以使用。 权限一般分为两种&#xff1a;公有权限、私有权限 公有权限 定义&#xff1a;直接定义的属性和方法就是公有的特点&#xff1a; 可以在任何地方访问和使…...

C#实现TCP客户端和服务器

本文将介绍如何使用C#实现TCP客户端和服务器的基本功能&#xff0c;客户端与服务器可以相互发送消息。 效果展示 服务器端实现 首先&#xff0c;我们实现TCP服务器。以下是服务器端所需的类和代码&#xff1a; using System; using System.Collections.Generic; using Syste…...

数据库编程: JDBC 中数据库驱动包的安装,配置及引用

目录 驱动包的下载安装 1. 去oracle 官方网站下载 2. github 的开源软件 3. 中央仓库(推荐使用这个) 驱动包的配置及引用 1. 第一步: 打开idea, 在 idea 中创建新的项目 2. 然后我们要在 jdbc_1 目录下创建一个新的目录包 3. 最后引入MySQL 的驱动包, 作为项目的依赖 尾…...

mx linux 在konsole终端中无法输入中文的解决方法

在mx linux系统中&#xff0c;浏览器可以正常输入中文&#xff0c;但是终端窗口中无法输入中文的解决方法&#xff0c;可以通过以下步骤安装 fcitx - frontend - qt5 组件&#xff1a; 1. 打开终端。你可以通过系统菜单或者快捷键&#xff08;如 Ctrl Alt T &#xff09;来…...

./configure 安装ngnix的命令

./configure 是一个在 Unix 和类 Unix 系统中常用的 shell 脚本命令&#xff0c;主要用于配置软件源代码包&#xff0c;以便进行编译和安装。这个命令通常在从源代码编译软件之前执行&#xff0c;它会自动检测系统的配置并生成适合该系统的 Makefile。 以下是 ./configure 脚本…...

网络安全之接入控制

网络安全之接入控制 身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 I…...

2.1 关系模型

关系模型的基本概念 关系&#xff1a;二维表&#xff0c;通常在数据库中表现为一个表&#xff1b; 属性&#xff1a;关系中的一个列即为关系的一个属性&#xff1b; 域&#xff1a; 每个属性的取值范围即为该属性的域&#xff1b; 元组&#xff1a;关系中的一个行是一个元组…...

深入浅出 Go 语言 sync包中的互斥锁、条件变量

深入浅出 Go 语言 sync包中的互斥锁、条件变量 引言 在并发编程中&#xff0c;多个 Goroutine 同时访问共享资源可能会导致数据竞争&#xff08;Race Condition&#xff09;&#xff0c;进而引发程序的不一致性或崩溃。为了确保并发程序的正确性和稳定性&#xff0c;Go 语言提…...

利用Python实现子域名简单收集

免责申明 本文仅是用于学习研究子域名信息收集&#xff0c;请勿用在非法途径上&#xff0c;若将其用于非法目的&#xff0c;所造成的一切后果由您自行承担&#xff0c;产生的一切风险和后果与笔者无关&#xff1b;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法…...

npm发布插件到私有仓库保姆级教程

在开发项目的过程中&#xff0c;我们经常需要安装插件依赖&#xff0c;那么怎么把自己开发的组件封装成一个插件&#xff0c;并发布到npm 插件市场或者上传到私有仓库里面呢&#xff1f;今天总结下自己发布插件到私有仓库的记录&#xff1a; 一、创建组件 执行命令创建一个空…...

利用Java easyExcel库实现高效Excel数据处理

在Java应用程序中&#xff0c;处理Excel文件是一项常见任务&#xff0c;尤其是在需要读取、写入或分析大量数据时。easyExcel是一个基于Java的高性能Excel处理库&#xff0c;它提供了简洁的API和优化的性能&#xff0c;以简化Excel文件的处理。本文将指导您如何使用easyExcel库…...

基于Springboot的校园交友网站设计与实现

1.1 管理信息系统概述 管理信息系统是计算机在信息管理领域的一种实用技术。通过运用管理科学、数学和计算机应用的原理及方法&#xff0c;在符合软件工程规范的原则下&#xff0c;形成一套完整的理论和方法体系。是一个以人、计算机和其他外部设备组成的可以进行信息的收集、…...

android studio 读写文件操作(应用场景三)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;filesaveandread 其实我写这个都是我记录我要做后个数独小游戏&#xff0c;每一个都是为了解决一个问题。即是分享也是备忘&#xff0c;反正我什么都不会&#xff0c;就是一顿瞎改&#xff0c;不行就研究。这…...

小程序 —— Day1

组件 — view和scroll-view view 类似于HTML中的div&#xff0c;是一个块级元素 案例&#xff1a;通过view组件实现页面的基础布局 scroll-view 可滚动的视图区域&#xff0c;用来实现滚动列表效果 案例&#xff1a;实现纵向滚动效果 scroll-x属性&#xff1a;允许横向滚动…...

使用 PyTorch 和 Horovod 来编写一个简单的分布式训练 demo

使用 PyTorch 和 Horovod 来编写一个简单的分布式训练 demo&#xff0c;可以帮助你理解如何在多GPU或多节点环境中高效地训练深度学习模型。Horovod 是 Uber 开发的一个用于分布式训练的框架&#xff0c;它支持 TensorFlow、Keras、PyTorch 等多个机器学习库。下面是一个基于 P…...

【Linux】以 CentOS 为例备份与恢复/home分区,并调整分区容量

在 Linux 系统中&#xff0c;这里举例对 /home 目录进行备份、重建和恢复操作&#xff0c;并调整分区大小、更换文件系统或修复损坏的分区等。 〇、前提条件 确认文件系统类型为 xfs。 确认 /home 目录确实没有重要数据&#xff0c;或者已经做好了数据备份。 确保在执行这些…...

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究&#xff1a;基因突变…...

神经网络的梯度反向传播计算过程,举例说明

目录 神经网络的梯度反向传播计算过程 网络结构 权重和偏置 激活函数 前向传播 损失函数 反向传播 参数更新 举例 神经网络的梯度反向传播计算过程 为了说明神经网络的梯度反向传播计算过程,我们考虑一个简单的全连接网络,该网络有一个输入层、一个隐藏层和一个输出…...

定点数乘法:补码一位算法(booth算法)

方法 初始化 将被乘数A放在寄存器A中。 将乘数B放在寄存器B中&#xff0c;并在最低位添加一个额外的位Q(-1) 0。 结果寄存器P初始化为0&#xff0c;长度为2n位。 迭代过程&#xff08;重复n次&#xff09; 对于i从0到n-1&#xff1a; 检查乘数B的最后两位&#xff08;B 和…...

robots.txt

robots.txt 文件是网站管理者用来告知搜索引擎爬虫&#xff08;也称为机器人或蜘蛛&#xff09;哪些页面可以抓取&#xff0c;哪些页面不应该被抓取的一种文本文件。它位于网站的根目录下&#xff0c;并且文件名必须全部小写。这个文件对于SEO&#xff08;搜索引擎优化&#xf…...