十九、云原生分布式存儲 CubeFS

十九、云原生分布式存儲 CubeFS

文章目錄

  • 十九、云原生分布式存儲 CubeFS
    • 1、分布式存儲初識
      • 1.1 分布式存儲主要特性
      • 1.2 為什么要在K8s上落地存儲平臺
      • 1.3 云原生存儲平臺CubeFS介紹
      • 1.4 分布式存儲平臺落地架構
        • 1.4.1 混合部署
        • 1.4.2 獨立部署-基礎設施集群
      • 1.5 資源分配建議
      • 1.6 硬件設計
    • 2、CubeFS安裝
      • 2.1 CubeFS 部署架構
      • 2.2 集群規劃
      • 2.3 首先給節點打上標簽,用來標記部署什么服務:
      • 2.4 數據盤配置
      • 2.5 CubeFS 部署
    • 3、CubeFS 客戶端部署使用
      • 3.1 CubeFS 客戶端部署
      • 3.2 集群管理
      • 3.3 元數據節點管理
      • 3.4 數據節點管理
      • 3.5 用戶管理
      • 3.6 數據卷管理
      • 3.7 CubeFS 掛載測試
      • 3.8 CubeFS 擴容
        • 3.8.1 基于磁盤擴容
        • 3.8.2 基于主機的擴容
    • 4、CubeFS 對象存儲
    • 5、CubeFS 對接 K8s
      • 5.1 CSI 部署
      • 5.2 PVC 和 PV 測試
      • 5.3 在線擴容
    • 6、數據持久化實戰
      • 6.1 MySQL 數據持久化
      • 6.2 大模型文件持久化

1、分布式存儲初識

1.1 分布式存儲主要特性

  • 支持近乎無限的擴容
  • 支持容錯能力和數據冗余
  • 支持多機房多區域部署
  • 支持負載均衡和并行處理
  • 支持權限管理和多用戶
  • 支持多種文件存儲類型
  • 支持普通硬件設計

1.2 為什么要在K8s上落地存儲平臺

萬物皆可容器化

  • 簡化部署和管理
  • 自動化運維
  • 一鍵式動態擴展
  • 故障自愈和高可用性
  • 云原生生態集成

1.3 云原生存儲平臺CubeFS介紹

CubeFS是新一代云原生存儲產品,目前是云原生計算基金會(CNCF)托管的畢業開源項目,兼容S3、POSIX、HDFS等多種訪問協議,支持多副本與糾刪碼兩種存儲引擎,為用戶提供多租戶、多AZ部署以及跨區域復制等多種特性,廣泛應用于大數據、AI、容器平臺、數據庫、中間件存算分離、數據共享以及數據保護等場景。

CubeFS特性:

  • 多協議:支持S3、POSIX、HDFS
  • 雙引擎:支持多副本與糾刪碼
  • 多租戶:支持多租戶隔離和權限分配
  • 可擴展:支持各模塊水平擴展,輕松擴展到PB或EB級
  • 高性能:支持多級緩存、支持多種高性能的復制協議
  • 云原生:自帶CSI插件,一鍵集成kubernetes
  • 多場景:大數據分析、機器學習、深度訓練、共享存儲、對象存儲、數據庫中間件等

1.4 分布式存儲平臺落地架構

1.4.1 混合部署

在這里插入圖片描述

1.4.2 獨立部署-基礎設施集群

在這里插入圖片描述

1.5 資源分配建議

元數據節點總內存計算規則:每個文件元數據占用空間2KB~4KB左右

根據文件數量預估
假設已知的文件數量預估為10億
通過計算規則需要的內存KB為:20億KB
換算為G:2000000000 / 1024 / 1024 ≈ 2000G

根據數據量預估
假設集群數據總量為10PB = 10240TB = 10737418240MB
通過默認分片大小8MB預估,可能需要10737418240 / 8 ≈ 1342177280個文件
通過計算規則需要的內存KB為:2684354560KB ≈ 2500G

1.6 硬件設計

服務器硬件設計 / 1PB / 256G內存

在這里插入圖片描述

2、CubeFS安裝

2.1 CubeFS 部署架構

在這里插入圖片描述

CubeFS 目前由這四部分組成:

  • Master:資源管理節點,負責維護整個集群的元信息,部署為 StatefulSet 資源
  • DataNode:數據存儲節點,需要掛載大量磁盤負責文件數據的實際存儲,部署為 DaemonSet 資源
  • MetaNode:元數據節點,負責存儲所有的文件元信息,部署為 DaemonSet 資源
  • ObjectNode:負責提供轉換 S3 協議提供對象存儲的能力,無狀態服務,部署為 Deployment 資源

2.2 集群規劃

主機名稱物理IP系統資源配置數據磁盤
k8s-master01192.168.200.50Rocky9.44核8g40G*2
k8s-node01192.168.200.51Rocky9.44核8g40G*2
k8s-node02192.168.200.52Rocky9.44核8g40G*2

2.3 首先給節點打上標簽,用來標記部署什么服務:

# Master 節點,至少三個,建議為奇數個
kubectl label node <nodename> component.cubefs.io/master=enabled# MetaNode 元數據節點,至少 3 個,奇偶無所謂
kubectl label node <nodename> component.cubefs.io/metanode=enabled# Dataode 數據節點,至少 3 個,奇偶無所謂
kubectl label node <nodename> component.cubefs.io/datanode=enabled# ObjectNode 對象存儲節點,可以按需進行標記,不需要對象存儲功能的話也可以不部署這個組件
kubectl label node <nodename> component.cubefs.io/objectnode=enabled

master節點僅作演示

# 生產要指定節點打標簽
[root@k8s-master01 ~]# kubectl label node component.cubefs.io/master=enabled --all
[root@k8s-master01 ~]# kubectl label node component.cubefs.io/metanode=enabled --all
[root@k8s-master01 ~]# kubectl label node component.cubefs.io/datanode=enabled --all
[root@k8s-master01 ~]# kubectl label node component.cubefs.io/objectnode=enabled --all

2.4 數據盤配置

在配置了 component.cubefs.io/datanode=enabled 標簽的節點上,對數據盤進行初始化操作。

首先需要添加一個新盤,然后通過 fdisk -l 查看:

