云原生存储:对象存储与分布式文件系统
云原生存储:对象存储与分布式文件系统
大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊云原生存储这个重要话题。作为一个全栈开发者,存储是应用架构中不可或缺的一部分。今天就来分享一下对象存储和分布式文件系统的实战经验。
云原生存储概述
存储类型对比
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 对象存储 | 海量、低成本、高可用 | 图片、视频、备份 |
| 分布式文件系统 | POSIX兼容、高性能 | 大数据、AI训练 |
| 块存储 | 低延迟、高性能 | 数据库、虚拟机 |
核心特性
高可用性 → 多副本、自动故障转移 弹性扩展 → 按需扩容 数据安全 → 加密、权限控制 低成本 → 按需付费对象存储
AWS S3
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
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
# 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"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
# ceph-deploy配置 osd: - host: node1 devices: - /dev/sdb - host: node2 devices: - /dev/sdb - host: node3 devices: - /dev/sdb实战案例:媒体存储服务
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. 数据备份
// 跨区域复制 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. 生命周期管理
// 自动归档 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对存储也有自己的理解——它总是把蟋蟀安全地存储在自己的领地,这也许就是自然界的"对象存储"吧!
如果你对云原生存储有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!
技术栈:对象存储 · 分布式文件系统 · 云原生
