18 | 分布式存储:你知道对象存储是如何保存图片文件的吗?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
对象存储是一种原生的分布式存储系统,具有近乎无限的存储容量、超高的读写性能、数据高可靠和服务高可用等特点。在对象存储中,大文件会被拆分成多个大小相等的块,然后聚合成容器,每个容器都有多个副本,其中一个是主副本,其他是从副本。这些副本被分配到数据节点上保存,实现了数据的分布式存储。当请求一个文件时,网关会根据元数据找到对应的数据节点进行读写操作。对象存储的设计和实现方法可以帮助读者快速了解分布式存储系统的一些共性,为进一步学习和认识其他分布式存储系统打下基础。 对象存储是最简单的分布式存储系统,主要由数据节点集群、元数据集群和网关集群(或者客户端)三部分构成。数据节点集群负责保存对象数据,元数据集群负责保存集群的元数据,网关集群和客户端对外提供简单的访问API,对内访问元数据和数据节点读写数据。大的对象被拆分为若干固定大小的块儿,块儿又被封装到容器(也就分片)中,每个容器有一主N从多个副本,这些副本再被分散到集群的数据节点上保存。对象存储虽然简单,但它具备一个分布式存储系统的全部特征,如数据分片、多副本保证数据可靠性、数据一致性等。 文章还提出了一个思考题,讨论了对象存储采用半同步方式复制数据时,主副本宕机后如何确定新的主副本的问题。这篇文章通过介绍对象存储的基本原理和特点,为读者提供了对分布式存储系统的认知,并鼓励读者对比分析对象存储和其他分布式存储系统,如MySQL集群、HDFS、Elasticsearch等,以提升对分布式存储系统的理解。文章内容丰富,对读者有很大的帮助,也值得分享给更多的朋友。
《后端存储实战课》,新⼈⾸单¥59
全部留言(27)
- 最新
- 精选
- 李玥置顶Hi,我是李玥。 这里回顾一下上节课的思考题: 如果出现缓存不同步的情况,在你负责的业务场景下,该如何降级或者补偿? 这个问题我看到留言区有一些同学给出了非常好的答案,比如说,设置一个合理的缓存过期时间,这样即使出现缓存不同步,等缓存过期后就会自动恢复。再比如,识别用户手动刷新操作,强制重新加载缓存数据(但要注意防止大量缓存穿透)。还可以在管理员的后台系统中,预留一个手动清除缓存的功能,必要的时候人工干预。2020-04-07535
- L老师,我问一个小问题。公司是做素材库的,现在自建对象服务器,对象服务器里面大多都是图片素材,场景是读多写少。选择Ceph可以用于生成环境吗?或者有没有更好的方案选择?谢谢老师
作者回复: 建议你使用公有云的对象存储服务,小规模的公司自建对象存储维护成本太高,不是太划算。
2020-04-10320 - 喆里请教个问题,为什么分块后又聚合到容器中,直接一个容器一个块不行吗?这块设计思路没看明白
作者回复: 一个容器就是一个分片,是数据复制的基本单位。也就是说,每个分片都有n个 副本。 分片不能做的太小的原因是,分片越小,意味着存储同样容量的数据,分片的数量越多。分片数量过多,查找分片时,需要查找的元数据就会太多,影响查找效率。 另外,对于数据复制,同样要有一定的开销,比如记录日志位置,维护数据一致性的开销。分片太小,相对的,这些开销就会比较大。
2020-05-2518 - 于海涛老师,有一个问题想问您,对象存储的cdn缓存是怎么做的?是每次要访问这些元数据,还是直接把这些源数据所有都放在内存里?数据量这么大感觉不适合放内存里吧?感谢老师
作者回复: CDN缓存的文件一般是保存在CDN节点的磁盘上,当然不排除某些CDN会用节点的内存缓存文件,加速访问。
2020-05-1529 - Jxin每次操作都更新操作时间。谁的操作时间最新谁就是最接近主节点的副节点。
作者回复: 那这个时间从哪儿来呢?如果都从本机的时钟获取,怎么保证集群中所有节点的时钟是一致的呢?
2020-04-0723 - J.Smile老师,有个地方不清楚,这里的每个容器一般只存储对象的一部分块,那么首先应该是从元数据集群中根据key找到这个对象对应的所有容器,第二步,因为多个容器中的块组成一个完整对象,而每个容器又被存到某个数据节点中了,所以此时应该再去元数据集群中找多个容器所对应的数据节点。总之,只要找到了容器的存储位置,容器内块就找到了。文章中提到的块的聚合指的是容器来聚合块吗?这样元数据集群就是管理容器了。容器内存的是块的索引还是实际数据呢?
作者回复: 容器内存放的就是实际的数据。
2020-04-1722 - 每天晒白牙如果是基于 Raft 协议的,会根据任期的编号大小决定谁是领导者2020-04-0718
- Kevin Wang老师讲得很好,提一点建议。 数据冗余技术主要由两种: 1. 传统副本复制 2. 纠删码,基于纠删算法,时间换空间 (著名开源对象存储MinIO就是基于纠删码的) 建议文中也提一下第2种。2020-07-3127
- 奕对象存储 不是一般都有版本控制的吗 ? 最新的版本就是最新的数据2020-04-0716
- 凯文小猪有些同学对于为什么不适用操作日志可能有疑惑 这里简单说一下: 1.文件系统为了保证一致性与原子性 需要使用journal(又被称为write ahead logging,即WAL)技术来实现。 写入时或者更新时 要先写index node日志 数据日志,而这些对于文件系统来说会有两个问题: a)通常文件系统保存的文件都很大 所以无论怎么分割块 index node 天生就多,这样journal日志写入反而是个负担 b)分布式存储不像文件系统需要支持很多的搜索场景 所以内部存储不是用B树 而是KV ,故写入反而简单,如果同步失败也可以快速发现重做即可 2.binlog文件的增大 会导致每次写操作必须保证原子性 因为宿主机linux文件系统还是以一页 16KB来做一次原子写 ,这就会衍生出其他的问题。 最后回答下老师的问题 可以使用版本号来维护 将其作为epoch,在根据其大小用raft选主即可2021-12-153