TOS对象存储实战 | 青训营;
1.抖音
1.1 抖音背后存储
- 云存储服务: 抖音可能使用云存储提供商(如阿里云、腾讯云、亚马逊AWS等)来存储和管理其用户上传的短视频、图片和其他内容。这些云存储服务可以提供可靠的存储解决方案,以应对抖音用户生成的大量数据。
- 分布式存储: 考虑到抖音用户数量庞大,抖音可能采用分布式存储架构,将数据分散存储在多个服务器上,以确保数据的高可用性和容错性。
- 数据备份与恢复: 抖音可能定期对其存储在云端的数据进行备份,以防止数据丢失。这可以通过实施数据备份策略和灾难恢复计划来实现。
- 内容分发网络(CDN): 抖音可能使用内容分发网络来加速短视频的加载速度。CDN 可以将内容缓存在全球各地的服务器上,从而更快地将内容传送给用户。
- 数据安全和隐私: 抖音作为社交平台,必须高度重视用户数据的安全和隐私。可能会采取加密、访问控制、身份验证等措施来保护用户上传的内容和个人信息。
1.2 存储需求
- 视频存储: 用户上传的短视频是抖音的核心内容。这些视频需要在服务器上进行存储,通常以高分辨率和多种格式保存,以便在不同设备上进行播放。
- 图片存储: 除了视频,用户可能还上传图片作为封面、头像等。这些图片也需要进行存储和管理。
- 元数据存储: 每个视频和图片可能都需要关联的元数据,如上传时间、地理位置、标签、用户信息等。这些元数据需要存储以支持搜索、排序和过滤功能。
- 用户数据存储: 抖音需要存储用户信息、关注列表、点赞、评论、分享等数据,以维护用户账户和社交互动。
- 社交关系存储: 平台需要存储用户之间的社交关系,如粉丝、关注列表等,以支持社交功能。
- 数据备份和恢复: 为了防止数据丢失,需要定期进行数据备份,并有灾难恢复计划,以确保在系统故障或数据损坏时能够迅速恢复数据。
- 高可用性和负载均衡: 为了确保平台的稳定性和性能,可能需要采用高可用性架构和负载均衡策略,将数据分散存储在多个服务器上。
- 内容分发网络(CDN): 为了加速内容的传输,特别是视频,抖音可能会使用CDN来分发内容,确保用户能够快速加载和播放视频。
- 安全和隐私: 存储需求还包括保护用户数据的安全和隐私。这可能涉及加密、访问控制、身份验证等措施。
- 扩展性: 平台需要具备良好的扩展性,以应对用户数量的增加和内容的持续增长
1.3 云存储如何做到易用、海量、便宜
- 简化用户界面和操作: 云存储服务提供简洁的用户界面,使用户可以轻松地上传、下载、管理和共享文件。这些界面通常易于导航,无需复杂的技术知识。
- 自动扩展: 云存储服务通常具有自动扩展功能,这意味着它们可以根据数据增长的需要自动调整存储容量和性能,无需用户手动干预。
- 弹性存储: 云存储允许用户按需付费,根据实际使用量付费,避免了过度投资或资源浪费。用户可以随时增加或减少存储容量,以适应业务需求的变化。
- 多区域部署: 云提供商通常在全球范围内部署数据中心和服务器,以确保数据可以就近存储并更快地传输给用户。这有助于提高性能和降低延迟。
- 分布式架构: 云存储服务采用分布式架构,将数据存储在多个服务器上,以实现高可用性和容错性。这样即使某个服务器出现故障,数据仍然可以访问。
- 内容分发网络(CDN): CDN 可以在全球范围内缓存和分发数据,从而加速数据传输并降低网络延迟,提高用户体验。
- 节省成本的选项: 云存储提供多种存储类别,如标准存储、低频访问存储、归档存储等。用户可以根据数据的访问频率和需求选择适合的存储类别,从而降低存储成本。
- 数据压缩和去重: 云存储服务通常会自动进行数据压缩和去重,以减少存储空间的使用,从而降低存储成本。
2.对象存储
2.1 为什么要对象存储
- 处理海量数据: 对象存储适用于处理大量的数据,无论是结构化数据还是非结构化数据,如文档、图像、音频和视频等。
- 扩展性和弹性: 对象存储具有高度的扩展性,可以根据需要自动扩展存储容量,无需用户手动管理。这种弹性使其适合应对数据量的不断增长。
- 适应不同数据类型: 对象存储不限于特定数据类型,可以存储各种不同格式和类型的数据,包括结构化和半结构化数据。
- 元数据管理: 每个对象都可以有自定义的元数据,如标签、描述、创建日期等。这使得对象存储非常适合组织和管理大规模的数据集,以便进行搜索和分类。
- 分布式和冗余性: 对象存储通常采用分布式架构,将数据分散存储在多个服务器和数据中心中,以实现高可用性和数据冗余,降低数据丢失的风险。
- 简化数据管理: 对象存储提供了简单的API和用户界面,使数据管理变得更加容易。用户可以轻松地上传、下载、删除和管理对象,而无需处理底层的物理存储细节。
- 多种访问方式: 对象存储支持多种访问方式,包括HTTP、HTTPS、API等,使数据可以从不同的应用程序和设备访问。
- 数据安全性: 对象存储提供安全性选项,如数据加密、访问控制和身份验证,保护存储在其中的数据免受未经授权的访问。
- 适应云环境: 对象存储是云计算环境中常用的存储方式,它与云服务和虚拟化技术相结合,提供更好的资源管理和部署灵活性。
- 成本效益: 对象存储通常以按需付费的模式提供,用户只需支付实际使用的存储量,避免了不必要的资源浪费。
2.2 各类存储对比
2.3 HDFS
HDFS(Hadoop Distributed File System)是Apache Hadoop生态系统中的一部分,它是用于存储大规模数据的分布式文件系统。HDFS旨在处理大数据集,并且具有高可用性、可扩展性和容错性。它主要用于支持Hadoop框架的数据处理任务,如MapReduce计算。
以下是HDFS的一些关键特点和特性:
- 分布式架构: HDFS将文件分成块(通常是128MB或256MB大小),并将这些块分布在集群中的多个节点上。这种分布式架构允许数据在多个节点上并行存储和处理。
- 块存储: HDFS将大文件划分为固定大小的块,这有助于提高数据处理的效率,特别是在并行计算中。
- 冗余备份: HDFS为每个数据块创建多个冗余副本,通常默认是3个副本。这些冗余副本存储在不同的节点上,以增加数据的可靠性和容错性。
- 高可用性: HDFS支持故障检测和自动故障转移。如果某个节点出现故障,HDFS会自动将数据从故障节点的副本切换到其他节点上,以保持数据的可用性。
- 数据本地性: HDFS设计时考虑了数据本地性。这意味着在执行计算任务时,会尽量将计算任务分配给存储有相应数据块副本的节点,以减少数据传输的开销。
- 适用于大文件: HDFS更适合存储大文件,因为较小的文件可能导致内存消耗和存储空间利用率下降。
- 写入一次、多读多写: HDFS的写入模型是“写入一次、多读多写”。一旦数据写入HDFS,就不允许对其进行修改。多个读操作可以同时从不同的副本读取数据。
- 命名空间和元数据: HDFS使用单独的NameNode来管理文件系统的命名空间和元数据(如文件和目录的信息)。这有助于加速文件查找和访问。
- 访问控制: HDFS支持基于用户和组的访问控制,以确保只有授权用户可以访问和操作数据。
2.4 TOS
TOS(Tencent Object Storage,腾讯对象存储)是腾讯云提供的一种海量、安全、低成本的对象存储服务。它可以用于存储和处理各种形式的数据,包括图片、音视频文件、日志数据、备份数据等。
TOS提供了高可用性和持久性的存储,数据可通过多副本存储在不同的硬盘和服务器上,确保数据的安全性和可靠性。同时,TOS还提供了强大的数据管理功能,包括数据的上传、下载、删除、拷贝、查询等,以及权限管理、访问控制、数据加密等安全性措施。
TOS还具备扩展性和灵活性,可以根据业务需求进行存储空间的扩容和缩容,以及根据业务的变化动态调整存储策略和管理对象。
2.5 TOS的优点与缺点
- 优点
静态、Immutable
视频 图片 文本 安装包 备份 前端js文件
- 缺点
结构化、Mutable
关系型数据:商品订单 KV: 缓存记录... 随机写: 在线编辑文件... Append写: 大数据计算中间结果... 更新频繁:钱包余额...>
3.对象存储的使用
3.1 Restful风格接口
Restful风格接口是一种设计规范,用于创建可维护、可扩展和易于理解的网络服务。它基于REST(Representational State Transfer)原则,在设计和实现API时遵循一系列规则和约定。
以下是一些常见的Restful风格接口规则:
- 使用HTTP方法:根据对资源的操作类型,使用合适的HTTP方法。例如,GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。
- 使用合适的URI:每个资源都应该有一个唯一的URI标识。URI应该简洁、有意义且易于理解。使用斜杠分隔资源层次结构,并使用名词作为资源的名称。例如,/users用于表示用户资源。
- 使用合适的HTTP状态码:根据操作的结果,使用合适的HTTP状态码来表示响应的状态。例如,200表示成功,201表示资源创建成功,404表示资源未找到,500表示服务器内部错误等。
- 使用合适的错误处理:在发生错误时,使用合适的错误处理机制,返回具有有意义的错误消息和适当的HTTP状态码的响应。
通过遵循这些规则和约定,Restful风格接口可以遵循一种统一的设计模式,提供易于理解和使用的API。同时,它还具有良好的可扩展性和维护性,使开发人员能够更轻松地构建和管理网络服务。
3.2 Go使用云存储
在Go语言中使用阿里云OSS存储,你可以使用阿里云OSS的官方SDK进行操作。
首先,你需要安装阿里云OSS的Go SDK。你可以使用以下命令来安装:
shell复制代码go get github.com/aliyun/aliyun-oss-go-sdk/oss
接下来,你需要导入SDK包并配置阿里云OSS的访问密钥和其他参数。可以按照以下示例进行配置:
go复制代码package main import ( "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 配置访问密钥 accessKeyId := "your-access-key-id" accessKeySecret := "your-access-key-secret" // 创建OSS客户端对象 client, err := oss.New("<your-endpoint>", accessKeyId, accessKeySecret) if err != nil { fmt.Println("Error creating OSS client:", err) return } // 创建存储空间(Bucket) bucketName := "your-bucket-name" err = client.CreateBucket(bucketName) if err != nil { fmt.Println("Error creating bucket:", err) return } // 上传文件到存储空间 objectKey := "your-object-key" localFile := "path/to/your-local-file" err = client.PutObjectFromFile(bucketName, objectKey, localFile) if err != nil { fmt.Println("Error uploading file:", err) return } fmt.Println("File uploaded successfully!") }
在上述代码中,你需要将
替换为你的阿里云OSS的Endpoint。
和`分别替换为你的阿里云OSS的访问密钥ID和访问密钥Secret。
your-bucket-name是你要创建的存储空间名称,
your-object-key是文件在存储空间中的唯一标识,
path/to/your-local-file`是你本地文件的路径。
4.对象存储实践
4.1 三层架构
接入层: 接入解析并处理接口请求 元信息层:存储对象元信息 存储引擎层:存储对象内容
4.2 分布式策略
Partition(分而治之)
分而治之:不同数据映射至不同Partition分区
Partition Logic: Hash/Range
可扩展性如何达成
数据量增加:扩容机器新建Partition
Parition Logic:新增数据写入映射导向新Partition
4.3 持久度解法之Replicatior
在对象存储领域,数据的持久性(或持久度)是一个重要的概念,它表示数据在存储系统中的可靠性和耐用性。"Replicator"(复制器)是一种常见的持久性解决方案,用于确保数据在存储中得到复制,以防止数据丢失。下面是关于"Replicator" 在对象存储中的基本工作原理:
- 数据复制: Replicator 将对象的副本从一个存储位置复制到另一个存储位置,通常是在不同的物理服务器、数据中心或区域之间。这样,即使一个存储节点发生故障,仍然可以从其他复制的副本中访问数据。
- 副本数量: Replicator 可以配置为创建一定数量的副本。例如,可以选择创建两个或三个副本,以确保数据的高可用性和冗余性。
- 一致性: 当写入或更新数据时,Replicator 确保所有复制的副本都被同步更新,以保持数据的一致性。这确保了不会发生数据丢失或数据不一致的情况。
- 故障恢复: 如果一个副本或存储节点发生故障,Replicator 可以自动切换到其他可用的副本,以确保数据的可用性。一些系统还可以自动进行修复,即创建新的副本来替代损坏的副本。
- 异地复制: Replicator 还可以用于在不同地理位置之间复制数据,以提供地理冗余性和灾难恢复能力。这可以确保即使整个数据中心或区域发生灾难,数据仍然可恢复。
4.4 成本解法之EC
在对象存储和数据冗余性的领域,EC 代表的是 Erasure Coding(纠删码)技术。Erasure Coding 是一种用于数据保护和冗余性的方法,它通过数学算法将数据分成多个块,并生成一定数量的冗余块,以便在数据损坏或节点故障时进行数据恢复,而无需像传统的数据复制方式那样浪费大量存储空间。这有助于降低存储成本,同时保持数据的可靠性。以下是 Erasure Coding 的一些关键概念:
- 数据分割: 原始数据被分割成多个较小的数据块。
- 冗余编码: 使用纠删码算法,生成一定数量的冗余块,这些冗余块可以从原始数据块中进行计算。
- 冗余度参数: EC 方案的冗余度参数指定了生成的冗余块的数量。此参数可以影响数据恢复的可靠性和效率。
- 恢复能力: 即使部分数据块丢失,Erasure Coding 也可以通过计算冗余块来恢复原始数据。通常情况下,只需要保留原始数据块的一部分和一定数量的冗余块,就可以恢复全部数据。
- 存储效率: 相对于传统的数据复制方法,EC 可以显著减少存储成本,因为冗余块占用的存储空间相对较少。
- 计算成本: 与数据恢复相关的计算成本可能会较高,因为需要进行复杂的计算来恢复丢失的数据块。
4.5 架构细化
- API:接入层
- Bucket Meta : Bucket元信息服务Object Meta:对象元信息服务
- Distributed KV: Range Partition的分布式KV,用于持久化对象元数据
- Storage Engine :对象内容存取服务
- Distributed Storage Pool:分布式存储池.三副本 or EC存储
- GC:垃圾回收后台服务
- Lifecycie :温冷转换后台服务
4.6 存储需求量的细化
"降低爆炸半径" 这个表达在高可用性(High Availability)的背景下可能有一些误导性。高可用性指的是系统或服务能够在遇到故障或中断时仍然保持可用和正常运行的能力。爆炸半径通常不直接与高可用性相关,而是与安全和风险管理有关。
如果您关注的是在高可用性系统中降低风险或减少潜在影响,您可能想要探讨如何减少故障的影响范围或潜在破坏。这可能包括以下几点:
- 冗余性: 在系统架构中引入冗余组件,以便在一个组件发生故障时能够无缝切换到备用组件,从而减少中断影响。
- 地理分布: 将系统的不同部分分布在不同地理位置,以减少地区性灾难的影响。这种做法称为地理冗余或多活部署。
- 负载均衡: 使用负载均衡技术,将流量分配到多个服务器或资源上,以避免单点故障,并提供更好的性能和可用性。
- 灾难恢复计划: 制定详细的灾难恢复计划,包括备份、数据恢复和系统恢复策略,以减少故障引发的影响。
- 监控与自动化: 实施实时监控和自动化控制,以便在出现异常情况时能够迅速采取措施,降低故障扩散的风险。
4.7 镜像灾备
镜像灾备(Mirroring Disaster Recovery)是一种高可用性和灾难恢复策略,用于确保在主要数据中心发生故障或中断时,可以无缝切换到备用数据中心,从而保持业务的持续运行。这种方法涉及在主要数据中心和备用数据中心之间创建实时镜像或复制,以便在需要时能够迅速切换并恢复业务。
以下是镜像灾备的一些关键特点:
- 实时数据复制: 主要数据中心的数据会实时地复制到备用数据中心。这包括应用程序数据、数据库、文件等。
- 高可用性: 镜像灾备确保了系统的高可用性,因为备用数据中心中的系统是与主要数据中心保持同步的镜像。在主要数据中心故障时,业务可以迅速切换到备用数据中心,几乎没有中断。
- 数据一致性: 确保主要数据中心和备用数据中心之间的数据保持一致性是关键。使用实时数据复制和同步可以确保数据在切换时不会丢失。
- 自动切换: 镜像灾备系统通常具有自动切换功能,当检测到主要数据中心故障或异常时,系统会自动触发切换到备用数据中心。
- 灾难恢复测试: 定期测试灾难恢复过程是至关重要的,以确保备用数据中心的系统和数据可以正常工作。这有助于验证系统的可用性和恢复能力。
- 地理分布: 备用数据中心通常位于不同的地理位置,以防止地区性灾难对主要数据中心的影响。