考虑到信息安全,用户A是不能看到用户B的数据的,那么就需要按智能手表为单位进行租户隔离,这种的场景下就有几千万个租户,同时每个租户还有自己的存储空间配额,比如给每个智能手表分配5GB 存储空间。光是这样的租户隔离场景,依据最佳实践的系统设计原则,不管是块存储系统、文件存储系统、对象存储系统还是Kafka这样的消息系统,按他们本身的隔离特性以及支持的租户规模都是难以在单个系统里支持这样的租户隔离场景。但是用流存储来实现就很方便,比如以智能手表的业务场景为例:
- 默认分配5GB存储空间给一个智能手表,然后定义一个智能手表类型的命名空间用于与其他智能设备进行隔离,给每个智能手表分配一个流,每个智能手表上报的字节数据以事件为单位存储在流内的段里。
- 也可以这样来定义:给每个智能手表分配一个5GB 存储空间的命名空间,手表里的每个传感器都对应一个流,每个传感器以事件为单位上报字节数据存储到流的段里。
还可以想象一下这样的业务场景:自动驾驶。采用分布式流存储的话,我们可以这样处理自动驾驶的数据:给每一辆无人车定义一个1TB存储空间的范围,车上的每个传感器都归属于一个流,传感器上报的事件都在段内持久化。再假设每辆车都有1000个传感器(实际情况只多不少),那么10万辆车就需要定义1亿个流,可以想象要进行这种规模的隔离也就只有这种专门针对流数据而设计的流存储系统能够支持。
在工业互联网的场景下,还可以这样定义工业设备的数据:给一个厂房里的每台设备定义一个范围,每台设备里的每个传感器都对应一个流,传感器上传的事件数据保存在流内的段里,这样就很方便的对工业设备进行了大规模的租户数据隔离。
因此,以“范围、流、段、事件”的方式很方便的进行了大规模的租户隔离保证了用户信息安全同时又进行了存储资源配额的隔离。
大数据处理平台
万物互联场景下无限量的数据给数据处理技术带来巨大的挑战与压力,不同的应用场景意味着不同的数据处理要求与复杂度,要把这些不同的甚至矛盾的数据处理要求都很好的综合在一个大数据处理系统里,对现有的大数据处理技术来说是个非常大的挑战,比如无人车的处理要求毫秒甚至纳秒级的数据处理实时性、而有些工业设备数据只需要分析历史数据,要让一个大数据处理系统既能能处理历史数据又能提供毫秒级甚至纳秒级的实时性处理能力还能应对各种不同格式不同传输场景的数据,而且每种数据处理都能达到这些应用场景原生指标的处理需求。相信这样的场景对工程技术人员来说是个很大的挑战。为了解决上述问题,按照现有的成熟的技术能力,通常开发人员采用类似Lambda架构(如下图)这样的大数据处理平台来处理大数据。

