面试问Kafka,这一篇全搞定(4)
日志分段存储 Kafka 规定了一个分区内的 .log 文件最大为 1G,做这个限制目的是为了方便把 .log 加载到内存去操作: 00000000000000000000.index00000000000000000000.log00000000000000000000.timeindex00000000000005367851.index00000000000005367851.log00000000000005367851.timeindex00000000000009936472.index00000000000009936472.log00000000000009936472.timeindex 这个 9936472 之类的数字,就是代表了这个日志段文件里包含的起始 Offset,也就说明这个分区里至少都写入了接近 1000 万条数据了。 Kafka Broker 有一个参数,log.segment.bytes,限定了每个日志段文件的大小,最大就是 1GB。 一个日志段文件满了,就自动开一个新的日志段文件来写入,避免单个文件过大,影响文件的读写性能,这个过程叫做 log rolling,正在被写入的那个日志段文件,叫做 active log segment。 如果大家有了解 HDFS 就会发现 NameNode 的 edits log 也会做出限制,所以这些框架都是会考虑到这些问题。 Kafka 的网络设计 Kafka 的网络设计和 Kafka 的调优有关,这也是为什么它能支持高并发的原因: 首先客户端发送请求全部会先发送给一个 Acceptor,Broker 里面会存在 3 个线程(默认是 3 个)。 这 3 个线程都是叫做 Processor,Acceptor 不会对客户端的请求做任何的处理,直接封装成一个个 socketChannel 发送给这些 Processor 形成一个队列。 发送的方式是轮询,就是先给第一个 Processor 发送,然后再给第二个,第三个,然后又回到第一个。 消费者线程去消费这些 socketChannel 时,会获取一个个 Request 请求,这些 Request 请求中就会伴随着数据。 线程池里面默认有 8 个线程,这些线程是用来处理 Request 的,解析请求,如果 Request 是写请求,就写到磁盘里。读的话返回结果。 Processor 会从 Response 中读取响应数据,然后再返回给客户端。这就是 Kafka 的网络三层架构。 所以如果我们需要对 Kafka 进行增强调优,增加 Processor 并增加线程池里面的处理线程,就可以达到效果。 Request 和 Response 那一块部分其实就是起到了一个缓存的效果,是考虑到 Processor 们生成请求太快,线程数不够不能及时处理的问题。 所以这就是一个加强版的 Reactor 网络线程模型。 总结 集群的搭建会再找时间去提及。这一篇简单地从角色到一些设计的方面讲述了 Kafka 的一些基础,在之后的更新中会继续逐步推进,进行更加深入浅出的讲解。 (编辑:ASP站长网) |