[root@k8s-master01 ~]# fdisk -l | grep /dev/nvme
Disk /dev/nvme0n1: 50 GiB, 53687091200 bytes, 104857600 sectors
/dev/nvme0n1p1 *       2048   2099199   2097152   1G 83 Linux
/dev/nvme0n1p2      2099200 104857599 102758400  49G 8e Linux LVM
Disk /dev/nvme0n2: 40 GiB, 42949672960 bytes, 83886080 sectors

格式化每個磁盤并掛載**(三節點操作)**:

# 格式化硬盤
[root@k8s-master01 ~]# mkfs.xfs -f /dev/nvme0n2# 創建掛載目錄,如果機器上存在多個需要掛載的數據磁盤,則每個磁盤按以上步驟進行格式化和掛載磁盤,掛載目錄按照 data0/data1/../data999 的順序命名
[root@k8s-master01 ~]# mkdir /data0# 掛載磁盤
[root@k8s-master01 ~]# mount /dev/nvme0n2 /data0# 設置為開機自動掛載(注意三個節點磁盤的UUID號不同):
[root@k8s-master01 ~]# blkid /dev/nvme0n2
/dev/nvme0n2: UUID="56b90331-8053-403b-9393-597811b81310" TYPE="xfs"[root@k8s-master01 ~]# echo "UUID=56b90331-8053-403b-9393-597811b81310 /data0 xfs defaults 0 0" >>/etc/fstab 
[root@k8s-master01 ~]# mount -a

2.5 CubeFS 部署

下載安裝文件

[root@k8s-master01 ~]# git clone https://gitee.com/dukuan/cubefs-helm.git

調整安裝配置

[root@k8s-master01 ~]# cd cubefs-helm/cubefs/
[root@k8s-master01 cubefs]# vim values.yaml
[root@k8s-master01 cubefs]# sed -n "2,15p;21,24p;27,31p;33,35p;50p;52p;56,57p;70,77p;79p;87p;93,100p;107p;123,124p;127,134p;153p;156p;166p" values.yaml 
component:master: truedatanode: truemetanode: trueobjectnode: trueclient: falsecsi: falsemonitor: falseingress: falseblobstore_clustermgr: falseblobstore_blobnode: falseblobstore_proxy: falseblobstore_scheduler: falseblobstore_access: false
image:server: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/cfs-server:v3.5.0client: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/cfs-client:v3.5.0blobstore: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/blobstore:v3.4.0csi_driver: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/cfs-csi-driver:v3.5.0csi_provisioner: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/csi-provisioner:v2.2.2csi_attacher: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/sig-storage/csi-attacher:v3.4.0csi_resizer: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/csi-resizer:v1.3.0driver_registrar: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/csi-node-driver-registrar:v2.5.0grafana: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/grafana:6.4.4prometheus: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/prometheus:v2.13.1consul: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/consul:1.6.1
# 主節點配置:
master:      replicas: 3nodeSelector:"component.cubefs.io/master": "enabled"resources:enabled: falserequests:memory: "512Mi"       # 生產環境建議: 8Gcpu: "200m"           # 生產環境建議: 2000mlimits:memory: "2Gi"         # 生產環境建議: 32Gcpu: "2000m"          # 生產環境建議: 8000m
# 元數據節點配置:
metanode:total_mem: "6442450944"   # 可用內存建議為主機的 80%resources:enabled: truerequests:memory: "512Mi"       # 生產環境建議: 8Gcpu: "200m"           # 生產環境建議: 2000mlimits:memory: "2Gi"         # 生產環境建議: 32Gcpu: "2000m"          # 生產環境建議: 8000m
# 數據盤配置:
datanode:disks:- /data0:2147483648resources:enabled: falserequests:memory: "512Mi"       # 生產環境建議: 32Gcpu: "200m"           # 生產環境建議: 2000mlimits:memory: "2Gi"         # 生產環境建議: 256Gcpu: "2000m"          # 生產環境建議: 8000m
# 對象存儲節點配置:
objectnode:replicas: 3domains: "objectcfs.cubefs.io,objectnode.cubefs.io"
# 執行部署:
[root@k8s-master01 cubefs]# helm upgrade --install cubefs -n cubefs --create-namespace .# 查看 Pod 狀態:
[root@k8s-master01 cubefs]# kubectl get pod -n cubefs
NAME                          READY   STATUS    RESTARTS   AGE
datanode-22bh8                1/1     Running   0          4m13s
datanode-67fbm                1/1     Running   0          4m13s
datanode-9dh4q                1/1     Running   0          4m13s
master-0                      1/1     Running   0          4m13s
master-1                      1/1     Running   0          42s
master-2                      1/1     Running   0          39s
metanode-n6tpz                1/1     Running   0          4m13s
metanode-nq5m4                1/1     Running   0          4m13s
metanode-tt8q8                1/1     Running   0          4m13s
objectnode-5ff648b685-6rrkt   1/1     Running   0          4m13s
objectnode-5ff648b685-p9cxd   1/1     Running   0          4m13s
objectnode-5ff648b685-r2kw8   1/1     Running   0          4m13s

如果遇到啟動失敗的,可以在對應的節點上,查看 /var/log/cubefs 下的日志。

3、CubeFS 客戶端部署使用

官方文檔

3.1 CubeFS 客戶端部署

下載工具包:

[root@k8s-master01 ~]# tar xf cubefs-3.5.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# mv cubefs/build/bin/cfs-cli /usr/local/bin/
[root@k8s-master01 ~]# mv cubefs/build/bin/cfs-client /usr/local/bin/[root@k8s-master01 ~]# cfs-cli --version
CubeFS CLI
Version : v3.5.0
Branch  : HEAD
Commit  : 10353bf433fefd51c6eef564035c8a682515789c
Build   : go1.20.4 linux amd64 2025-03-17 17:40

客戶端配置:

[root@k8s-master01 ~]# kubectl get svc -n cubefs
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
master-service       ClusterIP   10.105.1.29     <none>        17010/TCP   155m# 更改 masterAddr 為 master service 的 svc ip
[root@k8s-master01 ~]# vim ~/.cfs-cli.json 
[root@k8s-master01 ~]# cat ~/.cfs-cli.json {"masterAddr": ["10.105.1.29:17010"],"timeout": 60
}

3.2 集群管理

獲取集群信息,包括集群名稱、地址、卷數量、節點數量和使用率等:

