从一到无穷大 #3 对象存储.浅谈

news2024/12/24 10:23:52

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

文章目录

  • 引言
  • Windows Azure Storage
  • Nosql:TiKV为例
  • 总结

引言

天才的开源精神对于普通人来说是一种莫大的福音,好在老天爷赏饭个人无法决定,但论文和github确是没有门槛的。再次感谢巨硬赏饭吃[1]。

大概两年以前写过一篇名为《聊聊块存储、文件存储、对象存储》的文章,以当时的认知谈论这样一个话题其实很难有一些有意义的观点,但是对我来说看着自己认知转变的过程确实是有趣的。

[4]中各路大佬的回答高屋建瓴,对于模型之间关系描述基本没有什么需要补充点了,在[5]中提到:

相对于文件存储目录树的组织形式,对象存储OSS采用扁平的文件组织形式,采用RESTFul API接口访问,不支持文件随机读写,主要适用于互联网架构的海量数据的上传下载和分发。

扁平的名称空间可以高度概述对象存储,但是我认为这不是选型的核心因素,对象存储的各种操作可以轻松的用Nosql代替。以目前兴起的serverless计费模式来看,nosql和对象存储都是根正苗红的paas产品,那么在nosql能力可以轻松覆盖对象存储时到底区别在哪里呢?这个问题类似于前段时间在公司和一个朋友的讨论,如果ES的查询能力(CTSDB)确实强于时序数据库,那为什么时序还要存在呢?这些问题的答案都一样,本质上是取舍。

以目前腾讯云上的产品来看看:

对象存储:
在这里插入图片描述
文件存储:
在这里插入图片描述
块存储:
在这里插入图片描述

多快好省是不存在的,在成本,性能,吞吐之间的权衡才是选型的关键,但为什么成本的差距会如此巨大呢?我们从架构的角度谈一谈这个问题。

Windows Azure Storage

关于Global Partitioned Namespace不必多谈,事实上到现在对象存储的模型还是没变,即app_id+bucket_id+obj,其实也就是下面图中的url。

WAS[1]基本架构如下,这套架构的影响之大让我觉得现在的绝大多数公有云厂商可能还在使用(可能除了S3)。
在这里插入图片描述
整个对象存储大核心流程即为Storage Stamp,基本被分为三个部分,从用户的请求到数据存储到链路为:

  1. Front-End Layer:负责对象存储本身的产品级能力,以及转发请求到不同的Partition Layer。
  2. Partition Layer:核心模块,论文中提到这里的内部数据结构为一个对象表,其中存储表结构,数据及其他抽象,这里显然是会存储对象到Stream Layer的索引的,不然论文中也不会说Partition Layer到数据可以到PB级别。
  3. Stream Layer:实际存储文件的存储模块,其核心概念为Stream/Extent,论文中提到每个Stream在Partition Layer中看来都是一个大文件,而且每一个Extent都是append only的,当然这意味着需要一些垃圾回收策略,因为对象本身是可修改的。

