面试问Kafka,这一篇全搞定
应大部分的小伙伴的要求,今天这篇咱们用大白话带你认识 Kafka。 图片来自 Pexels Kafka 基础 消息系统的作用 大部分小伙伴应该都清楚,这里用机油装箱举个例子: 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。 引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。 按照刚刚前面提到的消息系统的作用,我们知道了消息系统其实就是一个模拟缓存,且仅仅是起到了缓存的作用而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。 Topic 主题 Kafka 学习了数据库里面的设计,在里面设计了 Topic(主题),这个东西类似于关系型数据库的表: 此时我需要获取中国移动的数据,那就直接监听 TopicA 即可。 Partition 分区 Kafka 还有一个概念叫 Partition(分区),分区具体在服务器上面表现起初就是一个目录。 一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。 这些分区主要的信息就存在了 .log 文件里面。跟数据库里面的分区差不多,是为了提高性能。 至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多。 Topic 和 Partition 像是 HBase 里的 Table 和 Region 的概念,Table 只是一个逻辑上的概念,真正存储数据的是 Region。 这些 Region 会分布式地存储在各个服务器上面,对应于 Kafka,也是一样,Topic 也是逻辑概念,而 Partition 就是分布式存储单元。 这个设计是保证了海量数据处理的基础。我们可以对比一下,如果 HDFS 没有 Block 的设计,一个 100T 的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入 Block 后,大文件可以分散存储在不同的服务器上。 注意: 分区会有单点故障问题,所以我们会为每个分区设置副本数。 分区的编号是从 0 开始的。 Producer 生产者 往消息系统里面发送数据的就是生产者: Consumer 消费者 从 Kafka 里读取数据的就是消费者: Message 消息 Kafka 里面的我们处理的数据叫做消息。 Kafka 的集群架构 创建一个 TopicA 的主题,3 个分区分别存储在不同的服务器,也就是 Broker 下面。 Topic 是一个逻辑上的概念,并不能直接在图中把 Topic 的相关单元画出: 需要注意:Kafka 在 0.8 版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的 Kafka。 Replica 副本 Kafka 中的 Partition 为了保证数据安全,所以每个 Partition 可以设置多个副本。 此时我们对分区 0,1,2 分别设置 3 个副本(其实设置两个副本是比较合适的): 而且其实每个副本都是有角色之分的,它们会选取一个副本作为 Leader,而其余的作为 Follower。 我们的生产者在发送数据的时候,是直接发送到 Leader Partition 里面,然后 Follower Partition 会去 Leader 那里自行同步数据,消费者消费数据的时候,也是从 Leader 那去消费数据的。 (编辑:ASP站长网) |