《Apache Kafka 实战》读书笔记-认识Apache Kafka

                《Apache Kafka 实战》读书笔记-认识Apache Kafka

                                           作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.kafka概要设计
  kafka在设计初衷就是为了解决互联网公司的超级大量级数据的实时传输。为了实现这个目标,kafka在设计之初就需要考虑以下四个方面:
  第一:吞吐量/延迟
  第二:消息持久化 
  第三:负载均衡和故障转移
  第四:伸缩性
1>.吞吐量/延时介绍
  我们先打个比方:若kafka处理一条消息需要花费2ms,那么计算得到的吞吐量不会超过500条消息每秒(1000ms/2ms=500条/s)。但是若我们采用批处理(batching)的思想,假设在发送前我们首先会等待一段时间(假设是8ms),那么此时消息发送的延迟变成了10ms(2ms+8ms),即延迟增加了4倍,但假设在这8ms中我们总共积累了1000条消息,那么整个系统的吞吐量就变成了100000 条/s。此时你会发现吞吐量提升了200倍!看到micor-batch的威力了吧?这就是目前诸如Storm Trident 和 Spark Streaming等消息处理平台所采用的批处理思想。 
2>.Kafka如何做到高吞吐量,低延迟的呢? 
  首先,kafka的写入操作是很快的,这主要得益于它对磁盘的使用方法的不同。虽然kafka会持久化所有数据到磁盘,但本质上每次写入操作其实都只是把数据写入到操作系统的页缓存(page cache)中,然后由操作系统自行决定什么时候把页缓存中的数据写入磁盘上。这样的设计由三个主要的优势:
  第一:操作系统页缓存是内存中分配的,所以消息写入的速度非常快;
  第二:kafka不必直接与底层的文件系统打交道。所以烦琐的I/O操作都交由操作系统来处理;
  第三:kafka写入操作采用追加写入(append)方式,避免了磁盘随机写操作(据资料统计,顺序磁盘I/O速度是毫不逊色于随机读写内存I/O速度。感兴趣的小伙伴可以使用相关工具测试一下。); 
3>.Kafka的高吞吐量,低延迟的设计目标
  第一:大量使用操作系统页缓存,内存操作速度快且命中率高; 
  第二:Kafka不直接参与物理I/O操作,而是交由最擅长此时的操作系统来完成; 
  第三:采用追加写入方式,摒弃了缓慢的磁盘随机读/写操作;
  第四:使用sendfile为代表的零拷贝技术加强网络间的数据传输效率; 
4>.消息持久化的优点
  第一:解耦消息发送和消息消费
    本质上来说,kakfa最核心的功能就是提供了生产者-消费者模式的完整解决方案。通过将消息持久化使得生产者方不再需要直接和消费者方耦合,它只是简单的把消息生产出来并交由kafka服务器保存即可,因此提升了整体的吞吐量。  
  第二:实现灵活的消息处理
    很多kafka的下游子系统(接受kafka消息的系统)都有这样的需求:对于已经处理过的消息可能在未来的某个时间点重新处理一次,即所谓的消息消息重演(message replay)。消息持久化便可以很方便地实现这样的需求。 
  第三:负载均衡和故障转移 
    作为一个功能完备的分布式系统,kafka如果只提供了最基本的消息引擎功能肯定不足以帮助它脱颖而出。一套完整的消息引擎解决方案中韩必然要提供负载均衡(load balancing)和故障转移(fail-over)功能。
    何为负载均衡?顾名思义就是让系统的负载根据一定的规则均衡地分配在所有参数工作的服务器上,从而最大限度的提升整体的运行效率。kafka实现负载均衡实际上是通过智能化的分区领导者选举(partition leader election)来实现的。 
    除了负载均衡,完备的分布式系统还支持故障转移,所谓故障转移,是指当服务器意外终止时,整个集群可以快速的检测到该失效(failure),并立即将该服务器上应用或服务自动转移到其他服务器上。故障转移通常是“心跳”和“会话“的机制来实现的。kafka服务器支持故障转移的方式就是使用绘画机制。每台kafka服务器启动后会以会话的形式把自己注册到zookeeper服务器上。一旦该服务运转出现问题,与zookeeper的会话变不能维持从而超时失效,此时kafka集群会选举出另外一台服务器来完全代替这台服务器继续提供服务。
  第四:伸缩性
    所谓伸缩性,英文名是scalability。伸缩性表示想分布式系统中增加额外的计算资源(比如CPU,内存,存储或带宽)时吞吐量提升的能力。阻碍线性扩容的一个很常见的因素就是状态的保存。我们知道,不论是哪类分布式系统,集群的每台服务器一定会维护很多内部状态。如果由服务器自己来保存这些状态信息,则必须处理一致性的问题。相反,如果服务器是无状态的,状态的保存和管理交与专门的协调服务来做(比如zookeeper)。那么整个集群的服务武器之间就无需繁重的状态共享,者极大的降低了维护复杂度。倘若要扩容集群节点,只需要简单的启动新的节点集群和进行自动负载均衡就可以了。 
  Kafka正式采用了这样的思想:每台kafka服务器上的状态统一交友zookeeper保管。扩展kafka集群也只需要一步:启动新的kafka服务器即可。当然这里需要言明的是,在kafka服务器上并不是所有的状态信息都不保存,它只保存了很轻量级的内部状态(比如从kakka 0.10.x版本之后,它将每个topic的消费者的偏移量自己维护了,把这些偏移量存放到了一个叫做“__consumer_offsets”的的topic进行维护)。
 
 
二.Kafka基本概念与术语
 
 
 
 
 
三.Kafka的使用场景
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/yinzhengjie/p/9973490.html