论文中的如下概念我比较感兴趣:

  1. 因为append only的特性,并不是所有的Extent的数据都是三副本的,对于更冷的数据会用纠删码降低存储成本,以原文中的数据来看可以把存储成本从3倍降低到1.3到1.5倍。这也意味着Stream Layer的架构和现在流行的Nosql架构师不同的。(在nosql中我们是否可以使用纠删码来做巡检中的key修复,以抵御SSD字节级别故障?)
  2. 高性能日志:很多硬盘被优化为实现更高的吞吐量,在IO中倾向于选择更连续的IO请求,这意味着大规模的流式写入可能会是的IO公平性较差,导致部分IO处于饥饿状态,这会导致上层请求排队非常严重,这启发我们如果硬盘IO处于关键路径时硬盘的IO调度算法是一个必须被考虑的问题。WAS种保留一个独立的HDD/SSD作为日志驱动,这使得WAL和LOG不必与数据盘的IO操作竞争。
  3. 监控能力:在2011时ELK体系与Prometheus生态还没有完善,文中提到WAS使用一个与用户数据所在Storage Stamp的巨大虚拟机完整的控制所有的计算节点,以实现近实时的吞吐监控。当然现在不必这样了。
  4. 租户级隔离:文中提到使用Sample-Hold 算法前N个负载最高的partition,根据历史访问信息判断在过载时拒绝的概率。这种方法很好想,实施也很简单,这也从侧面显示,WAS也是多租户在同一个LSM树中的,这种能力需要引擎支持。PS:这本来上篇文章中想要讨论的问题。
  5. Pressure Point Testing:提供了自动发起分裂/合并/迁移/Checkpoint及其他操作的toolkit,以及网络故障,磁盘延迟注入等,这些能力看似鸡肋,实则为这样一个复杂系统维护过程中必不可少的工具。我一直认为计算机领域一个天才胜过100个庸才,所有人都知道故障注入,只有奈飞的大神们提出了混沌工程理论。
  6. Name Server:名字服务现在已经模块化了,完全不必对象存储团队去做。
  7. 初始的WAS中提供的其实是tablet,queue,blob三种模型,不同模型对于性能的要求不同,在同一组硬件部署不同的服务可以降低成本。

Stream Layer在文中被描述为如下职能(对理解这篇paper非常重要的一句话):

The stream layer provides an internal interface used only by the partition layer. It provides a file system like namespace and API, except that all writes are append-only. It allows clients (the partition layer) to open, close, delete, rename, read, append to, and concatenate these large files, which are called streams. A stream is an ordered list of extent pointers, and an extent is a sequence of append blocks.

看起来Stream Layer拥有如下特点

  1. 基础数据模型为Stream+Extent
  2. append only,意味着在上层修改操作下底层需要回收不再被Stream指向的Extent,每一个Extent Nodes (EN)中仅仅存储连续多Extent,Stream的概念只在Stream Manager 中。

看起来Stream Layer是一个块存储模块,但是我对块存储并不熟悉,这种数据组织形式在引擎来说和KV相差很大。

Nosql:TiKV为例

图片来源[6]
在这里插入图片描述
现在仿佛只要是个人就要调侃一下Nosql不就是RocksDB+Raft吗,最可怕的是这句话好像也没法反驳。
分布式KV系统要提供的语义简单的多,宏观来讲架构也清晰的多,基本上分层如下:

  1. API + 协处理器
  2. 事务层
  3. MVCC
  4. 复制
  5. 存储引擎

首先从成本上讲,为了能拿出手的性能,SSD是标配,其次基本不可能混部。事实上不可能所有的数据都是热数据,降冷几乎是必须的,怎么降呢?同一套引擎再搞个HDD的?或者硬盘异构混部?不可能的,直接扔对象存储完事。

再者本身TiKV作为存储节点,因为协处理器又有不少的计算任务,本身的资源利用率再调度合理的情况下已经不错,所以架构上基本都没啥区别。再者WAS的Partition Layer中的Object Table看起来也就是个KV。

不过基于对象存储前端的特殊的接口与访问方式,Partition Layer的具体实现其实有很多技术难点,这里不再细谈。

总结

此刻回答文首的两个问号,以我拙见,针对于不同数据模型,介质,成本,性能,负载,工业界/学界有不同的优化方法,具现后就是不同的产品,了解权衡才是选择与设计的关键所在。

所以一切的一切本质就是回归到云的真谛,成本与弹性。

所以再次回到两年前的那个问题,块存储、文件存储、对象存储到区别是什么呢?我并不知道如何解释这个问题,但是我知道接口并不是唯一的突破点,这是两年期间的进步,

WAS论文中提到同一堆栈中不同模型对于性能的要求不同,在同一组硬件部署不同的服务可以降低成本,接着[7]中satanson​大佬的观点,和现有的事实,我认为下一步我们要做的事情可能是:

  1. 不通模型混部以提升资源利用率,而不是更细粒度的租户隔离
  2. 更多模型特化的data flow,以提升性能

