- 存储
- 分布式文件系统
- 对象存储
- 云原生
【免费下载链接】cubefs
cloud-native distributed storage
本文以 CubeFS 官方集群部署文档为主线,完整讲解如何通过make build编译出cfs-server/cfs-client,并依次部署 Master、MetaNode、DataNode、ObjectNode、LcNode、FlashNode 六个服务组件(含可选的纠删码子系统),最终组合出一套可用于生产的高可用分布式存储集群。读完本文,你将掌握每个节点的 JSON 配置逐字段含义、端口规划、磁盘准备流程,以及集群搭建中最常见的三类故障(内存不足、端口占用、FUSE 挂载失败)的定位与解决手段。
一、部署前准备:编译构建与依赖环境
1.1 获取源码并编译
CubeFS 使用 Makefile 组织构建,一条命令即可同时编译服务端、客户端及相关依赖:
$ git clone https://gitcode.com/gh_mirrors/cu/cubefs $ cd cubefs $ make build从仓库根目录的 Makefile 可以看到,build目标实际串联了server、authtool、client、cli、libsdk、fsck、fdstore、bcache、blobstore、deploy等多个子目标。构建成功后,在build/bin目录下会生成核心可执行文件:
cfs-server:统一的服务端入口,通过-c参数加载不同角色的 JSON 配置文件,即可启动 Master、MetaNode、DataNode、ObjectNode、LcNode、FlashNode 等任意角色;cfs-client:FUSE 客户端,用于将卷挂载到本地目录;- 此外还会生成
cfs-cli(命令行管理工具)以及 blobstore 子系统的系列二进制。
1.2 依赖环境清单
部署前建议先核对以下依赖(详见 部署依赖说明):
| 依赖 | 版本要求 | 是否必需 |
|---|---|---|
| gcc-c++ | 4.8.5 及以上 | 是 |
| CMake | 3.1 及以上 | 是 |
| bzip2-devel | 1.0.6 及以上 | 是 |
| zlib-devel | 1.2.7 及以上 | 是 |
| mvn | 3.8.4 及以上 | 是 |
| Go | 1.17 及以上 | 是 |
| kafka | 1.x 及以上 | 仅部署纠删码子系统时需要 |
| consul | 1.1x 及以上 | 仅部署纠删码子系统时需要 |
1.3 理解 cfs-server 的启动机制
cfs-server的行为由 cmd/cmd.go 定义:它通过flag解析-c(配置文件路径)、-f(前台运行)、-v(打印版本)、-redirect-std(是否将标准输出重定向到日志文件)等参数;随后读取配置文件,根据其中的role字段做模块分发:
master→master.NewServer()metanode→metanode.NewServer()datanode→datanode.NewServer()objectnode→objectnode.NewServer()lcnode→lcnode.NewServer()flashnode→flashnode.NewFlashNode()
也就是说,所有服务节点共用一个二进制,靠配置文件里的role区分身份,这极大简化了部署物管理。默认情况下进程会以守护进程方式运行(先 fork 出子进程再以-f重新执行),日志级别支持debug / info / warn / error / critical,默认error。
二、整体架构与端口规划
集群模式下,各角色通过 Master 的 Raft 组互相发现并协同。官方建议 Master、MetaNode、DataNode 均至少部署 3 个实例以保证高可用。为便于后续配置,先给出各角色的默认端口规划:
| 角色 | 业务监听 (listen) | pprof 调试 (prof) | Raft 心跳端口 | Raft 数据端口 |
|---|---|---|---|---|
| master | 17010 | 17020 | 5901(默认,可配) | 5902(默认,可配) |
| metanode | 17210 | 17220 | 17230 | 17240 |
| datanode | 17310 | 17320 | 17330 | 17340 |
| objectnode | 17410 | — | — | — |
| lcnode | 17510 | — | — | — |
| flashnode | 18510 | 18511 | — | — |
三、安装 Master
Master 是集群的元数据中心与调度核心,负责卷管理、数据分片(DataPartition/MetaPartition)分配、节点心跳与故障检测。启动方式:
./cfs-server -c master.json官方推荐至少启动 3 个 Master 实例组成 Raft 组。示例master.json:
{ "role": "master", "ip": "127.0.0.1", // 替换为宿主机 IP "listen": "17010", "prof":"17020", "id":"1", // 替换为对应的节点 ID(1/2/3) "peers": "1:127.0.0.1:17010,2:127.0.0.2:17010,3:127.0.0.3:17010", "retainLogs":"20000", "logDir": "/cfs/master/log", // Master 日志目录 "logLevel":"info", "walDir":"/cfs/master/data/wal", // Raft WAL 日志目录 "storeDir":"/cfs/master/data/store", // RocksDB 数据存储目录 "consulAddr": "http://consul.prometheus-cfs.local", "clusterName":"cubefs01", "metaNodeReservedMem": "1073741824" // 元数据节点保留内存,1G }peers是 Raft 组成员信息,格式为id:ip:port,多个成员用逗号分隔,三台机器的id应分别为 1、2、3,且listen端口保持一致。storeDir目录必须预先存在,否则服务无法启动。
3.1 Master 配置参数全表
以下是 Master 详细配置 中列出的完整参数(均为 JSON 字符串/布尔格式):
| 配置项 | 类型 | 说明 | 必填 | 默认值 |
|---|---|---|---|---|
| role | string | 进程角色,只能是 master | 是 | |
| ip | string | 主机 IP 地址 | 是 | |
| listen | string | HTTP 服务监听端口 | 是 | |
| prof | string | Golang pprof 端口 | 是 | |
| id | string | 区分不同的 Master 节点 | 是 | |
| peers | string | Raft 复制组成员信息 | 是 | |
| logDir | string | 日志存放目录 | 是 | |
| logLevel | string | 日志级别 | 否 | error |
| retainLogs | string | 保留多少条 Raft 日志 | 是 | |
| walDir | string | Raft WAL 日志目录 | 是 | |
| storeDir | string | RocksDB 数据目录,目录必须存在,否则无法启动 | 是 | |
| clusterName | string | 集群名称 | 是 | |
| ebsAddr | string | 纠删码子系统地址,使用纠删码卷时必须配置 | 否 | |
| exporterPort | int | Prometheus 采集监控数据的端口 | 否 | |
| consulAddr | string | Consul 注册地址,供 Prometheus exporter 使用 | 否 | |
| metaNodeReservedMem | string | 元数据节点保留内存大小(字节) | 否 | 1073741824 |
| heartbeatPort | string | Raft 心跳通信端口 | 否 | 5901 |
| replicaPort | string | Raft 数据传输端口 | 否 | 5902 |
| nodeSetCap | string | NodeSet 容量 | 否 | 18 |
| missingDataPartitionInterval | string | 超过该时间未收到心跳则副本视为丢失(秒) | 否 | 24h |
| dataPartitionTimeOutSec | string | 超过该时间未收到心跳则副本视为不存活(秒) | 否 | 10min |
| numberOfDataPartitionsToLoad | string | 单次检查的最大数据分片数量 | 否 | 40 |
| secondsToFreeDataPartitionAfterLoad | string | 加载完成后多少秒开始释放数据分片任务占用的内存 | 否 | 300 |
| tickInterval | string | 心跳与选举超时检查的定时器间隔(毫秒) | 否 | 500 |
| electionTick | string | 选举超时前定时器重置次数 | 否 | 5 |
| bindIp | bool | 是否只监听宿主机 IP | 否 | false |
| faultDomain | bool | 是否启用故障域 | 否 | false |
| faultDomainBuildAsPossible | bool | 可用故障域少于预期时是否仍尽量构建 nodeSetGroup | 否 | false |
| faultDomainGrpBatchCnt | string | 可用故障域数量 | 否 | 3 |
| dpNoLeaderReportIntervalSec | string | 数据分片无 Leader 时的上报间隔(秒) | 否 | 60 |
| mpNoLeaderReportIntervalSec | string | 元数据分片无 Leader 时的上报间隔(秒) | 否 | 60 |
| maxQuotaNumPerVol | string | 每个卷的最大配额数量 | 否 | 100 |
| volForceDeletion | bool | 非空卷是否可直接删除 | 否 | true |
| volDeletionDentryThreshold | int | 非空卷不可直接删除时,dentry 数小于等于该阈值才可删除 | 否 | 0 |
| enableLogPanicHook | bool | (实验性)在执行 panic 前挂钩刷新日志 | 否 | false |
| enableDirectDeleteVol | bool | 控制是否支持延迟删卷,true 时直接删除 | 否 | true |
| raftPartitionCanUseDifferentPort | bool | 数据/元数据分片是否可使用不同的 raft 心跳与复制端口,用于单机多节点部署 | 否 | false |
| allowMultipleReplicasOnSameMachine | bool | 数据/元数据分片副本是否可位于同一台机器 | 否 | true |
其中metaNodeReservedMem(默认 1G)是一个跨节点约束项:MetaNode 的totalMem必须大于该值,部署 MetaNode 时需留意。
四、安装 MetaNode
MetaNode 负责文件系统元数据的存储与管理(inode、dentry、扩展属性等),启动方式:
./cfs-server -c metanode.json官方推荐至少启动 3 个 MetaNode 实例以保证元数据高可用。示例metanode.json:
{ "role": "metanode", "listen": "17210", "prof": "17220", "logLevel": "info", "metadataDir": "/cfs/metanode/data/meta", // 元数据快照存储目录 "logDir": "/cfs/metanode/log", // Metanode 日志目录 "raftDir": "/cfs/metanode/data/raft", "raftHeartbeatPort": "17230", "raftReplicaPort": "17240", "totalMem": "8589934592", // 最大可用内存,必须大于 Master 的 metaNodeReservedMem "consulAddr": "http://consul.prometheus-cfs.local", "exporterPort": 9501, "masterAddr": [ "127.0.0.1:17010", "127.0.0.2:17010", "127.0.0.3:17010" ] }4.1 MetaNode 配置参数全表
| 配置项 | 类型 | 说明 | 必填 |
|---|---|---|---|
| role | string | 进程角色:metanode | 是 |
| listen | string | 监听并接受请求的端口 | 是 |
| prof | string | 调试与管理员 API 接口端口 | 是 |
| logLevel | string | 日志级别,默认 error | 否 |
| metadataDir | string | 元数据快照存储目录 | 是 |
| logDir | string | 日志存储目录 | 是 |
| raftDir | string | Raft WAL 日志存储目录 | 是 |
| raftHeartbeatPort | string | Raft 心跳通信端口 | 是 |
| raftReplicaPort | string | Raft 数据传输端口 | 是 |
| consulAddr | string | Prometheus 注册接口 | 否 |
| exporterPort | string | Prometheus 采集监控数据的端口 | 否 |
| masterAddr | string slice | Master 服务地址列表 | 是 |
| totalMem | string | 最大可用内存(字节),必须大于 Master 配置中的 metaNodeReservedMem | 是 |
| memRatio | string | 最大可用内存占宿主机总内存的比例,配置后计算值会覆盖 totalMem | 否 |
| localIP | string | 本机 IP,不指定时使用与 Master 通信的 IP | 否 |
| bindIp | bool | 是否只监听 localIP,默认 false | 否 |
| zoneName | string | 指定可用区,默认分配到 default 区 | 否 |
| deleteBatchCount | int64 | 单次批量删除的 inode 数量,默认 500 | 否 |
| tickInterval | float64 | Raft 心跳与选举超时检查间隔(毫秒),默认 300 | 否 |
| raftRecvBufSize | int | Raft 接收缓冲区大小(字节),默认 2048 | 否 |
| nameResolveInterval | int | Raft 节点地址解析间隔(分钟),取值 [1-60],默认 1 | 否 |
4.2 MetaNode 的重要约束
详见 MetaNode 详细配置 的注意事项:
listen、raftHeartbeatPort、raftReplicaPort三个端口在程序首次配置启动后不可修改;- 相关配置信息记录在
metadataDir目录下的constcfg文件中,如需强制修改,必须手动删除该文件; - 这三个端口与 MetaNode 在 Master 中的注册信息相关,一旦修改,Master 将无法再定位到修改前的 MetaNode 信息。
五、安装 DataNode
DataNode 负责数据分片的实际存储与副本复制。官方建议使用独立磁盘作为数据目录,并配置多块磁盘以获得更高性能。
5.1 磁盘准备
查看机器磁盘信息,选择 CubeFS 要使用的磁盘:
fdisk -l格式化磁盘,建议格式化为 XFS:
mkfs.xfs -f /dev/sdx创建挂载目录:
mkdir /data0挂载磁盘:
mount /dev/sdx /data0
5.2 启动 DataNode
./cfs-server -c datanode.json官方推荐至少启动 3 个 DataNode 实例。示例datanode.json:
{ "role": "datanode", "listen": "17310", "prof": "17320", "logDir": "/cfs/datanode/log", "logLevel": "info", "raftHeartbeat": "17330", "raftReplica": "17340", "raftDir":"/cfs/datanode/log", "consulAddr": "http://consul.prometheus-cfs.local", "exporterPort": 9502, "mediaType": 1, // datanode 磁盘类型,1 表示 SSD,2 表示 HDD "masterAddr": [ "127.0.0.1:17010", "127.0.0.2:17010", "127.0.0.3:17010" ], "disks": [ "/data0:10737418240", // 磁盘挂载路径:保留空间(字节) "/data1:10737418240" ] }disks数组的每个元素格式为磁盘挂载路径:保留空间,即除保留空间外的其余容量都交给 CubeFS 使用。
5.3 DataNode 配置参数全表
| 配置项 | 类型 | 说明 | 必填 |
|---|---|---|---|
| role | string | 角色必须配置为 datanode | 是 |
| listen | string | DataNode 作为服务端启动 TCP 监听的端口 | 是 |
| localIP | string | DataNode 作为服务端使用的 IP | 否 |
| prof | string | DataNode 提供 HTTP 接口的端口 | 是 |
| logDir | string | 调试日志存放路径 | 是 |
| logLevel | string | 日志级别,默认 error | 否 |
| raftHeartbeat | string | Raft 节点间心跳端口 | 是 |
| raftReplica | string | Raft 日志传输端口 | 是 |
| raftDir | string | Raft 调试日志存放路径,默认在二进制启动路径下 | 否 |
| consulAddr | string | 监控系统地址 | 否 |
| exporterPort | string | 监控系统端口 | 否 |
| masterAddr | string slice | 集群管理器(Master)地址 | 是 |
| zoneName | string | 指定可用区,默认 default 区 | 否 |
| diskReadIocc | int | 每块磁盘读并发 IO 频率限制,小于等于 0 不限制 | 否 |
| diskReadFlow | int | 每块磁盘读 IO 流量限制,小于等于 0 不限制 | 否 |
| diskWriteIocc | int | 每块磁盘写并发 IO 频率限制,小于等于 0 不限制 | 否 |
| diskWriteFlow | int | 每块磁盘写 IO 流量限制,小于等于 0 不限制 | 否 |
| disks | string slice | 格式:磁盘挂载路径:保留空间,保留空间配置范围为 [20G,50G] | 是 |
| diskCurrentLoadDpLimit | int | 单盘当前加载的数据分片最大数量 | 否 |
| diskCurrentStopDpLimit | int | 单盘当前停止的数据分片最大数量 | 否 |
| enableLogPanicHook | bool | (实验性)panic 前刷新日志 | 否 |
| diskAsyncQosEnable | bool | 异步 IO 限制开关 | 否 |
| diskAsyncReadFlow / diskAsyncReadIocc | int | 每块磁盘异步读流量 / 并发频率限制,≤0 不限制 | 否 |
| diskAsyncWriteFlow / diskAsyncWriteIocc | int | 每块磁盘异步写流量 / 并发频率限制,≤0 不限制 | 否 |
| diskDeleteIocc / diskDeleteIops | int | 每块磁盘删除操作并发频率 / IOPS 限制 | 否 |
5.4 DataNode 的重要约束
与 MetaNode 类似(见 DataNode 详细配置):listen、raftHeartbeat、raftReplica首次启动后不可修改;相关配置记录在raftDir目录下的constcfg文件中,强制修改需手动删除该文件。
六、安装 Object Gateway(可选)
ObjectNode 是 S3 兼容的对象存储网关。仅当需要使用对象存储服务时才需要部署。
./cfs-server -c objectnode.json示例objectnode.json:
{ "role": "objectnode", "domains": [ "object.cfs.local" ], "listen": "17410", "masterAddr": [ "127.0.0.1:17010", "127.0.0.2:17010", "127.0.0.3:17010" ], "logLevel": "info", "logDir": "/cfs/Logs/objectnode" }配置参数说明(详见 ObjectNode 详细配置):
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
| role | string | 进程角色,必须为 objectnode | 是 |
| listen | string | HTTP 服务监听端口,格式PORT,默认 80 | 是 |
| domains | string slice | 配置 S3 兼容接口的域名,用于支持 DNS 风格访问资源,格式DOMAIN | 否 |
| logDir | string | 日志存放路径 | 是 |
| logLevel | string | 日志级别,默认 error | 否 |
| masterAddr | string slice | 格式HOST:PORT,即 Master 地址列表 | 是 |
| exporterPort | string | Prometheus 采集监控数据的端口 | 否 |
| prof | string | 调试与管理员 API 接口 | 是 |
七、安装 Lcnode(可选)
LcNode 负责数据迁移与生命周期管理(例如将冷数据按策略迁移到低频/归档存储)。仅当需要使用数据迁移能力时才需要部署。
./cfs-server -c lifecycle.json示例lifecycle.json:
{ "role": "lcnode", "listen": "17510", "masterAddr": [ "127.0.0.1:17010", "127.0.0.2:17010", "127.0.0.3:17010" ], "logLevel": "info", "logDir": "/cfs/Logs/lcnode" }配置参数说明(详见 LcNode 详细配置):
| 参数 | 类型 | 说明 | 必填 | 默认值 |
|---|---|---|---|---|
| role | string | 进程角色,必须为 lcnode | 是 | |
| listen | string | HTTP 服务监听端口,格式PORT | 是 | 80 |
| logDir | string | 日志存放路径 | 是 | |
| logLevel | string | 日志级别 | 否 | error |
| masterAddr | string slice | Master 地址列表(HOST:PORT) | 是 | |
| prof | string | 调试与管理员 API 接口 | 否 | |
| lcScanRoutineNumPerTask | int | 文件迁移并发数 | 否 | 20 |
| lcScanLimitPerSecond | int | 文件迁移 QPS 限制 | 否 | 0(不限制) |
| delayDelMinute | int | 文件迁移后源数据的保留时长(分钟) | 否 | 1440 |
| useCreateTime | bool | 是否使用文件创建时间判定过期;默认使用文件访问时间 | 否 | false |
八、安装 FlashNode(可选)
FlashNode 是缓存加速节点,为文件读提供集群级加速。如果文件读取不需要缓存或集群加速,可省略该组件。
./cfs-server -c flashnode.json示例flashnode.json:
{ "role": "flashnode", "listen": "18510", "prof": "18511", "logDir": "./logs", "masterAddr": [ "127.0.0.1:17010", "127.0.0.2:17010", "127.0.0.3:17010" ], "readRps": 100000, "disableTmpfs": true, "diskDataPath": [ "/path/data1:0" ], "zoneName":"default" }配置参数说明(详见 FlashNode 详细配置):
| 配置项 | 类型 | 说明 | 必填 | 默认值 |
|---|---|---|---|---|
| role | string | 进程角色,只能是 flashnode | 是 | |
| listen | string | TCP 服务监听端口 | 是 | |
| prof | string | Golang pprof 端口 | 否 | |
| logDir | string | 日志存放目录 | 是 | |
| logLevel | string | 日志级别 | 否 | error |
| masterAddr | string slice | Master 服务地址 | 是 | |
| disableTmpfs | bool | 使用磁盘代替 tmpfs 挂载;默认 false 表示默认启用 tmpfs | 否 | false |
| memTotal | int | 内存模式下用于缓存数据的内存大小 | 是 | |
| cachePercent | float | 内存模式下指定用于缓存的系统内存百分比;磁盘模式下指定磁盘空间百分比 | 否 | 1.0 |
| readRps | int | FlashNode 的 RPS 值,用于限流 | 是 | |
| diskDataPath | string slice | 磁盘模式下,磁盘路径及该磁盘分配的缓存容量 | 是 | |
| zoneName | string | 按可用区组织管理 FlashNode,CLI 支持按区删除节点 | 是 | |
| lruCapacity | int | LRU 缓存可容纳的最大条目(key)数 | 否 | 400000 |
九、安装纠删码子系统(可选)
仅当需要使用纠删码(Erasure Coding)卷时才需要部署。CubeFS 的纠删码子系统即 Blobstore,由 access、clustermgr、proxy、scheduler、blobnode 等模块组成,模块之间存在依赖关系,需要按序部署。完整部署流程请参阅 使用纠删码存储系统;注意部署纠删码子系统前需提前准备好 kafka 与 consul 依赖。
十、常见问题排查(FAQ)
10.1 内存不足(bad totalMem config)
启动 MetaNode 时可能出现如下错误:
err(readFromProcess: sub-process: [cmd.go 323] Fatal: failed to start the CubeFS metanode daemon err bad totalMem config,Recommended to be configured as 80 percent of physical machine memory原因与解决:totalMem配置不合理。官方建议将metanode.json中的totalMem调整为物理机内存的 80% 左右,且必须大于 Master 配置中的metaNodeReservedMem。
10.2 端口被占用
err(readFromProcess: sub-process: [cmd.go 311] cannot listen pprof 17320 err listen tcp :17320: bind: address already in use解决:杀掉占用该端口的进程(通常是之前启动失败的残留节点),再重新启动服务。由于listen、raftHeartbeat、raftReplica等端口首次启动后不可随意修改,务必保证端口规划稳定。
10.3 FUSE 客户端挂载失败
挂载时出现:
# Mount failed err(readFromProcess: sub-process: [fuse.go 438] mount failed: fusermount: exec: "fusermount": executable file not found in $PATH)排查步骤:
先检查 FUSE 是否已安装:
$ rpm –qa|grep fuse $ yum install fuse如果 FUSE 已安装但仍挂载失败,请参考 FUSE 客户端问题排查 逐项定位,常见原因还包括:挂载目录不存在、挂载点非空、挂载点处于 "Transport endpoint is not connected" 残留状态、配置文件中 Master 地址或卷名不正确等。
十一、部署后的下一步:创建卷并挂载验证
集群各节点启动成功后,即可用cfs-cli创建卷、用cfs-client挂载验证。完整验证步骤见 快速验证,核心流程如下:
- 准备
~/.cfs-cli.json(包含masterAddr与timeout),执行./build/bin/cfs-cli volume create ltptest ltptest创建卷; - 编写客户端配置(见 客户端配置),其中
volName与owner必须与创建卷时一致; - 执行
./build/bin/cfs-client -c client.conf启动客户端,用df -h检查挂载点是否出现类似cubefs-ltptest ... /home/cfs/client/mnt的记录,出现即表示挂载成功。
至此,一套由 Master + MetaNode + DataNode 组成、可按需扩展 ObjectNode / LcNode / FlashNode / 纠删码子系统的 CubeFS 集群模式部署即告完成。
- 存储
- 分布式文件系统
- 对象存储
- 云原生
【免费下载链接】cubefs
cloud-native distributed storage
相关推荐
从单节点到高可用:Langflow集群部署全攻略
从单节点到高可用:Langflow集群部署全攻略 你是否遇到过Langflow单节点部署在高并发下崩溃?是否担心服务中断影响业务运行?本文将带你通过Docker
人工智能大模型AI AgentRAG后端前端MCP 服务工作流自动化CubeFS 集群模式部署完全指南:从编译构建到各角色节点上线
CubeFS 集群模式部署完全指南:从编译构建到各角色节点上线 本篇指南以 CubeFS 官方文档《集群模式》为核心脉络,完整讲解多节点生产集群的部署流程:从
存储分布式文件系统对象存储云原生CVAT 计算机视觉标注工具:3 步部署你的第一个图像、视频与 3D 标注平台
CVAT 计算机视觉标注工具:3 步部署你的第一个图像、视频与 3D 标注平台 CVAT(Computer Vision Annotation Tool)是一个
数据标注计算机视觉数据集AI 应用后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考