跳转至

第11章:存储架构

存储架构

11.1 存储架构概述

存储架构的类型

  1. 对象存储:存储非结构化数据
  2. 文件存储:存储文件系统
  3. 块存储:存储块设备
  4. 数据库存储:存储结构化数据

存储架构的选择

需求 推荐存储
图片、视频 对象存储
文档、日志 文件存储
虚拟机磁盘 块存储
结构化数据 数据库存储

11.2 对象存储

11.2.1 对象存储概述

对象存储是一种存储非结构化数据的存储方式,每个对象包含数据、元数据和唯一标识符。

特点: - 无限扩展 - 高可用 - 低成本 - 易于访问

11.2.2 AWS S3

Python
import boto3

# 创建S3客户端
s3 = boto3.client('s3')

# 创建存储桶
s3.create_bucket(Bucket='my-bucket')

# 上传文件
s3.upload_file('local_file.txt', 'my-bucket', 'remote_file.txt')

# 下载文件
s3.download_file('my-bucket', 'remote_file.txt', 'local_file.txt')

# 列出文件
response = s3.list_objects_v2(Bucket='my-bucket')
for obj in response['Contents']:
    print(obj['Key'])

# 删除文件
s3.delete_object(Bucket='my-bucket', Key='remote_file.txt')

# 生成预签名URL
url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'my-bucket', 'Key': 'remote_file.txt'},
    ExpiresIn=3600
)

11.2.3 MinIO

Python
from minio import Minio
from minio.error import S3Error

# 创建MinIO客户端
client = Minio(
    'localhost:9000',
    access_key='minioadmin',
    secret_key='minioadmin',
    secure=False
)

# 创建存储桶
client.make_bucket('my-bucket')

# 上传文件
client.fput_object(
    'my-bucket',
    'remote_file.txt',
    'local_file.txt'
)

# 下载文件
client.fget_object(
    'my-bucket',
    'remote_file.txt',
    'local_file.txt'
)

# 列出文件
objects = client.list_objects('my-bucket')
for obj in objects:
    print(obj.object_name)

# 删除文件
client.remove_object('my-bucket', 'remote_file.txt')

11.3 文件存储

11.3.1 文件存储概述

文件存储是一种基于文件系统的存储方式,提供文件和目录的层次结构。

特点: - 易于使用 - 兼容性好 - 共享方便

11.3.2 NFS

Bash
# 安装NFS服务端
sudo apt-get install nfs-kernel-server

# 配置NFS共享
echo "/data *(rw,sync,no_subtree_check)" >> /etc/exports

# 启动NFS服务
sudo systemctl restart nfs-kernel-server

# 客户端挂载NFS
sudo apt-get install nfs-common
sudo mount server_ip:/data /mnt/nfs

11.3.3 CephFS

Bash
# 创建CephFS文件系统
ceph fs new myfs metadata_pool data_pool

# 挂载CephFS
sudo apt-get install ceph-fuse
sudo mkdir /mnt/cephfs
sudo ceph-fuse -m mon_ip:6789 /mnt/cephfs

11.4 块存储

11.4.1 块存储概述

块存储是一种基于块的存储方式,提供块设备的访问接口。

特点: - 高性能 - 低延迟 - 灵活扩展

11.4.2 Ceph RBD

Bash
# 创建RBD镜像
rbd create myimage --size 1024 --pool rbd

# 映射RBD镜像
sudo rbd map rbd/myimage

# 格式化
sudo mkfs.ext4 /dev/rbd0

# 挂载
sudo mkdir /mnt/rbd
sudo mount /dev/rbd0 /mnt/rbd

11.4.3 iSCSI

Bash
# 安装iSCSI目标端
sudo apt-get install targetcli-fb

# 创建iSCSI目标
sudo targetcli backstores/block create name=backend dev=/dev/sdb
sudo targetcli iscsi/ create iqn.2024-01.com.example:storage.target
sudo targetcli iscsi/iqn.2024-01.com.example:storage.target/tpg1/luns create /backstores/block/name
sudo targetcli iscsi/iqn.2024-01.com.example:storage.target/tpg1/acls create iqn.2024-01.com.example:client.initiator