[root@k8s-master01 ~]# cfs-cli cluster info
[Cluster]Cluster name       : my-clusterMaster leader      : master-0.master-service:17010Master-1           : master-0.master-service:17010Master-2           : master-1.master-service:17010Master-3           : master-2.master-service:17010Auto allocate      : EnabledMetaNode count (active/total)    : 3/3MetaNode used                    : 0 GBMetaNode available               : 17 GBMetaNode total                   : 18 GBDataNode count (active/total)    : 3/3DataNode used                    : 0 GBDataNode available               : 103 GBDataNode total                   : 104 GBVolume count                     : 0Allow Mp Decomm                  : EnabledEbsAddr                          : LoadFactor                       : 0DpRepairTimeout                  : 2h0m0sDataPartitionTimeout             : 20m0svolDeletionDelayTime             : 48 hEnableAutoDecommission           : falseAutoDecommissionDiskInterval     : 10sEnableAutoDpMetaRepair           : falseAutoDpMetaRepairParallelCnt      : 100MarkDiskBrokenThreshold          : 0%DecommissionDpLimit              : 10DecommissionDiskLimit            : 1DpBackupTimeout                  : 168h0m0sForbidWriteOpOfProtoVersion0     : falseLegacyDataMediaType              : 0BatchCount         : 0MarkDeleteRate     : 0DeleteWorkerSleepMs: 0AutoRepairRate     : 0MaxDpCntLimit      : 3000MaxMpCntLimit      : 300

獲取集群狀態,按區域獲取元數據和數據節點使用率、狀態等:

[root@k8s-master01 ~]# cfs-cli cluster stat
[Cluster Status]DataNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     104                0                  0                  0.009          MetaNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     18                 0                  0                  0.014          Zone List:ZONE NAME    ROLE        TOTAL/GB           USED/GB            AVAILABLE/GB       USED RATIO         TOTAL NODES    WRITEBLE NODESdefault      DATANODE    104.81             0.93               103.88             0.01               3             3         METANODE    18                 0.25               17.75              0.01               3             3  

Metanode 的 Total 為最大可用內存,由所有 metanode 的 MaxMemAvailWeight 之和計算得來。

設置卷刪除延遲的時間,表示卷被刪除多久才會被徹底刪除,默認 48h,在此之前可以恢復:

 cfs-cli cluster volDeletionDelayTime 72

3.3 元數據節點管理

列出所有的元數據節點,包括 ID、地址、讀寫狀態及存活狀態等:

[root@k8s-master01 ~]# cfs-cli metanode list
[Meta nodes]
ID        ADDRESS                                                              WRITABLE    ACTIVE      MEDIA        ForbidWriteOpOfProtoVer0
2         192.168.200.52:17210(master-0.master-service.cubefs.svc.cluster.local:17210)    Yes         Active      N/A          notForbid   
6         192.168.200.51:17210(master-2.master-service.cubefs.svc.cluster.local:17210)    Yes         Active      N/A          notForbid   
7         192.168.200.50:17210(192-168-200-50.kubernetes.default.svc.cluster.local:17210,master-1.master-service.cubefs.svc.cluster.local:17210)    Yes         Active      N/A          notForbid 

查看某個節點的詳細信息:

[root@k8s-master01 ~]# cfs-cli metanode info 192.168.200.52:17210
[Meta node info]ID                  : 2Address             : 192.168.200.52:17210(master-0.master-service.cubefs.svc.cluster.local:17210)Threshold           : 0.75MaxMemAvailWeight   : 5.91 GBAllocated           : 95.27 MBTotal               : 6.00 GBZone                : defaultStatus              : ActiveRdonly              : falseReport time         : 2025-08-23 20:23:52Partition count     : 0Persist partitions  : []Can alloc partition : trueMax partition count : 300CpuUtil             : 1.0%

3.4 數據節點管理

列舉所有的數據節點,包括 ID、地址、讀寫狀態和存活狀態:

[root@k8s-master01 ~]# cfs-cli datanode list
[Data nodes]
ID        ADDRESS                                                              WRITABLE    ACTIVE      MEDIA        ForbidWriteOpOfProtoVer0
3         192.168.200.50:17310(master-1.master-service.cubefs.svc.cluster.local:17310,192-168-200-50.kubernetes.default.svc.cluster.local:17310)    Yes         Active      N/A          notForbid   
4         192.168.200.51:17310(master-2.master-service.cubefs.svc.cluster.local:17310)    Yes         Active      N/A          notForbid   
5         192.168.200.52:17310(master-0.master-service.cubefs.svc.cluster.local:17310)    Yes         Active      N/A          notForbid 

展示某個節點的詳細信息:

[root@k8s-master01 ~]# cfs-cli datanode info 192.168.200.52:17310
[Data node info]ID                  : 5Address             : 192.168.200.52:17310(master-0.master-service.cubefs.svc.cluster.local:17310)Allocated ratio     : 0.008872044107781753Allocated           : 317.41 MBAvailable           : 34.63 GBTotal               : 34.94 GBZone                : defaultRdonly              : falseStatus              : ActiveMediaType           : UnspecifiedToBeOffline         : FalseReport time         : 2025-08-23 20:25:53Partition count     : 0Bad disks           : []Decommissioned disks: []Persist partitions  : []Backup partitions   : []Can alloc partition : trueMax partition count : 3000CpuUtil             : 1.3%IoUtils             :/dev/nvme0n2:0.0%

下線數據節點(不要輕易操作)

# 下線數據節點,下線后該節點的數據將自動遷移至其他節點:
[root@k8s-master01 ~]# cfs-cli datanode decommission 192.168.200.52:17310# 下線后,節點信息無法在查看:
[root@k8s-master01 ~]# cfs-cli datanode info 192.168.200.52:17310
Error: data node not exists# 數據空間也會降低:
[root@k8s-master01 ~]# cfs-cli cluster stat
[Cluster Status]DataNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     69                 0                  0                  0.009          MetaNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     18                 0                  0                  0.014          Zone List:ZONE NAME    ROLE        TOTAL/GB           USED/GB            AVAILABLE/GB       USED RATIO         TOTAL NODES    WRITEBLE NODESdefault      DATANODE    69.88              0.62               69.26              0.01               2             2         METANODE    18                 0.25               17.75              0.01               3             3  

