早些时候,我们了解了 CAP 理论 ( )。该理论指出在分布式系统中,一致性、可用性和分区容错性不能同时满足,指导了分布式数据存储系统的设计。
随着数据量和访问量的增加,单机的性能已经不能满足用户的需求,分布式集群存储成为了常用的方法。将数据分布在多个存储节点上,可以为大规模应用提供大容量、高性能、高可用、高扩展性的存储服务。但是,分布式存储系统是它的具体实现。
在今天的文章中,我将带大家学习分布式存储系统的关键三要素,让大家对分布式数据存储系统有一个直观的认识。在接下来的几篇文章中,我将进一步展开这三要素中的关键技术,帮助大家更深入地理解分布式数据存储系统。
接下来我们来打卡分布式存储系统的三要素:顾客、导购、货架。
01 什么是分布式数据存储系统?
分布式存储系统的核心逻辑是将用户需要存储的数据按照一定的规则存储在不同的机器上,当用户想要获取指定的数据时,可以从存储数据的机器上获取根据规则。
如下图所示,当用户(即应用程序)想要访问数据D时,分布式运行引擎引导用户到数据D所属的存储节点获取数据。
静下心来想一想,整个获取数据的过程是不是有点类似于去商店购物的过程?
当顾客到商店购物时,导购员会根据顾客要购买的商品,引导顾客到相应的货架上,然后顾客从货架上拿到要购买的商品,完成购物。这里的顾客就是图中的应用程序,导购相当于一个分布式运行引擎。它会按照一定的规则找到对应的架子,架子就是存储数据的不同机器节点。
这个过程其实就是分布式存储系统中获取数据的一般过程。顾客、导购、货架构成分布式存储系统的三要素,分别对应数据生产者/消费者、数据索引、数据存储。
接下来,让我们仔细看看这三个要素。
02分布式数据存储系统的三要素
客户是数据的生产者和消费者,也就是说,客户代表着两种角色。生产者会生产数据(比如商店购物例子中的供应商就是生产客户),并将数据存储在分布式数据存储系统中,消费者从分布式数据存储系统中获取数据进行消费(比如购买商品的用户在商店购物示例中属于消费者客户);导购是数据索引,将访问数据的请求转发到数据所在的存储节点;货架是存储数据的存储设备。
01客户:生产消费数据
客户相当于分布式存储系统中的应用程序,数据是应用程序的驱动力。根据数据的产生和使用,客户分为生产者和消费者两类。生产者负责向存储系统添加数据,而消费者可以消费存储在系统中的数据。
就像火车票存储系统,如图所示,铁路局相当于生产者型客户,乘客相当于消费者型客户。铁路局将各线路的火车票信息发布到订票网站后台数据库,旅客通过订票网站访问数据库,进行查询余票、订票、退票等操作。
生产者和消费者生产和消费的数据通常是多种多样的,不同应用场景的数据类型和格式也不同。根据数据的特点,这些不同的数据通常分为三类:结构化数据、半结构化数据和非结构化数据。
02导购:确定数据位置
导购是分布式存储系统的一个重要组成部分。如果没有导购员,顾客需要一件一件地寻找自己想要的商品。
想象一下,如果你去一个订票网站订火车票,根据你的需要点击查询车票,系统会一一扫描分布式存储系统中每台机器的数据,找到你要的火车票想购买。如果系统存储的数据不多,响应时间也不会太长,毕竟电脑的速度还是很快的;但是如果数据分布在几千甚至几万台机器上,系统会一台一台扫描机器给你回复,相信你会对这个订票网站很失望。
这种定位数据存储位置的方式会浪费你大量的时间,严重影响购票体验。因此,在分布式存储系统中,必须有相应的数据导购,否则系统响应会很慢,效率会很低。为了解决这个问题,数据分片技术进入了分布式存储系统的大家庭。
数据分片技术是指分布式存储系统按照一定的规则将数据存储在相应的存储节点中,或者从相应的存储节点中获取需要的数据。这是一种很常见的导购技术。该技术一方面可以降低单个存储节点的存储和访问压力;另一方面,可以通过指定的规则快速找到数据所在的存储节点主存储是计算机系统的记忆设备,从而大大降低查找延迟,提升用户体验。
也就是说,铁路局在发布每条线路的火车票信息时,都会按照一定的规则存储在相应的机器中。比如北京到上海的火车票存放在A机,西安到重庆的火车票存放在B机。旅客查询火车票时,系统可以根据查询条件快速定位到相应的存票机,然后将数据返回给用户,大大缩短了响应时间。如图所示,在查询京沪火车票相关信息时,可以与机器A进行数据交互。
本例中根据数据的起点和终点对数据进行划分,将数据划分为若干部分存储在不同的机器节点上,是一种数据分片技术。查询数据时,系统可以根据查询条件快速找到对应的存储节点,从而实现快速响应。
在上面的例子中,数据是根据数据的特性进行分片的。当然,还有很多其他的数据分片方案。比如根据数据范围,通过hash map,consistent hash ring等对数据进行划分。下一篇文章,我会详细介绍hashing和consistent hashing。
下面具体介绍一下data range的数据分片方案。
数据范围的数据分片方案是指按照一定的规则划分数据范围,然后将这个范围内的数据分配给一个集合。这就像数学中通常提到的整数范围,比如从1到1000的整数,整数[1,100]属于一个子集,整数[101,1000]属于另一个子集。
对于上面提到的火车票案例,如果对数据范围进行切分,则可以将属于某条线路的所有火车票数据划分成一个子集或分区进行存储。比如A机存储的是京广线的火车票数据,B机存储的是京沪线的火车票数据。也就是说data range的方案就是按照range或者range进行存储或者查询。
如图所示,当用户查询京沪火车票信息时,首先判断查询条件属于哪个范围。由于京沪班列属于京沪线,系统按照规则将查询请求转至京沪线。上海线火车票数据的机器B然后由机器B处理并将响应结果返回给用户。
为了提高分布式系统的可用性和可靠性,除了通过数据分片来降低单节点的压力外,数据复制也是一个非常重要的方法。数据复制就是备份数据,让多个节点可以存储数据。
想象一下,当一个存储节点发生故障时,如果只采用数据分片技术,这个节点的数据就会丢失,给用户造成损失。因此,数据复制在分布式存储系统中是必不可少的。关于数据复制技术,我会在第26篇为大家详细讲解。
下面我就和大家说说数据复制和数据分片技术的区别。对于它们之间的区别,大家可以先看下图:
数据A被拆分成两部分存储在两个节点Node1和Node2上,属于数据分片;而对于数据B,在两个节点上都存储了相同的完整数据,属于数据复制。
在实际的分布式存储系统中,数据分片和数据复制通常并存:
说到这里,我提取了Kafka集群消息存储架构图,如下图。
消息数据存储在Partition(分区)中,一个Topic(主题)可以由多个Partition存储,Partition可以分发给多个Broker;同时,Kafka还提供了Partition复制机制(备份分区存储的信息主存储是计算机系统的记忆设备,例如Broker 1中的Topic-1 Partition-0是Broker 0上Topic-1 Partition-0的备份),从而保证消息存储的可靠性。
这是一个典型的数据分片和数据复制并存的应用场景。
03 shelf:存储数据
货架是用来存储数据的,因为数据是由客户产生和消费的,所以货架上存储的数据类型与客户生产和消费的数据类型一致,包括结构化数据、半结构化数据和非结构化数据数据。数据。
针对这三种不同的数据类型,存储“货架”大致可以分为以下三种:
至于货架材质,即存储介质的选择,其实质就是选择数据存储在磁盘还是内存(缓存):
总结
今天主要和大家分享分布式数据存储系统的三个要素,即客户、导购、货架。分布式字段对应的术语是数据生产者/消费者、数据索引、数据存储。
其中,客户包括产生数据的客户和消费数据的客户两类;导购是数据索引引擎,包括存储数据时确定数据的位置,获取数据时确定数据的位置;货架负责数据存储,包括磁盘、缓存等存储介质。
在不同的应用场景下,客户产生的数据类型和格式通常是不同的。根据数据的特点,这些不同的数据可以分为三类:结构化数据、半结构化数据和非结构化数据。相应的,货架也是一种数据存储系统,同样包括分布式数据库、分布式键值系统、分布式文件系统三大类。
对于分布式数据库和分布式文件系统的主流框架,我在“知识扩展模块”中进行了对比分析,方便大家的理解、记忆和应用。至于分布式key-value系统,我会在第27篇详细介绍。
最后,让我通过思维导图来总结一下今天的核心知识点。
相信通过今天的学习,大家对分布式数据存储有了更深入的了解,对其核心作用和关键技术有了更清晰的认识。希望对您有所帮助。
关于建筑师培训
本期旨在分享一线互联网、分布式和高并发等相关话题的各种技术架构方案,同时也会整理和分享作者的学习总结。
更多技术话题敬请关注