00:00
好,接下来呢,我们来看一下卡普卡如何做到高效的读写数据,那这道题呢,是非常非常高频的一道面试题,所有人必须都得会,那下面来看总结一下啊,第一条就是卡瓦呢,本身它就是一个分布式集群。很好理解,分布式集群,多台服务器来解决一件事儿,那效率肯定要高一些,很好。第二件事儿呢,就是它采用了分区技术。那采用分区技术之前咱们研究过分区的一个好处,首先呢,它可以把海量的数据切割成一块一块的解决了存储问题。那同时呢,针对这个生产和消费的话,也可以提高生产者对应的并行度,同时呢,还可以增加消费者的并行度,那么无论你是上传数据还是下载数据,这种速度都要快一些,哎,这是这个分布式集群加上分区技术。那另一个呢,就是读数据,采用的是稀疏索引,可以快速定位要消费的一个数据啊。
01:04
那这里面你看它底层存储数据的时候,是以三格门的形式进行存储的,默认的是一个G,那如果你直接去查一个G的文件的话,那相当来说是不是要慢一些,哎,那他给你创建了一个index索引,方便你进行一个定位,那这样呢,读数据的时候啊,要快一些啊。好,那再往下看,下面呢,是它底层啊,采用的一个叫顺序读写数据,还记得我们之前讲文件存储机制的时候说呀,他这个数据呢,是以追加的形式,追加到segment的后缀。比如说追加,那就是顺序的追加,啥意思呢?哎,就相当于啊宋老师呢,在三里屯相当于是VIP,他有固定的房间。那么他接完一个客人之后,数据接下一个下一个下一个,哎,这里面是有固定的一个顺序的,那这个速度能达多少呢?哎,最快的时候能达到600兆每秒。
02:00
那反过来,哎,像这个,呃,其他老师,其他老师呢,在三里屯啊,就不是这种VIP这种形式,你说接完一个客人之后,下一个客人在哪呢,还不知道呢,对不对,哎得这等那这样的这个速度啊,就要慢一些。那这个一般呢,就是100K每秒啊,相差这个速度呢,还是非常非常大的啊,比如说它采用的是顺序读写啊这种方式啊。那再往下还有呢,就是采用缓存和对应的零拷贝技术。那这个好像有点陌生是吧,来我们来看一下。首先来看一下零拷贝,那零拷贝呢,我们先不解释,先假设一下,假设我们这个考法呀,没有采用零拷贝技术,那它应该怎样的一个进行读写数据呢?首先呢,生产者向这个卡法集群发送数据,那发送数据他会把数据发送到哪里呢?诶,他直接就交给了Linux系统内核。如果Linux系统内核不太清楚的话,你可以想想这个安卓安卓系统对吧,安卓系统下面有一些驱动程序。
03:06
那么这个驱动程序是用来操作你系统硬件的。哎,操作这些电容啊,电阻啊,这些硬件。那么这个数据过来之后,他会直接把它落盘吗?不会哎。这个Linux系统啊,它也有对应的缓存,那这个缓存呢,就是页缓存。叫异黄醇,比如说你数据过来之后,那这个数据什么时候落盘,取决于谁呢?哎,取决于这个利用内核。他来管什么时候往这里面写,那卡法呢,不需要进行操作。那这里面详细说一下这个页缓存,你说卡不卡呢?重度依赖于底层的操作系统提供的页缓存功能。当上层有写操作时,操作系统只是将数据写入到页,缓存只往这里面写,剩下这就不管了。那外部系统来读数据的时候怎么办呢?你直接从页缓存读数据就行了。
04:00
那你说海哥那没找到怎么办呢?哎,如果从液缓存里面没找到,那它会这样,它会加载。往这里把这个文件加载到页缓存里面,再对外提供数据,是这样做的哈,好,那下面呢,比如说这个数据啊,在页缓存一部分啊,文件当中一部分,那现在呢,消费者来消费卡卡集群的数据。那一消费一申请,那是不是要调应用层代码啊,这是假设的啊调应程代码哎,我要读数据,那好读完数据之后,我对这个数据处理完了,我是不是接下来要发给这消费者呀,那怎么发呢。发送数据要走网络通讯,记住。这是跨服务器通信,你说消费者和卡帕集群不一定在一个服务器上。那跨节点通讯就要走这个网卡,那走网卡,你这是应用层代码,你要想走的话。诶,得给到这个Linux系统的那叫s catch,其实还是一缓存啊,还是缓存数据,缓存数据之后呢,然后给到网卡之后。
05:03
通过绑卡把数据发过去。是这样一套流程。那么卡瓦底层它是不是这么做的呢?哎,他不是这么做的,它采用的是一个零拷贝技术。怎么拷贝的呢?生产者发生过来数据仍然是先进入到页缓存,那么剩下的事儿就交linu系统内核来管理的,是持久化到磁盘,还是在内存当中进行一个保存,那他说了算。那接下来假如说保存到文件当中。那下边呢,还是消费者来请求消费数据。OK,那一请求消费数据,他先查看一下页缓存里面有没有数据,如果有的话直接应答没有,那从文件里面进行一个加载,这个过程是一模一样的,那主要差距在哪呢?差距在这个位置。他直接走网卡,把数据给过去了,比如说并没有走应用层这块代码。那有同学该撤了,说为什么没有走这块代码呢?
06:00
哎,本质原因是在这儿啊,看一下这块说卡broke应用层不关心存储的数据,所以就不用走应用层,传输效率更高。啥意思?大家回忆一下卡布亚集群,他干了什么事?他是不是只把数据读过来之后看。存下去之后,就等着消费者来消费就完事了。有没有说把它加载到这个卡法集群内那个应用层代码里面,哎,然后进行一个对数据处理,没有吧,没有修改它任何一个内容吧,也就说在卡法基金当中没有对他做任何其他方面的修改。他根本关心,那所有对数据的操作放在哪了呢?这就是卡马聪明的地方,所有对数据操作的地方都放在了生产者和消费者上。还记得生产者代码吗?首先创建了一个生产者,之后调用散的方法,哎,然后进行一个拦截器,然后序列化这样一个过程。是吧,哎,然后之后呢,通过这个分区。
07:02
啊,分离器发出去。那那如果你想对数据修改的话,你完全可以在这个拦截器这地方对数据进行你想要做的一些修改。那这样就OK了,那同样道理,你数据这个消费者这块,他拉取过来数据之后,仍然是要经过反新对化器,经过拦截器,然后再对数据进行处理,哎,也就说在基金端没有对他做任何形式的一个修改。那这样呢,他就做到了这个高效读写啊行,那我们稍微总结一下卡巴高效读写的几个方面啊,第一个呢,就是卡巴本身是分布式集群,采用了分析技术,接下来呢,它的读数据呢,采用的是稀疏索引,可以快速的定位消费的数据,接下来呢是顺序读写,可以达到呢600兆每秒。同时呢,它又采用了缓存技术,哎,以及呢,零拷贝技术,效率呢更加高效。
我来说两句