Pod 重建后,節點重新加入:

# 查詢下線節點pod
[root@k8s-master01 ~]# kubectl get po -n cubefs -owide | grep data | grep 192.168.200.52
datanode-9dh4q                1/1     Running   0          3h42m   192.168.200.52   k8s-node02     <none>           <none># 刪除pod重新加入節點
[root@k8s-master01 ~]# kubectl delete po datanode-9dh4q -n cubefs# 數據空間恢復
[root@k8s-master01 ~]# cfs-cli cluster stat
[Cluster Status]DataNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     104                0                  0                  0.009          MetaNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     18                 0                  0                  0.014          Zone List:ZONE NAME    ROLE        TOTAL/GB           USED/GB            AVAILABLE/GB       USED RATIO         TOTAL NODES    WRITEBLE NODESdefault      DATANODE    104.81             0.93               103.88             0.01               3             3         METANODE    18                 0.26               17.74              0.01               3             3  

3.5 用戶管理

CubeFS 支持多用戶,可以為每個用戶對每個卷分配不同的權限,同時也可為對象存儲提供用戶認證。

創建用戶:

[root@k8s-master01 ~]# cfs-cli user create test --yes

獲取用戶信息:

[root@k8s-master01 ~]# cfs-cli user info test
[Summary]User ID    : testAccess Key : XMnVAEysoGEFtZyVSecret Key : 1w4TdSfHoY0cqSrHBUKvJ5Hx5AxmcuiPType       : normalCreate Time: 2025-08-23 20:52:48
[Volumes]
VOLUME                  PERMISSION 

列舉所有用戶:

[root@k8s-master01 ~]# cfs-cli user list
ID                      TYPE      ACCESS KEY          SECRET KEY                          CREATE TIME
root                    Root      mPsMgs0lqDZ5ebG4    1LIvar5UHEsKnxLb1BIuCKWO7fWMUZaE    2025-08-23 17:02:09
test                    Normal    XMnVAEysoGEFtZyV    1w4TdSfHoY0cqSrHBUKvJ5Hx5AxmcuiP    2025-08-23 20:52:48

刪除用戶:

[root@k8s-master01 ~]# cfs-cli user delete test --yes[root@k8s-master01 ~]# cfs-cli user list
ID                      TYPE      ACCESS KEY          SECRET KEY                          CREATE TIME
root                    Root      mPsMgs0lqDZ5ebG4    1LIvar5UHEsKnxLb1BIuCKWO7fWMUZaE    2025-08-23 17:02:09

3.6 數據卷管理

創建一個卷:

# 命令格式:cfs-cli volume create [VOLUME NAME] [USER ID] [flags]
[root@k8s-master01 ~]# cfs-cli volume create volume-test test --capacity 1 -y# volume-test:卷的名字
# test:用戶,如果用戶不存在就自動創建
# --capacity 1:卷的大小,單位為G(不指定大小默認10G)

列出所有的卷:

[root@k8s-master01 ~]# cfs-cli volume list
VOLUME                                                             OWNER                   USED        TOTAL       STATUS      CREATE TIME
volume-test                                                        test                    0.00 B      1.00 GB     Normal      Sat, 23 Aug 2025 20:58:43 CST

查看某個卷的詳細信息:

[root@k8s-master01 ~]# cfs-cli volume info volume-test
Summary:ID                              : 9Name                            : volume-testOwner                           : testAuthenticate                    : DisabledCapacity                        : 1 GBCreate time                     : 2025-08-23 20:58:43DeleteLockTime                  : 0Cross zone                      : DisabledDefaultPriority                 : falseDentry count                    : 0Description                     : DpCnt                           : 10DpReplicaNum                    : 3Follower read                   : DisabledMeta Follower read              : DisabledDirect Read                     : DisabledInode count                     : 1Max metaPartition ID            : 3MpCnt                           : 3MpReplicaNum                    : 3NeedToLowerReplica              : DisabledRwDpCnt                         : 10Status                          : NormalZoneName                        : defaultVolType                         : 0DpReadOnlyWhenVolFull           : falseTransaction Mask                : renameTransaction timeout             : 1Tx conflict retry num           : 10Tx conflict retry interval(ms)  : 20Tx limit interval(s)            : 0Forbidden                       : falseDisableAuditLog                 : falseTrashInterval                   : 0sDpRepairBlockSize               : 128KBEnableAutoDpMetaRepair          : falseQuota                           : DisabledAccessTimeValidInterval         : 24h0m0sMetaLeaderRetryTimeout          : 0sEnablePersistAccessTime         : falseForbidWriteOpOfProtoVer0        : falseVolStorageClass                 : UnspecifiedAllowedStorageClass             : []CacheDpStorageClass             : Unspecified

禁用卷:

[root@k8s-master01 ~]# cfs-cli volume set-forbidden volume-test true[root@k8s-master01 ~]# cfs-cli volume info volume-test | grep -i ForbiddenForbidden                       : true

取消禁用:

[root@k8s-master01 ~]# cfs-cli volume set-forbidden volume-test false[root@k8s-master01 ~]# cfs-cli volume info volume-test | grep -i ForbiddenForbidden                       : false

卷擴容或者更新卷配置:

[root@k8s-master01 ~]# cfs-cli volume update volume-test test --capacity 2 -y[root@k8s-master01 ~]# cfs-cli volume list
VOLUME                                                             OWNER                   USED        TOTAL       STATUS      CREATE TIME
volume-test                                                        test                    0.00 B      2.00 GB     Normal      Sat, 23 Aug 2025 20:58:43 CST

添加空間限制:

# 如果卷的空間滿了,就不能繼續往里面寫數據
[root@k8s-master01 ~]# cfs-cli volume update volume-test --readonly-when-full true -y[root@k8s-master01 ~]# cfs-cli volume info volume-test | grep -i readonlyDpReadOnlyWhenVolFull           : true

刪除卷:

[root@k8s-master01 ~]# cfs-cli volume delete volume-test -y

3.7 CubeFS 掛載測試

創建卷:

[root@k8s-master01 ~]# cfs-cli volume create volume-test ltptest -y

創建客戶端的配置文件:

