挂载文件存储 CFS
概述
云托管服务需要持久化存储时,可以通过挂载腾讯云文件存储 CFS 来实现。文件存储(Cloud File Storage,CFS)提供了可扩展的共享文件存储服务,基于标准的 NFS 文件系统访问协议,为多个实例提供共享的数据源,支持弹性容量和性能的扩展,现有应用无需修改即可挂载使用。
主要优势
- 数据持久化:与临时存储不同,CFS 中的数据在实例销毁后仍然保留
- 高可用高可靠:分布式文件系统架构,保障数据安全和服务可用性
- 多实例共享:所有实例可同时挂载并访问相同的存储内容,便于数据协作
- 弹性扩展:存储容量和性能可按需扩展,无需提前规划
- 无缝兼容:标准 NFS 协议,现有应用无需修改即可使用
使用场景
CFS 文件存储挂载特别适用于以下场景:
- 大数据分析:多实例并行读写同一数据集,提高处理效率
- 媒体处理:存储和处理视频、图片等大文件,支持多实例协作转码
- 内容管理:存储需要多实例共享访问的模板、配置文件等
- 日志聚合:多实例将日志写入同一目录,集中管理和分析
- 机器学习:共享训练数据集和模型文件
配置步骤
准备文件存储 CFS
- 进入 腾讯云控制台
- 在上海地域(云开发环境所在地域)准备 VPC 私有网络及子网,详情参考 VPC 产品文档
- 在上海地域创建文件存储 CFS 文件系统,确保与上一步在相同的子网中,详情参考 CFS 产品文档
配置存储挂载
-
启用私有网络
- 在云托管服务详情页面,启用「私有网络」
- 将 VPC 和子网配置为准备过程中相同的 VPC 和子网
-
启用存储挂载
- 在云托管服务详情页面,选择「存储挂载」
- 点击「启用存储挂载」,选择存储类型为「文件存储 CFS」
-
选择文件系统
- 选择「文件系统 ID」:选择为准备过程中创建的文件系统
- 选择「挂载点 ID」:选择为准备过程中创建的挂载点
- 配置「远程目录」:指定要挂载的远程目录,默认为根目录「/」
- 选择「权限」:选择读写或只读权限,默认为「读写」
-
配置挂载路径
- 实例挂载路径:指定在实例中的挂载位置,默认为「/mnt」
-
确认并保存配置
挂载路径限制
实例中以下目录不能 被挂载:/, /proc, /sys, /dev, /var/run, /app/cert
代码示例
Node.js 示例
const fs = require('fs');
const path = require('path');
// 假设 CFS 挂载在 /mnt/cfs 目录
const cfsPath = '/mnt/cfs';
// 写入文件
app.post('/upload', (req, res) => {
const fileName = `file-${Date.now()}.txt`;
const filePath = path.join(cfsPath, fileName);
fs.writeFileSync(filePath, req.body.content);
res.send(`文件已保存至: ${fileName}`);
});
// 读取文件
app.get('/files/:fileName', (req, res) => {
const filePath = path.join(cfsPath, req.params.fileName);
if (fs.existsSync(filePath)) {
const content = fs.readFileSync(filePath, 'utf8');
res.send(content);
} else {
res.status(404).send('文件不存在');
}
});
Python 示例
import os
import time
from flask import Flask, request, jsonify
app = Flask(__name__)
# 假设 CFS 挂载在 /mnt/cfs 目录
cfs_path = '/mnt/cfs'
@app.route('/upload', methods=['POST'])
def upload_file():
file_name = f"file-{int(time.time())}.txt"
file_path = os.path.join(cfs_path, file_name)
with open(file_path, 'w') as f:
f.write(request.json.get('content', ''))
return jsonify({"message": f"文件已保存至: {file_name}"})
@app.route('/files/<file_name>', methods=['GET'])
def get_file(file_name):
file_path = os.path.join(cfs_path, file_name)
if os.path.exists(file_path):
with open(file_path, 'r') as f:
content = f.read()
return content
else:
return jsonify({"error": "文件不存在"}), 404
注意事项及最佳实践
性能考量
- 缓存策略:频繁访问的文件考虑先缓存到内存或临时存储
- 批量操作:尽量批量读写文件,减少 I/O 操作次数
- 文件大小:对于大文件操作,考虑分片处理
多实例协作
- 路径隔离:不同实例操作时,建议使用唯一标识(如实例 ID)创建子目录
- 文件锁:读写共享文件时,实现适当的锁机制避免冲突
- 原子操作:使用原子重命名等技术确保文件操作的完整性
// 安全的文件更新示例(Node.js)
const fs = require('fs').promises;
const path = require('path');
async function safelyUpdateFile(filePath, newContent) {
const tempPath = `${filePath}.tmp`;
// 先写入临时文件
await fs.writeFile(tempPath, newContent);
// 原子性地重命名替换原文件
await fs.rename(tempPath, filePath);
}
安全性
- 权限控制:合理设置 CFS 的访问权限,遵循最小权限原则
- 敏感数据:避免存储未加密的敏感信息
- 安全组配置:确保安全组规则仅允许必要的网络访问