00:00
啊,最后呢,我们再来看一下passa它的一些相关的内容的一个介绍,就是passa它是啊,属于一个比较新的消息队列。其实他啊,我们其实称为消息队列,但其实它呢,是啊,根据它官网的介绍,其实它成为一个啊刘原生的一个平台。啊,为什么这么说呢?其实它的一个啊,这这张图呢,其实是它官网上面一个对它所有内容的一个总结,就是他这边的话其实包含啊三部分啊,那第一部分的话就是消息,然后消息的话,它里面其实它的消息的来源呢啊,就会有很多像它的消息可能来自于数据库MY啊,Mo DB or以及或者是帕萨提现的其他的一些IO,以及是我们的其他应用程序的客户端啊那数据发给passa之后呢,啊,帕A里面它就会对数据做一些存储,然后它的数据呢,可能会存在底层的SDFS,或者是亚马逊的S3对象存储等等的这些地方,然后接下来呢,它中间还会做一些数据的处理。
01:06
啊,那这个数据处理呢,其实它就它支持了跟这种交互式的一些查询啊,像have表这些,然后呢,同时它支持啊流和批处理啊等等,然后最后呢,它也支持一些啊函数式的处理,这是它的一些能力啊那其实啊整个帕萨它的一个介绍呢,其实它呢有几个很明显的特性,就是它首先呢是啊在它的一个。啊,实现层面它将流模型和队列模型呢做了一个统一,而第二个的话就是它的它是属于一种啊从算从算分离的架构,这个我们后面会来再来看到第三个的话就是它的消息的一个强一致性的一个保证啊,第四部分的话就是的消息呢,也支持强顺序性的保证啊,第五部分的话就是它的数据的一个多租户的一些支持啊,那这个多租户呢,就是就是同一个啊租户下面啊,每一个不同的租户呢,可以可以有不同的一些权限。
02:02
啊,那整体来看我们来看啊,它的一个宏观的架构,那整体帕萨的它的一个宏观架构来看来看的话,上层是一个这边是是生产者生产消息啊交给中间呢,是我们的一个啊帕萨集群,这个pass萨集群里面的话就是分为两部分,第一部分是上层的一个broke代理集群,然后下层呢,是我们的一个bookieper,一个bookper的数据存储的一个集群,所以它其实它的存在分离呢,其实就说的是两层的一个架构,上层呢是无状态的代理啊存储啊,主要是做一个数据的读写。啊,作为客户端去啊,将我数据呢存储交给我们底层的book去存储,那下一层呢,是有状态的一个存储集群,然后存储的数据呢,最终由我们的消费者去消费啊这就是整个它的宏观的一层架构,它所有的不管是book keepper还是pass萨他们的原数据呢都有啊keepper这样一个啊中心节点来去维护那。
03:01
这就是它的一些设计的一些组件啊,它的broke里面呢,是上一层呢,都是无状态的,主要负责消息的一些传递啊,那第二层的话就是book呢,它其实是由啊,从它其实是由它的bookie节点来存储消息和游标啊内呢,其实它就会采用rock DB等等的一些啊存储引擎去做啊,作为对象的一个。啊,数据存储索引啊,第三部分就是或存储数据。啊,这一块的话,卡不其实跟卡夫卡对比的话,就是卡夫卡它其实采用的是一个单片的架构,它的单片架构呢,就是它直接是一层架构,而服务跟存储呢是耦合在一起,而帕萨呢,它采取的是一个多层的架构,每一层呢,可以单独的去扩容部署,单独管理啊这样这这种啊双层的架构里面的话,它的它的整个的灵活性呢比较啊强,同时呢,它也支持每一层的一个独立的一个伸缩。啊,那其实看完了它的宏观架构,那我们再来看微观架构,它的数据是怎么写入的呢?啊,我们以一个消息的写入过程来举例的话,那就是啊兰这边再往啊发起一次生产者发起一次数据的写的时候呢,那首先这个消息呢,会发往我们的一个萨broke节点上面,啊节点上面呢,收到这个数据之后呢,其实就会去。
04:23
将这个数据呢,又作为客户端去写给我们的bookkeper集群啊,发往我的节点,那同时在这个过程中呢,其实就会涉及到更新一些上面的一些原数据等等啊,所以他们之间呢,又会通过去更新节点。啊,那具体在写的时候呢。这就是整个它的一个大体的逻辑,然后我们来看一下在pass里面它的一个topic呢,其实啊,会对一成。我们以单分区的举例的话,它的一个topic会啊对一成单分区的一个topic的话,那这底下其实就是一个逻辑上的一个帕,那这一个帕丁呢,它其实也是分成了逻辑上分成了多段,每一段呢,其实就是就是在呃不keepper这个集凶里面,其实它为一个,就是其实也可以为一个S这样一个,同时间只有一个去激活去写,然后这一个里面呢,会存多个fra,那每一个frament就是存存储啊一到多条这样一个,那每一个里面会去存储啊一多条大概就是这样一个序,所以它也是逻辑上是按照一个有序的一个队列。
05:32
啊,那具体在这边存的时候呢,那to to的所的所有的log呢,其实啊,它这边组成就是由这边的拎,其实这张图呢,就对应到这边,就是我们每一个拎呢,其实它可能会对应以这个来说,它对应啊两个frament,那每一个fra呢,其实啊在去在去写的时候呢,我们可以这边可以看到就是它的往这里面去写的时候,一个领者一一个leader者创建的时候呢,就会去分配啊一一组集群去负责这个领者的一些数据的写入,同时呢,写的时候他需需要去指定啊,你要写入的。
06:07
呃,你要写入的一个成功的个数是几个,同时呢,有几个节点去给你响应了啊,就算写成功这样一一些参数后面我们会看到,所以它的一组什么的写在一组集群上面。啊,这就是这样一个概念,同时它的一个呢,其实是由一到多个frament来构成的啊,同一组frament会写在啊一组节点上面,啊就是这样一个逻辑。啊,那我们来看帕萨他内部的一个数据存储啊,其实我其实前面我们就以呃大概的介绍一下它的一个逻辑的一些内容,其实这边的话就是以以这个TOPIC1来说,我们看其中的一个分区,其实它也是拆在于底层来看,对于上层来看,其实它就拆成了多个S,也就是我们前面提到的啊,那每一个呢,其实它在这边呢,是会分散在底层的book节多个节点上面按照代化的去分,比如说呃,S1它其实就写到了这三个节点,然后S2呢,它又是写到了这三个节点,所以它的数据呢,是彻底打散的。
07:10
那在这种情况下面的时候,如果说我们的bookkeeper节点不够的时候,那其实就可以只只扩容下的一个。Bookieper节点就好了,然后bookie节点里面的话,其实只要增加这个节点的时候啊,我们数据写入的时候呢,它自动就会调代化的写入到对应这边的节点上面过来啊,这就起到一个扩容的集啊,扩容的一个效果,同时呢,也不也不用去做一个数据的一些重平衡等等。啊,那pass萨他的一个写的过程呢,其实就是客户端啊,发我一个发我一个topic去发了一个消息之后的话啊,那首先去啊,我这里面如果说没有的时候去创建一个,有的话就直接直接往这里面broke pass broke呢作为一个户往bookper集群里面去啊,分别去写入,并行的写入这些数据,写入之后呢,由这些节点啊响应之后呢,他又又开始在上层拿到之后再去响应上层的客户端啊然后读的过程中呢,那它的读呢,首先是会啊有两种情况,第一种的话就是如果这个数据是最近写入的,它会缓存在我们的博节点内部,所以呢,它读的时候首先从broke的一个看里面去读啊,如果这一步看里面没读到,那他会从底层的一个book啊集里面去读,那集群里面读的时候呢。
08:29
啊,它是会首先去找到这一这一个消息存储在这一个节点啊,哪些节点上面,然后呢,找到这些哪些节点之后呢,随意去找一个节点去读取这个数据,如果读取的时候这个节点啊超时,超时之前还没有返回的话,他又会发起往起这这一批节点里面的,就是存储这个消息的一批节点里面的其他一个节点去做一个啊看MIS read的这样一个过程。啊,其实我们再来扩展介绍一下啊,Bookkeper里面它的一些啊简单的一些内容吧,啊,其实bookkeper里面整个bookkeper呢,它其实啊,对于其实在passa里面的话,它其实是啊,处于一个数据存储的一个角色,那上层的pass里面的对于book而言就是一个客户端啊bookieber里面的话,它对于上层而言,它暴露了两套API,第一层就是API,这个是比较高级的那哦。
09:26
B级比较低级的第二层的话就是一个stream的一套API啊,这个是比较高级的,那可以看到这两层API的,他们对底层来说都是去操作一个bookie啊bookie节点,然后去操作他们的数据,原数据呢也是交给IE来维护啊,那bookie per它的一个架构呢,主要有几个特点啊,第一个就是多个副本啊,可以这边可以看到,同时呢,它有一个数据的持久性,就是复制成功之后呢,可以实现啊持久化的存储这个数据强制呢就刷盘,然后第三个就是它通过啊简单可重复读取的一致性模型呢,保证了不同读者之间的一个啊读取的一致性。第四个就是它的可用性呢,其实是通过example这样一个参数来去设置的,然后D延时呢,它其实通过IO的一个隔离来进行一个啊读写的延迟啊,后面我们会来看到。
10:17
那我们来看对于bookkeeper里面,它的一次数据的读写过程啊,啊大概是这样,就是它比如说往这个bookkeper里面去,节点里面去加一条数据的话,它有三个参数要去设置,第一个参数的话,就是啊,你的这条数据要啊往哪几个。Book上面去存储啊,这个离者对应的A啊,怎么来理解呢?就是说啊,比如说我现在这边有我我我现在要这边有bookper的一个,整个是一个bookkeper的,呃,底层bookie的一个集群嘛,啊它比如说有十个节点,那我呢,首先要写的时候,需要从这个十个节点里面去选五个节点,然后呢,去从我的数据那选出这五个节点之后呢,那我一条数据我要对应几个副本,就是你要写几个节点啊,比如说我要写三个节点啊,那就是五五个节点来从数据,那实际上我只需要三个副本,那三个副本有几条写入成功之后呢,就算成功的呢,就响应了呢,其实就是一个ACK的一个Co啊,其实这边比如说我三个副本里面两个写成功我就响应了。
11:19
那其实就对应的是一个532的这样一个配置啊,这就是整个一个特点,我们来看啊,对于它的一个写入的高可用,就是这个em这个节点啊,这个变化,当正在写入的这个数据的book发生故障的时候啊,客户端它会。重新选择一个数据的放置,比如说这个啊BOOK5发出故障之后呢,它就会啊,首先提首先关闭到当前的这个,然后呢,重新再选一组节点再来写入啊这样一个数据读时读的时候呢,它的因为它的读呢是一个随机读,就是一些系统呢它啊,因为有些系统呢,它仅这些仅支持从leader来读取数据,比如说卡夫卡或者不keep,不啊卡夫卡而不keep它是可以啊,比如说一条数据写入的这三个节点啊,我们这边比如写入了234,那他读的时候呢,可其实可以从234任意一个节点来进行读啊,这样的话,其实可以将流量分散到多个book上面去,同时呢,还能减少一些追尾读的一些延迟啊,这其实就是bookie bookieper的一些啊,最基本的一些原理。
12:20
啊,其实它的数据组织呢,前面我们也大概介绍一下啊,它的一个log呢,其实就对应的就是一个leader,它leader呢,逻辑上就是也是一个有序的一个结构,那每一个呢,有多一到多个构成啊,每一个呢又有一到多个A来构成,每每一个的话,它又由我们的啊,其实就是。这个A结构呢,其实就对,就对应的是我们的message,其实啊,就是你的离ID是多少,你的啊离ID是多少,ID是多少,然后呢啊这些等等的等等的信息以及数据啊,这边呢,其实就来写的话,对于一个fragment写的时候,我们可就可以看到啊,比如说我选三个节,三个节点来去写,同时呢,副本也是三个,那基本上就是每个节点都来写,就是这样一个过程,如果说我选五个节点啊,副本呢只想写三份,那就是他按照乔态化的方式来写,第一种就是。
13:16
首先呢,第一条数据124这三个节点写。然后接下来第二条数据按照这三个节点写,接下来的三条数据按照这个节点写,他就是按照这样一个条代化的写,如果这边啊需要容量不够的话,在新加节点的话,其实就按照条件化,它每个节点都可以去自动的去分发掉我们的一个数据。啊,其实book keepper它内部的原理呢,啊,基本上就是这张图其实就比较形象,我们来看它首先来怎么来看呢?我们首先来看write的这个过程,就是写的时候,它第一步啊,首先就是在它内部是往它的一个,呃,就是。周入这样一个日志文件里面去写,就是首先记录日志啊,记录完日志之后的话,那第二步再做一个,将这个日志呢做一个啊底层的一个磁盘上面的主提交啊,提交完之后的话,这第一步第二步第三步的话,再将这个数据呢,写入到我们的一个table里面,就是内存内存表里面啊,记录到内存表里面之后的话,那第四步的话,其实就可以返回给上层啊,说这条数据已经写成功了。
14:20
啊,然后接下来的话,那对于member table里面的数据呢?啊,其实他这边会做两部分处理,第一部分的话就是他加他们的一个啊这边的数据呢,会啊,首先的话它会分成两类,第一类的话就是索引数据,第二类的话就是日志数据,那日志数据的话就是所有的这些数据呢,会存到离的这样一个磁盘里面去,而对于啊所引数据的话,它就会存到一个底层的索引的磁盘啊这边的话,其实它就会采用一个rock DB这种去存啊,其实这个结构的话,很像是我们的一个lsm数的啊,数的一些时间,比如说level DB或者RODB啊,它也有一个啊它的日志日志日志结构WL来做化日志啊,Table做它的数据的一个内存的结构,然后底层的磁盘呢,用ss table去维护它这边底层呢,其实它的底层呢,就是数据呢,是按照那个是有序存储的,它的索引呢,其实就是将我们的同一个啊。
15:20
的hid映射成我们这个磁盘上面写入的一个位置啊,大概就是这样一个意思,那读的时候呢,也就是首先读的时候先首先读table table没有,然后再去读索引啊,索引里面读到之后啊,读到索引数据之后呢,再再去读这个log里面的数据啊,就是这样一个过程,其实很类似于LSSM数的lsm数的一些原理。其实我们最后的话再来看一下帕萨,他写入整个写入bookkeeper的一个一个过程吧,就是这边的话,就是我们可以看到这边的话,就是对于。
16:00
啊topic来说的话,它其实上层pass的一些数据,那对于它结合写入到啊book keepper里面的时候呢,第一步就是首先往它的这个日志文件里面去写,WL写日志啊,日志记录完之后呢,做一个主题要刷盘动作,盘完了之后再往啊right里面就是我们的写写缓存里面写,其实就是一个啊map table里面写,写完之后的话,那数据的话,最终呢啊定时的去异步刷到一个啊log h的这样一个数据文件里面去,同时呢再再去将索引也写进去,所以呢,一般会用用KV的这种rock DB去从啊就是这样一个结构,读的时候呢,首先读看看里面读不到,然后再去读,首先查索引,查到之后呢,再去读我们的一个日志数据。啊,这个过程跟前面的其实是啊有所介绍的,其实再来看一下啊,整个结合在一起来看的话,就是一个topic啊,生产者这边呢,其实会有一到多个去啊写我们的topic,那这个topic呢,其实它会对应一到多个的一个订阅者啊,也就是消费者啊,那其实这边的话,我们来来看一个topic呢,他只会去出被我们的一个啊pass的一个broke去拿到,拿到之后呢,他去写的时候呢,那一个又会对应一到多个FRA111个frament呢,又会对应多一到多条我们的构成,那这个呢,最终有一到多个我们的message构成啊,同时呢,我们的frament呢,它就会存到book word example上面,然后呢,数据存到bookie里面。
17:34
啊,整个的过程其实就是这样的一些过程。啊,其实其实介绍完这些的话,那对于帕萨里面它的一个故障的恢复的过程中啊,因为它上层的是无状态代理,所以呢,它的一个如果说坏掉之后的话,那其实只需要将这个啊负责的一个topic的盘提式呢,迁移到另外一个上面去啊,就交给啊,就是将这个的选择权呢,交给另外的,将这个帕提式的啊写入的一些啊控制权交给其他的就好了,这个节点就可以删掉了,其实这个过程是比较清亮的啊,如果说它底层的一个数,Bookie里面的一个数据,一个节点故障,或者是一个数据故障之后的话啊,首先的话是在啊bookie这一层的话,它其实它支持内部数据的一个修复啊,就是说比如说以这个C4来说的话,比如说它最初写在了这样一个。
18:30
呃,234节点上面,如果说二节点上面的数据坏掉之后的话啊,它后面呢,它就是检测到之后,可以拿三个四的数据来去修复出一份C的四,然后再放到一节点上面去,所以它也就避免了像卡夫卡一样啊,存在了一个就是一份数据啊,坏掉之后它需要去拷贝整个分区的数据,然后才能达到一个呃,完整的一个恢复的过程。所以这个过程也比较轻量级。啊,其实最后的话就是帕萨他的一个啊消费的模型吧,其实这个消费模型在前面我们介绍的时候其实也提到了,它是将队列模型和流模型做了一个统一,那队列模型呢,简单的就是一个订阅者被一个消费者去消费,这是一个订阅模型,然后呢,这边的一个非O呢,啊,其实就是一个独占式的一个模型啊,就是呢。
19:21
啊,如果说我们的一个消费者呢,其实他可以被多个队列去监听,然后呢,其中一个队列呢去消费,然后当啊这一个消费者挂掉之后呢,其他的队列再来补上,然后共享式的呢,就是它其实就是。将这样将这样一个队列里面的数据呢,可以去共享给多个消费者去消费啊,我们可以看到就是这样一个过程,然后K上呢,就是可以按照K进行一个哈希啊进行消费,这其实就是对立模型上面的其实就是一个流模型。啊,整个这其实就是帕萨他们的几种啊类型,其实这边呢就是啊,可以看到它的一个流某型,就是这是一种独占式的订阅,然后呢,这是一个故障啊,故障切换的一种订阅,这两种都是流模型,然后队列模型呢,其实就是一个队列被多个消费者去共享啊,类似于就是就是这样子,然后他然后因为前面提到了,其实像卡夫卡或者M其实是做不到这种的啊,它的一队列能被一个消费去使用,而萨它就支持的这种啊,一个队列呢,可以被多个消费者去共享订阅啊,然后呢,同时按K的这种呢,也是一样的啊,下面呢是队列模型,上面呢其实就是流模型。
20:35
啊,整个最后的话就来提一下帕萨的一个生态,其实它的生态里面的话,上层呢,是一个帕萨的IO,就是数据的来源,来源之后被封装成我们的一个message,然后这个message呢啊存储到broke上面,然后呢再可以经过它的其他的一些处理环节进行处理啊,不管是流处理或者是啊函数式的处理,处理完之后呢,存储到一些啊流留存处里面去啊留存处里面存储完了之后呢,可以通过这样一个circle来进行pass circle来进行啊查询或者分期啊底存的存储呢,像快存储或者是HDFS等等啊,其实它就是一套啊流原生的一套。
21:14
平台啊,这个呢,就是整个帕萨的一些生态。呃,最后我们再总结一下,其实整个这一系,整个啊这一套。啊教程呢,我们主要其实介绍了啊以下几部分内容啊,首先呢,介绍了消息队列整体的一个设计思想,然后接着呢,我们介绍了啊其实的一些工作的一些原理啊,其实重呃呢,其实只是简单的介绍了一些内部的一些啊东西,主要呢也是工作中其实啊越来越用的比较少了,然后后面呢,其实重点介绍了像卡夫卡它的。
22:00
数据存储模型啊,以及它的集群的一些啊,数据复制和同步。后面接着介绍了rocket MQ它的一些呃,数据的一些存储模型,以及它和卡夫卡之间的一些差异啊,以及它的一些集群之间的一些特点啊,最后呢,又介绍了帕萨里面的一些内容啊,主要呢,其实帕萨里面的内容呢,它是一个啊新一代的消息消息平台,同时呢,它里面的架构呢,也是比较新颖,其实在这一部分内容的话。主要还是重点介绍的PA里面的一些。它的数据读写,以及它的一些扩容,故障转移,以及最后呢,也其实也简单的介绍一下book keepper里面它的一些啊大概的一些原理,其实book里面它还有一些它的强抑制性的一些啊原理,这一这一部分内容其实没有没有补充进来啊,后面有时间的话再来做一个啊学习和介绍啊,然后整个这一系列教程的话,其实啊,可能耗时主要是两个多小时,其实主要是想啊将这一系列的内容啊。
23:06
作为一个完整的一个体系啊,分享出来也是之记录之前学习的一段过程,然后呢,也是做一个备忘录啊,然后呢,同时也希望能够对啊正在研究消息队列或者是啊有对消息队列感兴趣的啊小伙伴起到一些啊或多或少的一些帮助,或者是。啊,借鉴吧,谢谢大家,整个这一系列内容就告一段落。啊同时呢,如果呃有有部分内容讲讲的或者是理解不对的地方,大家可以在评论区或者是呃其他的方式再来跟我进行交流或者讨论吧,啊然后啊,谢于本人水平有限啊,感谢大家的理解和大家的一个支持。
我来说两句