[root@k8s-master01 ~]# vim volume-test-client.conf
[root@k8s-master01 ~]# cat volume-test-client.conf
{"mountPoint": "/volume-test", "volName": "volume-test",     # 掛載卷名稱"owner": "ltptest",           # 用戶"masterAddr": "10.103.104.112:17010",    # master-service的IP"logDir": "/cfs/client/log","logLevel": "info","profPort": "27510"
}

安裝 fuse:

[root@k8s-master01 ~]# yum install fuse -y

掛載:

[root@k8s-master01 ~]# cfs-client -c volume-test-client.conf[root@k8s-master01 ~]# df -Th | grep volume-test
cubefs-volume-test  fuse.cubefs   10G     0   10G   0% /volume-test

寫入數據測試:

[root@k8s-master01 ~]# cd /volume-test/
[root@k8s-master01 volume-test]# dd if=/dev/zero of=./cubefs bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 45.2422 s, 11.9 MB/s[root@k8s-master01 volume-test]# dd if=/dev/zero of=./cubefs bs=128M count=4
4+0 records in
4+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 36.2865 s, 14.8 MB/s# 查看卷使用:
[root@k8s-master01 volume-test]# cfs-cli volume list
VOLUME                                                             OWNER                   USED        TOTAL       STATUS      CREATE TIME
volume-test                                                        ltptest                 512.00 MB    10.00 GB    Normal      Sun, 24 Aug 2025 22:29:21 CST

3.8 CubeFS 擴容

3.8.1 基于磁盤擴容

如果 CubeFS 是部署在 K8s 中的,擴容時需要給每個主機都添加一塊硬盤:
首先需要添加一個新盤,然后通過 fdisk -l 查看:

[root@k8s-master01 ~]# fdisk -l | grep /dev/nvme0n3
Disk /dev/nvme0n3: 50 GiB, 53687091200 bytes, 104857600 sectors

格式化每個磁盤并掛載**(三節點操作)**:

# 格式化硬盤
[root@k8s-master01 ~]# mkfs.xfs -f /dev/nvme0n3# 創建掛載目錄,如果機器上存在多個需要掛載的數據磁盤,則每個磁盤按以上步驟進行格式化和掛載磁盤,掛載目錄按照 data0/data1/../data999 的順序命名
[root@k8s-master01 ~]# mkdir /data1# 掛載磁盤
[root@k8s-master01 ~]# mount /dev/nvme0n3 /data1# 設置為開機自動掛載(注意三個節點磁盤的UUID號不同):
[root@k8s-master01 ~]# blkid /dev/nvme0n3
/dev/nvme0n3: UUID="6abaad00-bdf3-4e29-8fe0-9920da8ced6b" TYPE="xfs"[root@k8s-master01 ~]# echo "UUID=6abaad00-bdf3-4e29-8fe0-9920da8ced6b /data1 xfs defaults 0 0" >>/etc/fstab
[root@k8s-master01 ~]# mount -a

更改 datanode 的配置:

[root@k8s-master01 ~]# cd cubefs-helm/cubefs/
[root@k8s-master01 cubefs]# vim values.yaml 
[root@k8s-master01 cubefs]# sed -n "107p;123,125p" values.yaml 
datanode:disks:- /data0:2147483648- /data1:2147483648

更新配置:

[root@k8s-master01 cubefs]# helm upgrade cubefs -n cubefs .

觸發 datanode 的重啟:

[root@k8s-master01 cubefs]# kubectl delete po -n cubefs -l app.kubernetes.io/component=datanode

重啟查看集群狀態:

[root@k8s-master01 cubefs]# cfs-cli cluster stat
[Cluster Status]DataNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     159                1                  1                  0.009          MetaNode Status:TOTAL/GB           USED/GB            INCREASED/GB       USED RATIO     18                 0                  0                  0.020          Zone List:ZONE NAME    ROLE        TOTAL/GB           USED/GB            AVAILABLE/GB       USED RATIO         TOTAL NODES    WRITEBLE NODESdefault      DATANODE    159.75             1.38               158.37             0.01               3             0         METANODE    18                 0.36               17.64              0.02               3  
3.8.2 基于主機的擴容

基于主機的擴容,需要通過添加 datanode 節點來完成。

  1. 添加一個新節點,已有節點可以忽略
  1. 在新節點上添加和當前配置一樣的硬盤并掛載
  2. 在新節點上打 component.cubefs.io/datanode=enabled 標簽即可

4、CubeFS 對象存儲

下載 Minio 對象存儲客戶端:

[root@k8s-master01 ~]# curl https://dl.minio.org.cn/client/mc/release/linux-amd64/mc --create-dirs -o /usr/local/bin/mc[root@k8s-master01 ~]# chmod +x /usr/local/bin/mc

配置對象存儲:

# 為每個項目創建用戶:
[root@k8s-master01 ~]# cfs-cli user create projecta -y
[root@k8s-master01 ~]# cfs-cli user list
ID                      TYPE      ACCESS KEY          SECRET KEY                          CREATE TIME
root                    Root      mPsMgs0lqDZ5ebG4    1LIvar5UHEsKnxLb1BIuCKWO7fWMUZaE    2025-08-23 17:02:09
projecta                Normal    vMAV6AOksC4cukBL    NcYi7mLw39iz0jQbXE9K2XrgO672NN7P    2025-08-24 13:46:04# 查看objectnode-service的IP
[root@k8s-master01 ~]# kubectl get svc -n cubefs
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
objectnode-service   ClusterIP   10.111.87.176   <none>        1601/TCP    20h# 添加項目的 host:
[root@k8s-master01 ~]# mc alias set projecta http://10.111.87.176:1601 vMAV6AOksC4cukBL NcYi7mLw39iz0jQbXE9K2XrgO672NN7P# projecta:用戶
# http:objectnode-service的IP
# vMAV6AOksC4cukBL:projecta用戶ACCESS的值
# NcYi7mLw39iz0jQbXE9K2XrgO672NN7P:projecta用戶SECRET的值

對象存儲基本使用

