读书笔记-《Apache Kafka实战》-1~3章

第一章:认识 Apache Kafka

由LinkedIn开源,贡献给Apache基金会。

核心功能:高性能的消息发送与接收。

吞吐量与延迟:

Kafka每次仅将数据写入到操作系统的页缓存中,由操作系统决定什么时候写入到磁盘。

- 操作系统页缓存是在内存中分配的,所以消息写入非常快。

- Kafka不必直接与底层文件打交道,避免繁琐的I/O操作。

- Kafka写入操作采用追加写入的方式(append),避免磁盘随机写操作。(普通的磁盘随机读写操作慢,但普通的磁盘顺序读写则可媲美内存的随机读写)

在读取数据时,如果在页缓存中命中,则将消息从页缓存发送到网络的Socket上。(即,Linux平台的sendfile,Java的FileChannel.transferTo,零拷贝技术)

消息持久化:

所有数据会被立即写入文件系统的持久化日志中。

(联想:与Redis AOF append only file的逻辑相似,并且appendfsync配置为always。即每次写入数据都落地到文件,这样安全性最高、不丢失数据,但是效率最低。)

负载均衡与故障转移:

分区领导者选举(partition leader election)实现负载均衡。

与ZooKeeper服务器的会话机制支持故障转移。

伸缩性:

Kafka服务器只保存了轻量级的内部状态,主要状态交由ZooKeeper统一管理,使其能轻松的进行扩展。

常见术语: 

消息(message):使用紧凑的二进制字节数组来保存,而非对象(堆内存)。宕机重启后可继续使用页缓存数据,无需预热。

主题(topic):用来区分业务。包含多个分区。

分区(partition):不可修改的有序消息队列,用户仅能在尾部写入消息。

副本(replica):为了防止数据丢失而存在的备份日志。Leader的replica可提供给客户端,Follower仅复制Leader的。

生产者(producer)/ 消费者(consumer):向Kafka broker发送或处理消息的客户端。

服务器(broker):Kafka集群中的一台或多台服务器。

协调者(coordinator):Kafka集群中的一个服务器,主要负责消费者组的重平衡。

领导(leader):被协调者选出的一个消费者实例。

第二章:Kafka 发展历史

Kafka最开始由Scala语言编写,而后部分功能用Java语言重写。

版本号包括Scala的版本号和Kafka自己的版本号(老系统大多是0开头的,推荐使用1.0.0)。

第三章:Kafka线上环境部署

操作系统的选型:

Linux更适合的原因:I/O模型的使用和数据网络传输效率。

I/O模型:epoll模型优于select模型。Java的Selector机制在Linux上的实现即为epoll,而在Windows上使用select。

数据网络传输效率:Java的FileChannel.transferTo在Linux中会调用sendfile,即零拷贝技术。而在Windows中,1.8以上的JDK才可以调用的Windows提供的实现零拷贝的函数。

磁盘规划:

- 机械硬盘可满足Kafka集群的要求,SSD更好

- JBOD性价比更高

磁盘容量规划:

根据这些数据进行估算:新增消息数、消息留存时间、平均消息大小、副本数、是否启用压缩。

内存规划:

- 分配更多的内存给操作系统的页缓存,至少大于一个日志段的大小

- 不要为服务器设置过大的内存堆(6GB)

CPU规划:

- 使用多核系统(8)

- 0.10.0.0之前版本的Kafka 或 客户端与服务端消息版本不一致的情况下,消息解压缩耗CPU,可适当增加资源 

带宽规划:

- 使用高速网络

- 根据自身网络条件和带宽评估Kafka集群机器数量

- 避免使用跨机房网络。(联想:带宽)

典型配置:CPU24核,内存32G,磁盘1TB 7200转 SAS盘两块,带宽1Gb/s,ulimit -n 1000000 Socket Buffer 64K

本章还提供了丰富的部署细节,这里不做笔记,需要时查阅即可。

发布了25 篇原创文章 · 获赞 12 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_25498677/article/details/87182540