复制问题已经消解,读写链路,运营能力可以公用,确实只剩引擎可以留给不同模态的优化了,对于绝大多数场景来讲要上已经完全够用了,成本的优势足以抵消部分性能需求,而且本来和内存数据库的市场也不一样,nosql的未来在工业界应该是多模的,极致性能留给学界吧。

最后一点,Windows Azure Storage这篇典型的工业论文写的极有水平,不知道能不能拿个SIGOPS Hall of Fame Award,毕竟DynamoDB,BigTable,Spanner,Chubby这些先驱都拿奖了,个人感觉[1]和上面四个是一个水平的。

参考:

  1. Windows Azure Storage: A Highly Available Cloud Storage Service with Strong Consistency
  2. ECC之Reed-Solomon算法
  3. 聊聊块存储、文件存储、对象存储
  4. 块存储、文件存储、对象存储这三者的本质差别是什么?
  5. 如何选用NAS、OSS和EBS?
  6. TiKV简介
  7. 到现在为止,NoSQL 运动给数据库系统留下什么宝贵的思想?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

67-94-hive-函数-开窗函数-常用函数-udf自定义函数

67-hive-函数: UDF:一进一出,普通函数 UDAF:多进一出,聚合函数 UDTF:一进多出,炸裂函数 一、多指的是输入数据的行数。一行变多行,多行变一行。 函数 #查看系统自带的函数 hive> show functions; …

Docker以标准方式安装部署Redis

Docker安装redis的命令很简单,但是很多都是半成品的命令,说白了,就是自己玩玩,一个demo级别的redis而已。 本篇文章以最全的命令方式安装部署Redis。 注意: 本篇只是单机版的,只是公司测试环境使用&…

解决npm的 EACCES: permission denied 问题

居上位而不骄,在下者而不忧。 平时项目开发使用npm都顺风顺水的,but今天新建项目时,就出现了权限错误,具体如下: 但是通过下面的提示就可以轻松解决。 sudo chown -R 502:20 “/Users/cheng.wang/.npm” 官网相关议题…

Redis源码篇(7)——哨兵模式

哨兵模式 哨兵模式即在主从复制的基础上增加哨兵监控以控制主从切换实现高可用的一种模式。 本篇主要介绍sentinel系统初始化,心跳检测,故障转移的过程 初始化 从最开始的 redis-server xxx.conf --sentinel 、 redis-sentinel xxx.conf 命令看起。当一…

CUDA 编程简介