# 創建桶:
[root@k8s-master01 ~]# mc mb projecta/app# 查看桶:
[root@k8s-master01 ~]# mc ls projecta/
[2025-08-24 14:05:01 CST]     0B app/# 會自動生成一個同名的卷(每個桶都是以卷的形式存在的)
[root@k8s-master01 ~]# cfs-cli volume list
VOLUME                                                             OWNER                   USED        TOTAL       STATUS      CREATE TIME
app                                                                projecta                0 MB    10.00 GB    Normal      Sun, 24 Aug 2025 14:05:01 CST
# 上傳文件:
[root@k8s-master01 ~]# mc cp volume-ceshi-client.conf projecta/app/# 查看文件
[root@k8s-master01 ~]# mc ls projecta/app/
[2025-08-24 14:07:28 CST]   192B STANDARD volume-ceshi-client.conf# 刪除一個文件
[root@k8s-master01 ~]# mc rm projecta/app/volume-ceshi-client.conf# 文件已經被刪除
[root@k8s-master01 ~]# mc ls projecta/app/
[root@k8s-master01 ~]# 
# 上傳目錄:
# 不會上傳目錄本身,只會上傳目錄下的文件,所以要在存儲桶里寫一個同名目錄(自動創建)
[root@k8s-master01 ~]# mc cp cubefs/ projecta/app/cubefs/ -r# 查看目錄及文件
[root@k8s-master01 ~]# mc ls projecta/app/
[2025-08-24 14:24:17 CST]     0B cubefs/[root@k8s-master01 ~]# mc ls projecta/app/cubefs
[2025-08-24 14:40:35 CST]     0B build/# 刪除一個目錄
[root@k8s-master01 ~]# mc rm projecta/app/cubefs/ -r --force

5、CubeFS 對接 K8s

5.1 CSI 部署

首先給非控制節點打上 CSI 的標簽(需要使用存儲的節點都需要打標簽):

[root@k8s-master01 ~]# kubectl label node component.cubefs.io/csi=enabled -l '!node-role.kubernetes.io/control-plane'

更改 values 配置:

[root@k8s-master01 ~]# cd cubefs-helm/cubefs/
[root@k8s-master01 cubefs]# vim values.yaml 
[root@k8s-master01 cubefs]# sed -n "2p;8p;193p;207,214p;217p;219p" values.yaml 
component:csi: true
csi:resources:enabled: falserequests:memory: "1024Mi"cpu: "200m"limits:memory: "2048Mi"cpu: "2000m"setToDefault: truereclaimPolicy: "Delete"
# 執行安裝:
[root@k8s-master01 cubefs]# helm upgrade cubefs -n cubefs .# 查詢創建的 StorageClass:
[root@k8s-master01 cubefs]# kubectl get sc
NAME               PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
cfs-sc (default)   csi.cubefs.com   Delete          Immediate           true                   13s# 查看 Pod 
[root@k8s-master01 cubefs]# kubectl get po -n cubefs
NAME                                  READY   STATUS    RESTARTS        AGE
cfs-csi-controller-7cd54dddff-t5npw   4/4     Running   0               11m
cfs-csi-node-4qn6g                    2/2     Running   0               11m
cfs-csi-node-hbq99                    2/2     Running   0               11m
....

5.2 PVC 和 PV 測試

創建 PVC 測試:

[root@k8s-master01 ~]# vim cfs-pvc.yaml
[root@k8s-master01 ~]# cat cfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: cubefs-testnamespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: cfs-scvolumeMode: Filesystem

創建后,查看 PV 和綁定狀態:

[root@k8s-master01 ~]# kubectl create -f cfs-pvc.yaml [root@k8s-master01 cubefs]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-e4f37ba6-ebe9-48f7-bd5e-5dbe8bda0a77   1Gi        RWX            Delete           Bound    default/cubefs-test   cfs-sc         <unset>                          72s[root@k8s-master01 cubefs]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
cubefs-test   Bound    pvc-e4f37ba6-ebe9-48f7-bd5e-5dbe8bda0a77   1Gi        RWX            cfs-sc         <unset>                 7m37s

創建服務掛載測試:

[root@k8s-master01 ~]# kubectl create deploy nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15.12 --dry-run=client -oyaml > nginx-deploy.yaml[root@k8s-master01 ~]# vim nginx-deploy.yaml 
[root@k8s-master01 ~]# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:replicas: 2selector:matchLabels:app: nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: nginxspec:nodeSelector:     # 只有安裝了 CSI 驅動的才可以掛載存儲component.cubefs.io/csi: enabledvolumes:- name: mypvcpersistentVolumeClaim:claimName: cubefs-testcontainers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxvolumeMounts:- name: mypvcmountPath: "/mnt"       # 掛載共享目錄resources: {}
status: {}

數據共享測試:

# 創建
[root@k8s-master01 ~]# kubectl create -f nginx-deploy.yaml# 查看pod
[root@k8s-master01 ~]# kubectl get po
NAME                    READY   STATUS    RESTARTS   AGE
nginx-5c4f45cbc-8jr69   1/1     Running   0          80s
nginx-5c4f45cbc-cjhps   1/1     Running   0          80s# 登錄其中一個容器寫入一個數據
[root@k8s-master01 ~]# kubectl exec -it nginx-5c4f45cbc-8jr69 -- bash
root@nginx-5c4f45cbc-8jr69:/# echo "ceshi" > /mnt/test    # 驗證數據是否共享成功
[root@k8s-master01 ~]# kubectl exec -it nginx-5c4f45cbc-cjhps -- bash
root@nginx-5c4f45cbc-cjhps:/# ls /mnt/
test

5.3 在線擴容

動態存儲大部分都支持在線擴容,可以直接編輯 PVC 即可:

[root@k8s-master01 ~]# vim cfs-pvc.yaml 
[root@k8s-master01 ~]# cat cfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: cubefs-testnamespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 2GistorageClassName: cfs-scvolumeMode: Filesystem# 更新配置
[root@k8s-master01 ~]# kubectl apply -f cfs-pvc.yaml

等待一段時間即可完成擴容:

[root@k8s-master01 ~]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
cubefs-test   Bound    pvc-e4f37ba6-ebe9-48f7-bd5e-5dbe8bda0a77   2Gi        RWX            cfs-sc         <unset>                 22m

6、數據持久化實戰

6.1 MySQL 數據持久化

創建 PVC:

[root@k8s-master01 ~]# vim mysql-pvc.yaml 
[root@k8s-master01 ~]# cat mysql-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysqlnamespace: default
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: cfs-scvolumeMode: Filesystem# 創建PVC
[root@k8s-master01 ~]# kubectl create -f mysql-pvc.yaml
[root@k8s-master01 ~]# kubectl get pvc mysql
NAME    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
mysql   Bound    pvc-658e0ed8-6e9d-493d-b1f6-870df9c1b15c   5Gi        RWO            cfs-sc         <unset>                 22s

