云原生存储:对象存储与分布式文件系统
大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊云原生存储这个重要话题。作为一个全栈开发者,存储是应用架构中不可或缺的一部分。今天就来分享一下对象存储和分布式文件系统的实战经验。
云原生存储概述
存储类型对比
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 对象存储 | 海量、低成本、高可用 | 图片、视频、备份 |
| 分布式文件系统 | POSIX兼容、高性能 | 大数据、AI训练 |
| 块存储 | 低延迟、高性能 | 数据库、虚拟机 |
核心特性
高可用性 → 多副本、自动故障转移
弹性扩展 → 按需扩容
数据安全 → 加密、权限控制
低成本 → 按需付费
对象存储
AWS S3
javascript
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY
});
async function uploadFile(file) {
const params = {
Bucket: 'my-bucket',
Key: file.name,
Body: file.data,
ContentType: file.type,
ACL: 'public-read'
};
const result = await s3.upload(params).promise();
return result.Location;
}
async function getFile(key) {
const params = {
Bucket: 'my-bucket',
Key: key
};
const result = await s3.getObject(params).promise();
return result.Body;
}
Cloudflare R2
javascript
const { R2 } = require('@cloudflare/r2');
const r2 = new R2({
accountId: process.env.CLOUDFLARE_ACCOUNT_ID,
apiToken: process.env.CLOUDFLARE_API_TOKEN
});
async function uploadToR2(file) {
await r2.put('my-bucket', file.name, {
data: file.data,
contentType: file.type
});
}
分布式文件系统
MinIO
yaml
# docker-compose.yml
version: '3.7'
services:
minio:
image: minio/minio:latest
volumes:
- ./data:/data
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: password
command: server /data --console-address ":9001"
javascript
const Minio = require('minio');
const minioClient = new Minio.Client({
endPoint: 'localhost',
port: 9000,
useSSL: false,
accessKey: 'admin',
secretKey: 'password'
});
async function createBucket(name) {
const exists = await minioClient.bucketExists(name);
if (!exists) {
await minioClient.makeBucket(name);
}
}
Ceph
yaml
# ceph-deploy配置
osd:
- host: node1
devices:
- /dev/sdb
- host: node2
devices:
- /dev/sdb
- host: node3
devices:
- /dev/sdb
实战案例:媒体存储服务
javascript
class MediaStorage {
constructor() {
this.s3 = new AWS.S3();
this.cloudfront = new AWS.CloudFront();
}
async uploadMedia(file, type) {
// 生成唯一文件名
const fileName = `${Date.now()}-${file.name}`;
// 上传到S3
await this.s3.upload({
Bucket: 'media-bucket',
Key: `${type}/${fileName}`,
Body: file.data,
ContentType: file.type,
ACL: 'private'
}).promise();
// 生成预签名URL
const url = this.s3.getSignedUrl('getObject', {
Bucket: 'media-bucket',
Key: `${type}/${fileName}`,
Expires: 3600
});
return url;
}
async deleteMedia(type, fileName) {
await this.s3.deleteObject({
Bucket: 'media-bucket',
Key: `${type}/${fileName}`
}).promise();
}
}
最佳实践
1. 数据备份
javascript
// 跨区域复制
const replicationConfig = {
Role: 'arn:aws:iam::123456789012:role/s3-replication-role',
Rules: [
{
Status: 'Enabled',
Prefix: '',
Destination: {
Bucket: 'arn:aws:s3:::my-bucket-backup',
StorageClass: 'STANDARD_IA'
}
}
]
};
2. 生命周期管理
javascript
// 自动归档
const lifecycleConfig = {
Rules: [
{
ID: 'Archive after 30 days',
Prefix: '',
Status: 'Enabled',
Transitions: [
{
Days: 30,
StorageClass: 'STANDARD_IA'
},
{
Days: 365,
StorageClass: 'GLACIER'
}
],
Expiration: {
Days: 730
}
}
]
};
总结
云原生存储是现代应用架构的重要组成部分。通过选择合适的存储方案,可以满足不同场景的需求。
我的鬃狮蜥Hash对存储也有自己的理解------它总是把蟋蟀安全地存储在自己的领地,这也许就是自然界的"对象存储"吧!
如果你对云原生存储有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!
技术栈:对象存储 · 分布式文件系统 · 云原生