#作者:闫乾苓
3.2.3设置文件存储
启动文件管理器服务filer,可以提供基于浏览器的文件上传,下载等文件存储管理服务。默认使用leveldb2存储通过filer上传的文件的元数据。
为实现服务高可用,避免单点故障,可以在不同的集群节点启动多个filer服务:
节点:192.168.61.71
nohup /opt/seaweedfs/sbin/weed filer -ip=192.168.61.71 -master=192.168.61.71:9333,192.168.61.72:9333,192.168.61.73:9333 -dataCenter=dc1 -rack=rack1 -defaultReplicaPlacement=002 -defaultStoreDir=/opt/seaweedfs/filer/data >> /opt/seaweedfs/filer/logs/filer.log 2>&1 &
节点:192.168.61.72
nohup /opt/seaweedfs/sbin/weed filer -ip=192.168.61.72 -master=192.168.61.71:9333,192.168.61.72:9333,192.168.61.73:9333 -dataCenter=dc1 -rack=rack1 -defaultReplicaPlacement=002 -defaultStoreDir=/opt/seaweedfs/filer/data >> /opt/seaweedfs/filer/logs/filer.log 2>&1 &
节点:192.168.61.73
nohup /opt/seaweedfs/sbin/weed filer -ip=192.168.61.73 -master=192.168.61.71:9333,192.168.61.72:9333,192.168.61.73:9333 -dataCenter=dc1 -rack=rack1 -defaultReplicaPlacement=002 -defaultStoreDir=/opt/seaweedfs/filer/data >> /opt/seaweedfs/filer/logs/filer.log 2>&1 &
参数:
- -defaultReplicaPlacement=002
设置文件的副本数为2
如果filer服务启动时设置改副本策略参数,直接使用该参数
如果请求中没有副本策略参数,使用 Master 自己的默认配置。 - -defaultStoreDir
此参数来指定元数据存储filerldb2 的目录
注意:Filer 第一次启动时不会自动扫描已存在于 Volume 服务器上的文件
通过 weed upload -dir=“/home/weed/seaweedfs_upload_test” 方式上传的文件是直接存储到 Volume 服务器的,这种方式绕过了 Filer 的元数据管理系统。Filer 维护自己独立的元数据存储系统。当 Filer 启动时,它会初始化元数据存储后端,Filer 只能看到通过自己处理的文件上传请求,这些请求会在元数据存储中创建相应的条目。
浏览器访问filer服务的webUI并上传文件
3个节点的元数据自动互相同步。
3.2.4 设置S3服务
S3 Gateway 实际上是作为 filer 的一个前端接口工作的。当您通过 S3 API 上传文件时,S3 服务会将这些操作转换为对 filer 的调用,S3 Gateway 会将请求转发给 filer。
SeaweedFS 的 S3 配置文件是一个 JSON 格式的文件,用于定义身份认证和权限管理。
3.2.4.1 生成 s3.json 的方法
根据下面的格式,可以手动创建一个 s3.json 文件:
{
"identities": [
{
"name": "admin",
"credentials": [
{
"accessKey": "mykey",
"secretKey": "mysecret"
}
],
"actions": [
"Admin",
"Read",
"Write"
],
"account": null
}
],
"accounts": []
}
配置文件的权限说明
- Admin: 管理员权限
- Read: 读取权限
- Write: 写入权限
- List: 列表权限
- Tagging: 标签权限
配置文件的加载
S3 服务启动时会加载配置文件,通过 -config 参数指定
3.2.4.2 启动S3 服务
启动多个实例来实现高可用。基于您已经部署的 3 个 filer 节点,您可以在每个节点或其他节点上启动多个 S3 Gateway 实例。
创建相关目录
mkdir s3/{logs,conf} -p
节点1上启动 S3 服务
nohup /opt/seaweedfs/sbin/weed s3 -filer=192.168.61.71:8888 -port=8333 -ip.bind=192.168.61.71 -config=/opt/seaweedfs/s3/conf/s3.json >> /opt/seaweedfs/s3/logs/s3.log 2>&1 &
节点2上启动 S3 服务
nohup /opt/seaweedfs/sbin/weed s3 -filer=192.168.61.72:8888 -port=8333 -ip.bind=192.168.61.72 -config=/opt/seaweedfs/s3/conf/s3.json >> /opt/seaweedfs/s3/logs/s3.log 2>&1 &
节点3上启动 S3 服务
nohup /opt/seaweedfs/sbin/weed s3 -filer=192.168.61.73:8888 -port=8333 -ip.bind=192.168.61.73 -config=/opt/seaweedfs/s3/conf/s3.json >> /opt/seaweedfs/s3/logs/s3.log 2>&1 &
3.2.4.3 使用awscli客户端工具连接seaweedfs s3
AWS CLI官方命令行工具,功能最全面,兼容性最好
安装:
~# pip install awscli
~# aws --version
aws-cli/1.40.35 Python/3.9.9 Linux/5.10.0-153.24.0.100.6.oe2203sp2.bclinux.x86_64 botocore/1.38.36
配置:
~# aws configure
AWS Access Key ID [None]: mykey
AWS Secret Access Key [None]: mysecret
Default region name [None]: us-east-1
Default output format [None]: json
常见操作命令:
设置自定义端点(指向您的 SeaweedFS S3 服务)
export AWS_ENDPOINT_URL=http://192.168.61.71:8333
列出所有 bucket
aws s3 ls
创建 bucket
aws s3 mb s3://my-bucket
上传文件
aws s3 cp local-file.txt s3://my-bucket/
aws s3 cp /path/to/local/file s3://my-bucket/remote-file.txt
下载文件
aws s3 cp s3://my-bucket/file.txt ./
aws s3 cp s3://my-bucket/remote-file.txt /path/to/local/
创建目录,在 S3 中,目录实际上是通过对象键(object key)的前缀来模拟的。
创建一个以 / 结尾的空对象来表示目录
aws s3api put-object --bucket my-bucket --key my-directory/
同步目录
aws s3 sync /local/directory s3://my-bucket/
aws s3 sync s3://my-bucket/ /local/directory
列出 bucket 内容
aws s3 ls s3://my-bucket/
aws s3 ls s3://my-bucket/folder/ --recursive
删除文件
aws s3 rm s3://my-bucket/file.txt
删除 bucket(必须为空)
aws s3 rb s3://my-bucket
删除 bucket 及其所有内容
aws s3 rb s3://my-bucket --force
通过filer web界面查看通过s3上传的文件:
3.2.5 SeaweedFS FUSE挂载功能
SeaweedFS 的 FUSE (Filesystem in Userspace) 功能允许将 SeaweedFS 挂载为本地文件系统,使应用程序可以像访问本地文件一样访问 SeaweedFS 中的文件。
3.2.5.1 FUSE 挂载命令和参数
基本的挂载命令格式如下:
weed mount -filer=<filer_host:filer_port> -cacheCapacityMB=xxx -chunkSizeLimitMB=4 -dir=mount_point_dir
核心参数详解
- -filer: 指定 filer 服务器地址,默认为 localhost:8888
- -dir: 本地挂载点目录
- -cacheCapacityMB: 文件块读取缓存容量(MB),默认为 128MB。采用分层缓存(内存 + 磁盘),当 cacheCapacityMB > 0 时,系统会创建分层缓存,包括内存缓存和磁盘缓存。
- -chunkSizeLimitMB: 本地写入缓冲区大小,也是大文件分块大小,默认 2MB
- -replication: 文件复制级别,会覆盖 filer 和 master 的默认设置
- -volumeServerAccess: 卷服务器访问方式,支持 direct、publicUrl、filerProxy
- direct: 直接访问卷服务器
- filerProxy: 通过 filer 代理访问卷服务器,适用于卷服务器不对外暴露的场景
- publicUrl :用卷服务器的公共 URL 地址来直接访问卷服务器,适用于需要通过特定网络路径访问卷服务器的场景,比如:FUSE 客户端与 SeaweedFS 集群之间存在 NAT 或防火墙,负载均衡器地址,不在同一个数据中心,需要通过专线或公网进行跨数据中心访问。
publicUrl 模式提供了更直接的数据访问路径,可能具有更好的性能,但要求卷服务器的公共地址对 FUSE 客户端可达。这与 direct 模式类似,但使用的是专门配置的公共地址而不是内部地址。
3.2.5.2 FUSE 挂载流程
- 连接验证: 尝试连接 filer 并获取配置
- 参数验证: 检查 chunkSizeLimitMB 等参数的合理性
- 权限检查: 验证挂载权限和目录可用性
创建 SeaweedFileSystem 实例:
系统会根据配置参数创建文件系统实例,包括缓存配置、权限映射等。
3.2.5.3高级配置选项
SeaweedFS 的 FUSE 实现提供了完整的 POSIX 文件系统接口,支持标准的文件操作,同时通过缓存和代理机制优化了性能和网络访问。
缓存配置
- -cacheDirForRead: 读缓存目录,默认为系统临时目录
- -cacheDirForWrite: 写缓存目录
- -cacheMetaTtlSec: 元数据缓存有效期,默认 60 秒
权限和安全
- -allowOthers: 允许其他用户访问文件系统
- -umask: 文件权限掩码
- -readOnly: 只读模式
性能调优
- -concurrentWriters: 并发写入协程数,默认 32
- -dataCenter: 优先访问的数据中心
3.2.5.4实际使用示例
允许普通用户挂载 FUSE 文件系统,并且让其他用户访问挂载结果
编辑 /etc/fuse.conf,取消user_allow_other,否则使用普通用户无法启动mount.
启用 allow_other 会让所有用户都能访问挂载的文件系统,如果没有设置合理的权限或做隔离控制,可能会造成数据泄露或系统风险。
在开放 user_allow_other 前应充分评估:
- FUSE 文件系统的类型和用途
- 宿主机的用户管理策略
- 是否需要配合使用 umask, gid, uid 等挂载选项进行访问控制
nohup /opt/seaweedfs/sbin/weed mount -filer=“192.168.61.71:8888,192.168.61.72:8888,192.168.61.73:8888” -dirAutoCreate -dir=/home/weed/seaweedfs -cacheCapacityMB=100 -concurrentWriters=128 >> /opt/seaweedfs/filer/logs/s3.log 2>&1 &
注意事项
- 权限要求: FUSE 挂载通常需要特殊权限,在容器环境中需要 SYS_ADMIN 能力
- 缓存策略: 合理配置缓存大小可以显著提升性能
- 网络访问: volumeServerAccess=filerProxy 适用于卷服务器不对外暴露的生产环境
查看挂载:
可以正常看到之前上传测试的文件,通过linux命令行创建文件、目录都正常。
关闭时需要先停止FUSE 挂载进程,再umont挂载的目录。否则会有如下报错提示:
3.2.5.5SeaweedFS FUSE 挂载适合的场景 - 静态文件存储:图片、视频、文档等
- 备份存储:数据库备份文件的存储
- 日志文件:应用程序日志的存储
- 开发环境:非生产环境的文件共享