第11章:存储架构¶
11.1 存储架构概述¶
存储架构的类型¶
- 对象存储:存储非结构化数据
- 文件存储:存储文件系统
- 块存储:存储块设备
- 数据库存储:存储结构化数据
存储架构的选择¶
| 需求 | 推荐存储 |
|---|---|
| 图片、视频 | 对象存储 |
| 文档、日志 | 文件存储 |
| 虚拟机磁盘 | 块存储 |
| 结构化数据 | 数据库存储 |
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 面试准备¶
常见面试题¶
- 什么是对象存储?有什么特点?
- 对象存储、文件存储、块存储的区别?
- 如何设计一个分布式存储系统?
- 如何优化存储性能?
- Ceph和GlusterFS的区别?
项目经验准备¶
准备一个存储项目: - 使用的存储技术 - 遇到的挑战 - 解决方案 - 项目成果
11.9 总结¶
本章介绍了存储架构,包括对象存储、文件存储、块存储和分布式存储。存储是系统的基础设施,需要合理设计。
关键要点¶
- 存储架构包括对象存储、文件存储、块存储
- 对象存储适合非结构化数据
- 文件存储提供文件系统接口
- 块存储提供块设备接口
- 分布式存储提供高可用和可扩展性
下一步¶
下一章将深入学习监控与日志,包括监控指标、日志收集等内容。