参考资料: NVIDIA CUDA Programming Guide, NVIDIA. (https://docs.nvidia.com/cuda/cuda-c-programming-guide/)国科大《并行与分布式计算》课程、NVIDIA 在线实验平台 文章目录GPU & CUDAG80 Graphics ModeG80 CUDA ModeCUDA Programming ModelCUDA Extends …

重定向转发,接收请求参数及数据回显-P11,12

重定向和转发: 我们的实现本身就是转发 。 想删掉视图解析器的话,就需要在return把路径写全 重定向就改为redirect:而且重定向不走视图解析器,因为是新的请求,新的URL。 接收请求参数: 第一种是默认的方式…

【FreeRTOS(十二)】事件标志组

文章目录事件标志组创建事件标志组 xEventGroupCreate将指定的事件位清零 xEventGroupClearBits将指定的事件位置 1 xEventGroupSetBits获取事件标志组值 xEventGroupGetBits等待指定的事件位 xEventGroupWaitBits代码示例事件标志组 事件标志位 事件位用来表明某个事件是否发…

嵌入式Linux 开发经验:编写用户态应用程序打开 misc 设备

参考文章 VSCode SSH 连接远程ubuntu Linux 主机 ubuntu 20.04 qemu linux6.0.1 开发环境搭建 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 嵌入式Linux 开发经验:platform_driver_register 的使用方法 嵌入式Linux 开发经验:注册一个 misc 设…

创新案例|实现YouTube超速增长的3大敏捷组织运营机制(上)

从2008年到2014年YouTube进入超速增长模式。时任核心技术负责人的 Shishir Mehrotra回顾了当时公司面临的挑战,以及带领YouTube团队如何建立一套敏捷运营机制的先进实践,以保持战略对齐并运营复杂的业务。这直接推进公司每周高效的工作节奏,以…

【Pytorch】模型的可复现性

背景 在做研究的时候,通常我们希望同样的样本,同样的代码能够得到同样的实验效果,但由于代码中存在一些随机性,导致虽然是同样的样本和程序,但是得到的结果不一致。在pytorch的官方文档中为此提供了一些建议&#xff…

复现 MMDetection

文章目录MMDetection 复现一、环境配置服务器信息安装CUDA下载并安装CUDA配置环境变量多个Cuda版本切换 (可选)安装CUDNN安装Anaconda搭建虚拟环境新建虚拟环境安装pytorchPycharm 远程连接代码同步配置服务器解释器二、训练和推理自制COCO格式数据集训练修改数据集相关参数修改…

Problem C: 算法10-10,10-11:堆排序

Problem Description 堆排序是一种利用堆结构进行排序的方法,它只需要一个记录大小的辅助空间,每个待排序的记录仅需要占用一个存储空间。 首先建立小根堆或大根堆,然后通过利用堆的性质即堆顶的元素是最小或最大值,从而依次得出…

TMS FixInsight代码评估工具

TMS FixInsight代码评估工具 TMS Fix Insight被认为是Delphi程序员的代码评估工具,它也能够在Delphi的源代码中发现问题。它被认为是一个代码分析工具,用于划分过程以及问题的位置以及Delphi的应用。TMS Fix Insight基本上是一个静态的代码列表&#xff…

Spring - SmartInstantiationAwareBeanPostProcessor扩展接口

文章目录Preorg.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor类关系SmartInstantiationAwareBeanPostProcessor接口方法扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.beans.factory.config.SmartInstantiationAwareBeanPo…

HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

jdk11新特性——官方的更新列表

目录一、官方的更新列表二、JEP (JDK Enhancement Proposal 特性增强提议)一、官方的更新列表 二、JEP (JDK Enhancement Proposal 特性增强提议) JShell——(java9开始支持)Dynamic Class-File Constants类文件新添的一种结构局部变量类型推断(var关键字&#xff…

开荒手册3——构思一篇小论文

0 写在前面 又过了一个gap week,总算想清楚了之前遇到的一些问题,现在需要把之前画的大饼们一个一个消化掉。跳出来就会知道,总有一些something is wrong的人喜欢散播点焦虑,你要做的不是惩戒他们,而是赶紧远离&#…

windows下安装ubuntu linux子系统

windows下安装ubuntu linux子系统一、win10下安装ubuntu linux子系统二、下载ubuntu子系统三、启动ubuntu子系统四、配置ubuntu子系统一、win10下安装ubuntu linux子系统 但我们现在自己的主机上跑linux时,有几种选择 同时安装多个操作系统,每次重启电…

js 代码的运行机制

前言: 自己从一开始学习 javaScript 的时候,踩过很多很多坑,初学之路上也问过很多大佬许多为什么...现在回过头感叹,当时问的某些问题确实是有一丢丢幼稚。但是作为一个过来者,我深知这些问题的对于很多“后来者”来说…

tensorflow的模型持久化

参考 tensorflow的模型持久化 - 云社区 - 腾讯云 目录 1、持久化代码实现 2、持久化原理及数据格式 1、meta_info_def属性 2、graph_def属性 3、saver_def属性 4、collection_def属性 1、持久化代码实现 tensorflow提供了一个非常简单的API来保存和还原一个神经网络模型…