Lambda架构即支持批处理也支持实时处理,能应对数据的多样性、具有容错功能、复杂性分离、能处理流式数据也能处理历史数据等优点,但是缺点也很明显:批处理一套独立的数据处理路径,实时处理又一套数据处理路径,然后还要合并结果再输出展示,同时系统里同样的数据存在存储多份的问题,比如同样的数据在Elasticsearch里有、HDFS里有、ceph里有、Kafka里也有,除了这些甚至还存在其他一些复杂的存储组件,而且同样的数据还都是多份冗余的,因此存储成本太高太过于复杂。Lambda架构里为了提供一个功能却引入一个组件,在复杂之上堆积复杂,存储成本、开发与运维成本都太过于复杂。
那么应当如何解决Lambda架构带来的这些缺点?以数据流向为核心重构大数据处理平台是一个比较好的方案,它具体包括数据的采集、聚合、传输、缓存、持久化、处理、展示等。依据这种设计理念我们可以推出一个端到端的原生的流式大数据处理平台:原生的流式计算加上一个原生的流式存储并且可以平衡商业成本与技术成本。
流式计算可以采用Flink,然而并没有发现当前有合适的流式存储可以使用,如果采用Flink加上传统的文件存储或者块存储、对象存储的方式,也只能认为是半原生的大数据处理平台:计算是原生的流式计算而存储却不是原生的流式存储。
因此,综合思考万物互联场景下的数据处理场景也需要一个原生的分布式流存储系统,重构Lambda架构里的存储栈,使得分布式流计算加上分布式流存储即为原生的流式大数据处理系统,同时还能很好的平衡商业成本与技术成本之间的关系。
数据无限性
无限性是分布式流存储最为重要的设计原则。从流数据的角度来看,数据是大量、快速、连续而又无限的,这就给流存储系统的设计与实现带来极大的困难,无限的数据使得存储系统必须能支持连续且无限规模的数据流,光这一点就对存储系统的可扩展性要求非常的高,同时还要求存储系统能够根据到达的数据量动态而又优雅地进行扩容与缩容。从技术与成本的角度来看,数据无限性意味着冷热数据分离,长期不用的数据淘汰到长期存储系统里,热点数据需要缓存,同时还需要能支持历史数据的读取与实时数据的读取与写入。
可伸缩性
可伸缩性也是分布式流存储最为重要的设计原则之一,而且流存储里的可伸缩性要求还是自动化的资源细粒度的可伸缩。通常,在云原生的场景下,资源的缩放是以主机、虚机或容器为单位的,这样的缩放对流存储来说粒度太大。在流存储的场景下需要能够以数据的“流段”为单位,比如一个流段2MB,那么就需要能支持一次自动扩容或缩容2MB的存储空间。另外在流存储里还要求写入与读取对数据子集的操作是解耦分离的,并且写入与读取二者之间跟数据流段还要有一个合理的平衡。
恰好一次
恰好一次也是分布式流存储最为重要的设计原则之一,恰好一次意味着数据的可持久化、有序、一致性以及事务性的支持。持久性意味着一旦得到确认,即使存储组件发生故障,写入的数据也不会丢失。有序意味着读客户端将严格按照写入的顺序处理数据。一致性意味着所有的读客户端即使面对存储故障、网络故障也都会看到相同的有序数据视图。事务性写入对于保证Flink这样的计算应用处理结果的完全正确是非常必要的。
字节流
分布式流存储里采用字节流的格式组织数据而不是像消息系统里采用消息报文的方式,这意味着接口的通用性。二进制的字节流是与数据格式无关的,字节流可以组成事件封装在分布式存储的流段里。而消息系统里数据是消息头消息体的格式封装的,在兼容性上不如字节流。
数据管道
在存储界通常喜欢用跑车、卡车、渡轮来比喻块存储、文件存储以及对象存储,打个比方来说块存储类似跑车:极快、极稳、装的人少、成本高;文件存储类似卡车:快、稳、装的人比跑车多,但是没跑车那么快;对象存储类似渡轮:可以装非常多的货,讲究量大、成本低;那么分布式流存储像什么呢? 在我们的定义里它就像管道:数据如同流水一般流过管道,又快又稳源源不断而又永无止境。
租户隔离
分布式流存储从一开始设计的时候就将”租户隔离“作为其基本特性进行实现,”隔离“是分布式流存储的最基本的特性之一,在分布式流存储里租户隔离不只是租户B绝对不能看的到租户A的任何信息这样的信息安全层面的隔离,它支持范围、流、段、事件层面的隔离还将支持的租户规模作为设计的目标之一,在分布式流存储里单集群需要能支持千万量级起的租户数,另外还有资源、命名、可视空间、权限以及服务质量层面的隔离。
海量小文件
对巨量小文件的支持是分布式流存储的设计原则之一。正如前面提到的,万物互联下的海量数据来源于传感器,而传感器上传的数据都是类似温度、地理位置、告警信息这样的几个字节几个字节的小数据,这就意味着在万物互联的场景下会有巨量的小数据上传,而且90%以上的数据操作行为都是写入。为了保证数据写入的性能以及可靠性、正确性、持久性以及保证介质的使用寿命降低成本,这也需要存储系统针对这种业务场景进行专门的设计。
在分布式流存储里每个事件第一步是被仅附加写入一个缓存的段内进行封装的,在段达到一定的尺寸(比如64MB)后会被封闭不再写入,这时再将整个段写入下一级的持久化存储里。通过这样的设计,实现小数据在缓存里封装成大块的数据,再将大块数据写入持久化存储设备的方式保证了存储系统整体的性能。
数据治理
当前的大数据处理平台,不管是Kappa架构还是lambda架构,数据的存储都是多组件化、多份化的。比如同样的数据在Kafka里有、在HDFS里有、在Elasticsearch里又有,有些用户还使用了更多的存储中间件,而且这些数据还是多份冗余的。这一方面增加了数据的存储成本,另一方面也降低了数据的可信性、可靠性、合规性,给数据标准化以及数据的重复利用带来了困难,不利于数据的分享、合规、降低成本以及安全可靠地支持业务和决策。数据治理也是分布式流存储的基本设计原则之一,通过使用分布式流存储,大数据处理平台的架构可以进化成”分布式流计算+ 分布式流存储“这样的原生流式数据处理平台架构。
流式架构
下图体现了”分布式流计算+ 分布式流存储“这样的原生流式大数据处理平台的架构理念。

这个架构体现了 “流原生”(stream native)式 的设计哲学,“流原生”的计算加上“流原生”的存储管道组成了“流原生”的大数据处理平台。数据从分布式流存储输入经过map算子计算,输出中间计算结果到分布式流存储里,数据又从分布式流存储里读入到Filter算子里,再经过计算,中间结果放到了分布式流存储里,再最后的计算结果经过聚合算子的计算放到了目的地的分布式流存储里。这个过程体现了算子编排和管道式编程的设计哲学,在这里分布式流存储起了大数据处理平台里的管道的作用。
同时,在分布式流存储里数据的存储单位是流段,当输入的数据速率或者负载增加时,流段就会自动扩容,通过流协议联动,流计算应用的算子也相应扩容。相应的,如果输入的数据速率或负载降低,流段就自动收缩,通过流协议联动,流计算应用的算子也相应的缩容,所有这些行为都是自动完成的,无需人工干预,这种行为体现了分布式流存储的细粒度可伸缩性。
小结
综上所述,在万物互联的智能世界里,为了实现将海量数据近实时转化成信息和决策的愿景,除了流式计算应用还需要一个流式存储系统,未来已来,已有开源的分布式流存储系统正走在这条路上。另本文仅为作者愚见,与任何组织机构无关,作者能力也很有限,如有不足之处欢迎留言批评指正。
问题思考
最后给大家留一个思考题:如果让你来设计一个分布式流存储产品,你会如何定义它的产品灵魂?
作者简介
常平,中科大硕,10年+数据相关经验,主要工作背景为分布式系统、存储、缓存、微服务、云计算以及大数据,现就职于DELL EMC。个人技术博客:https://changping.me
版权申明
本文的版权协议为 CC-BY-NC-ND license:https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh ,可以自由阅读、分享、转发、复制、分发等,限制是需署名、非商业使用(以获利为准)以及禁止演绎。