# 客户端连接
sudo apt-get install open-iscsi
sudo iscsiadm -m discovery -t st -p target_ip
sudo iscsiadm -m node -T iqn.2024-01.com.example:storage.target -p target_ip --login

11.5 分布式存储

11.5.1 Ceph

Ceph是一个统一的分布式存储系统,提供对象存储、块存储和文件存储。

特点: - 统一存储 - 高可用 - 自动恢复 - 无限扩展

Bash
# 部署Ceph集群
ceph-deploy new mon1 mon2 mon3
ceph-deploy install mon1 mon2 mon3
ceph-deploy mon create-initial
ceph-deploy admin mon1 mon2 mon3

# 创建存储池
ceph osd pool create rbd 128 128

# 创建RBD镜像
rbd create myimage --size 1024 --pool rbd

11.5.2 GlusterFS

Bash
# 安装GlusterFS
sudo apt-get install glusterfs-server

# 创建信任池
sudo gluster peer probe server2
sudo gluster peer probe server3

# 创建卷
sudo gluster volume create myvol replica 3 server1:/data server2:/data server3:/data

# 启动卷
sudo gluster volume start myvol

# 挂载卷
sudo mount -t glusterfs server1:myvol /mnt/glusterfs

11.6 存储优化

11.6.1 缓存优化

Python
import redis

# 使用Redis缓存热点数据
r = redis.Redis(host='localhost', port=6379, db=0)

def get_file(file_id):
    # 先查缓存
    cache_key = f"file:{file_id}"
    cached_data = r.get(cache_key)
    if cached_data:
        return cached_data

    # 缓存未命中,从存储读取
    data = read_from_storage(file_id)

    # 写入缓存
    r.setex(cache_key, 3600, data)

    return data

11.6.2 压缩优化

Python
import gzip

def compress_data(data):
    # 压缩数据
    return gzip.compress(data.encode('utf-8'))

def decompress_data(compressed_data):
    # 解压数据
    return gzip.decompress(compressed_data).decode('utf-8')

# 存储压缩数据
compressed = compress_data(large_data)
store_to_storage(compressed)

# 读取解压数据
compressed = read_from_storage()
data = decompress_data(compressed)

11.6.3 分片优化

Python
def get_shard(file_id, num_shards):
    # 计算分片
    return file_id % num_shards

def store_file(file_id, data):
    # 获取分片
    shard_id = get_shard(file_id, 4)

    # 存储到对应分片
    store_to_shard(shard_id, file_id, data)

def read_file(file_id):
    # 获取分片
    shard_id = get_shard(file_id, 4)

    # 从对应分片读取
    return read_from_shard(shard_id, file_id)

11.7 实战练习

练习1:设计一个对象存储系统

设计一个对象存储系统: 1. 设计存储架构 2. 实现文件上传下载 3. 实现分片存储 4. 实现缓存优化

练习2:设计一个分布式文件系统

设计一个分布式文件系统: 1. 设计架构 2. 实现文件存储 3. 实现文件共享 4. 实现高可用

练习3:优化存储性能

优化存储性能: 1. 实现缓存 2. 实现压缩 3. 实现分片 4. 监控性能

11.8 面试准备

常见面试题

  1. 什么是对象存储?有什么特点?
  2. 对象存储、文件存储、块存储的区别?
  3. 如何设计一个分布式存储系统?
  4. 如何优化存储性能?
  5. Ceph和GlusterFS的区别?

项目经验准备

准备一个存储项目: - 使用的存储技术 - 遇到的挑战 - 解决方案 - 项目成果

11.9 总结

本章介绍了存储架构,包括对象存储、文件存储、块存储和分布式存储。存储是系统的基础设施,需要合理设计。

关键要点

  1. 存储架构包括对象存储、文件存储、块存储
  2. 对象存储适合非结构化数据
  3. 文件存储提供文件系统接口
  4. 块存储提供块设备接口
  5. 分布式存储提供高可用和可扩展性

下一步

下一章将深入学习监控与日志,包括监控指标、日志收集等内容。