創建 Deployment:

[root@k8s-master01 ~]# vim mysql-deploy.yaml 
[root@k8s-master01 ~]# cat mysql-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: mysqlname: mysql
spec:replicas: 1selector:matchLabels:app: mysqlstrategy:type: Recreatetemplate:metadata:creationTimestamp: nulllabels:app: mysqlspec:nodeSelector:component.cubefs.io/csi: enabledvolumes:- name: datapersistentVolumeClaim:claimName: mysqlcontainers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/mysql:8.0.20name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: mysqlvolumeMounts:- name: datamountPath: "/var/lib/mysql"resources: {}
status: {}# 創建 mysql 
[root@k8s-master01 ~]# kubectl create -f mysql-deploy.yaml# 查看pod
[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS              RESTARTS   AGE
mysql-7fc554db7f-b58b4   1/1     Running             0          4m30s

寫入數據測試:

[root@k8s-master01 ~]# kubectl exec -it mysql-7fc554db7f-b58b4 -- bash
root@mysql-7fc554db7f-b58b4:/# mysql -uroot -pmysql
....
mysql> create database cubefs;
Query OK, 1 row affected (0.08 sec)mysql> create database yunwei;
Query OK, 1 row affected (0.07 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| cubefs             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yunwei             |
+--------------------+
6 rows in set (0.01 sec)

刪除 Pod 后測試數據是否還在:

[root@k8s-master01 ~]# kubectl delete po mysql-7fc554db7f-b58b4
[root@k8s-master01 ~]# kubectl exec -it mysql-7fc554db7f-dk6rx -- bash
root@mysql-7fc554db7f-b58b4:/# mysql -uroot -pmysql
....
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| cubefs             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yunwei             |
+--------------------+
6 rows in set (0.01 sec)

6.2 大模型文件持久化

CubeFS 可以支撐 AI 訓練、模型存儲及分發、IO 加速等需求,所以可以直接把 CubeFS 作為大模型的數據存儲底座。

創建 PVC:

[root@k8s-master01 ~]# vim ollama-pvc.yaml 
[root@k8s-master01 ~]# cat ollama-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ollama-datanamespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: cfs-scvolumeMode: Filesystem# 創建PVC
[root@k8s-master01 ~]# kubectl create -f ollama-pvc.yaml 
[root@k8s-master01 ~]# kubectl get pvc ollama-data
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
ollama-data   Bound    pvc-9bb055e3-10f7-4bf8-8e26-8d44c4b8fa28   10Gi       RWX            cfs-sc         <unset>                 53s

創建 Ollama 服務:

[root@k8s-master01 ~]# vim ollama-deploy.yaml 
[root@k8s-master01 ~]# cat ollama-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: ollamaname: ollama
spec:replicas: 1selector:matchLabels:app: ollamatemplate:metadata:creationTimestamp: nulllabels:app: ollamaspec:nodeSelector:component.cubefs.io/csi: enabledvolumes:- name: datapersistentVolumeClaim:claimName: ollama-datareadOnly: falsecontainers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/ollamaname: ollamaenv:- name: OLLAMA_MODELSvalue: /data/modelsvolumeMounts:- name: datamountPath: /data/modelsreadOnly: falseresources: {}
status: {}# 創建 ollama 
[root@k8s-master01 ~]# kubectl create -f ollama-deploy.yaml # 查看pod
[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
ollama-cf4978c7f-mjgv9   1/1     Running   0          30m

下載模型:

[root@k8s-master01 ~]# kubectl exec -it ollama-cf4978c7f-mjgv9 -- bash
root@ollama-cf4978c7f-mjgv9:/# ollama pull deepseek-r1:1.5b

查看模型文件:

root@ollama-cf4978c7f-mjgv9:~# ls -l /data/models/
total 0
drwxr-xr-x 7 root root 0 Aug 25 00:34 blobs
drwxr-xr-x 3 root root 0 Aug 25 00:35 manifests

啟動模型測試:

root@ollama-cf4978c7f-mjgv9:~# ollama run deepseek-r1:1.5b
>>> 介紹一下自己
<think></think>您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。有關模型和產品的詳細內容請參考官方文檔。>>> 

此博客來源于:https://edu.51cto.com/lecturer/11062970.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94478.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何拯救一家瀕臨破產的科技公司?

從谷底爬起&#xff1a;Medium 的生死重生之路 2022年的 Medium&#xff0c;正墜入一個深不見底的深淵。 每月虧損260萬美元&#xff0c;訂閱用戶持續流失——這不是增長&#xff0c;而是在消耗資本。更致命的是內容質量&#xff1a;平臺充斥著“快速致富學”等空洞內容&#x…

數據結構-算法(一)

一、已知無向圖的鄰接矩陣&#xff0c;求無向圖的鄰接表。 &#xff08;1&#xff09;提示&#xff1a;無向圖如下圖(a)所示&#xff0c;已知鄰接矩陣如圖(b)所示&#xff0c;求對應的鄰接表(c)。&#xff08;2&#xff09;請定義void adjMatrix_2_adjList(int b[4][4], AdjLis…

2025年嵌入式通信電源系統品牌有哪些?

現在科技跑得飛快&#xff0c;嵌入式通信電源系統可是越來越吃香了&#xff0c;尤其是在5G、物聯網、智能家居這些熱門地方。這玩意兒不光能讓設備穩穩當當干活兒&#xff0c;還特省電、賊聰明&#xff0c;優勢杠杠的&#xff01;既然大家伙兒都這么需要它&#xff0c;那到了20…

Ubuntu24.04環境下causal_conv1d和mamba_ssm安裝

環境&#xff1a;WSL的Ubuntu24.041.創建conda環境&#xff0c;其中python版本為3.10.132.當前conda環境依次執行下面命令&#xff1a;conda install cudatoolkit11.8 -c nvidia pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 -f https://mirrors.aliyun.com/pyto…

Python爬蟲實戰: 爬蟲常用到的技術及方案詳解

爬蟲是獲取網絡數據的重要工具,Python因其豐富的庫生態系統而成為爬蟲開發的首選語言。下面我將詳細介紹Python爬蟲的常用技術和方案。 一、基礎技術棧 1. 請求庫 Requests - 同步HTTP請求庫 import requests# 基本GET請求 response = requests.get(https://httpbin.org/g…

k8s——持久化存儲 PVC

目錄 k8s持久化存儲&#xff1a; PVC 1 k8s PV是什么&#xff1f; 2 k8s PVC是什么&#xff1f; 3 k8s PVC和PV工作原理 4 創建pod&#xff0c;使用pvc作為持久化存儲卷 ?三種回收策略詳解? 1、創建nfs共享目錄 2、如何編寫pv的資源清單文件 3、創建pv 更新資源清單文…

【系統架構設計師】數據庫設計(一):數據庫技術的發展、數據模型、數據庫管理系統、數據庫三級模式

數據庫技術是研究數據庫的結構、存儲、設計、管理和應用的一門軟件學科。 數據庫系統本質上是一個用計算機存儲信息的系統。 數據庫管理系統是位于用戶與操作系統之間的一層數據管理軟件&#xff0c;其基本目標是提供一個可以方便、有效地存取數據庫信息的環境。 數據庫就是信息…

深入理解 Structured Outputs:基于 JSON Schema 的結構化輸出實踐指南

深入理解 Structured Outputs&#xff1a;基于 JSON Schema 的結構化輸出實踐指南 目錄 引言Structured Outputs 概述應用場景與優勢核心用法&#xff1a;結構化響應的獲取功能對比&#xff1a;Structured Outputs 與 JSON 模式典型應用示例鏈式思維&#xff08;Chain of Tho…

大模型應用編排工具Dify之插件探索

1.前言 ? dify 1.x版本以后插件功能豐富了很多&#xff0c;推出的插件市場上有各式各樣的插件&#xff0c;比如 連接數據庫、連接大模型、搜索和 mcp服務等。其中&#xff0c;有一個比較大的改動&#xff0c;模型供應商不再內置&#xff0c;而是通過插件的形式提供。因此&…

ubuntu2204安裝搜狗拼音輸入法

安裝必要的軟件包 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-config-qt fcitx5-configtool -y安裝搜狗拼音 下載最新 .deb 包&#xff08;官方地址&#xff1a;https://pinyin.sogou.com/linux/&#xff09;&#xff0c;安裝&#xff1a; sudo dp…

三,設計模式-抽象工廠模式

目的 在 工廠模式 中&#xff0c;當需要創建新的產品時&#xff0c;則額外需要創建新的工廠&#xff0c;這種模式是對產品制造方法的抽象化&#xff0c;如果產品種類變多&#xff0c;則工廠數目變多&#xff0c;則代碼規模會越來越大&#xff0c;且不同的產品類的生成依賴不同…

Vue3響應式編程核心:ref與reactive全方位對比

在Vue3的Composition API中&#xff0c;ref和reactive是構建響應式數據的核心工具。許多開發者對它們的選擇存在困惑&#xff1a;何時用ref的.value&#xff1f;何時用reactive的直接訪問&#xff1f;為何解構會丟失響應性&#xff1f;本文從原理、場景到實戰陷阱&#xff0c;為…

Redis實戰-緩存的解決方案(一)

1.什么是緩存緩存就是數據交換的緩存區&#xff0c;是存儲數據的臨時區域&#xff0c;讀寫性能高。瀏覽器會有緩存&#xff0c;tomcat服務器也會有緩存&#xff0c;數據庫也會有緩存&#xff0c;CPU也會有緩存&#xff0c;磁盤也會有緩存&#xff0c;所以說緩存是無處不在的并且…

CI/CD企業案例詳解

7.持續集成持續交付企業示例 為了讓容器構建鏡像可以持續集成并自動上傳到harbor倉庫&#xff0c;業務主機通過持續交付自動從倉庫中下載鏡像最近版本并實現業務更新7.1 在jenkins中添加registry節點 7.1.1 在業務節點中安裝docker和java環境并配置其可以從倉庫中下載鏡像 # 新…

C++ 入門核心知識

一、C 課程概述與發展歷史1. 發展歷程&#xff1a;從 C 語言擴展到標準化C 的起源可追溯至 1979 年&#xff0c;由貝爾實驗室的 Bjarne Stroustrup 主導開發。當時他為解決大型項目開發中 C 語言在可維護性和擴展性上的不足&#xff0c;在 C 語言基礎上引入了面向對象編程特性。…

labelme數據標注保姆級教程:從安裝到格式轉換全流程,附常見問題避坑指南(含視頻講解)

引言&#xff1a;為什么選擇labelme&#xff1f; 在人工智能和機器學習領域&#xff0c;高質量的標注數據是訓練優秀模型的基礎。而 labelme作為一款開源、跨平臺的圖像標注工具&#xff0c;憑借其強大的功能和易用性&#xff0c;成為了數據標注領域的熱門選擇。 它支持多種標…

人工智能-python-深度學習-自動微分

自動微分&#xff1a;基礎概念與應用 自動微分&#xff08;Autograd&#xff09;是現代深度學習框架&#xff08;如PyTorch、TensorFlow&#xff09;中的一個核心功能。它通過構建計算圖并在計算圖上自動計算梯度&#xff0c;簡化了反向傳播算法的實現。以下是自動微分的基本概…

k8s原理及操作

簡介 kubernetes的本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器 進行管理。目的是實現資源管理的自動化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修復&#xff1a;一旦某一個容器崩潰&#xff0c;能夠在…

理解音頻響度:LUFS 標準及其計算實現

LUFS 及其重要性 1.1、什么是 LUFS&#xff1f; LUFS&#xff08;Loudness Units relative to Full Scale&#xff09;是音頻工程中用于測量感知響度的標準單位。它已成為廣播、流媒體和音樂制作領域的行業標準&#xff0c;用于確保不同音頻內容具有一致的響度水平。 LUFS 是 I…

【在ubuntu下使用vscode打開c++的make項目及編譯調試】

在ubuntu下使用vscode打開c的make項目及編譯調試第一步&#xff1a;安裝必要的軟件第二步&#xff1a;示例項目準備1. 創建C源文件&#xff1a; main.cpp2. 創建頭文件&#xff1a; utils.h3. 創建實現文件&#xff1a; utils.cpp第三步&#xff1a;使用 VS Code 打開項目第四步…