原文链接:Aaron Wong’s Blog | Kafka入门及基础知识总结
Kafka消息引擎ABC
Apache Kafka 是一款开源的消息引擎系统
,国内一般称为消息中间
件或消息队列
,其实后两种说法不是那么精准。
- Kafka同时支持点对点模式即消息队列和发布订阅模式
- Kafka的消息结构为纯二进制字节序列
- 作为消息队列的主要应用场景为“削峰填谷”
- Kafka的几个主要概念:Broker、Topic、Partition
Kafka术语
- 消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
- 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
- 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
- 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
- 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
- 生产者:Producer。向主题发布新消息的应用程序。
- 消费者:Consumer。从主题订阅新消息的应用程序。
- 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
- 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
- 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
Kafka只是消息引擎?
Apache Kafka 是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform)。
Kafka 在设计之初就旨在提供三个方面的特性:
- 提供一套 API 实现生产者和消费者;
- 降低网络传输和磁盘存储开销;
- 实现高伸缩性架构。
都有哪些Kafka?
Kafka是及一个开源技术框架,但却是有许多发行版:
发行版 | 说明 |
---|---|
Apache Kafka | Apache Kafka,也称社区版 Kafka。优势在于迭代速度快,社区响应度高,使用它可以让你有更高的把控度;缺陷在于仅提供基础核心组件,缺失一些高级的特性。 |
Confluent Kafka | Confluent Kafka,Confluent 公司提供的 Kafka。优势在于集成了很多高级特性且由 Kafka 原班人马打造,质量上有保证;缺陷在于相关文档资料不全,普及率较低,没有太多可供参考的范例。 |
Cloudera/Hortonworks Kafka | CDH/HDP Kafka,大数据云公司提供的 Kafka,内嵌 Apache Kafka。优势在于操作简单,节省运维成本;缺陷在于把控度低,演进速度较慢。 |
Kafka版本号
上图是Kafka的安装包,Kafka是Scala语言开发的(一种JVM语言),版本号a.b-x.y.z
,a.b
是Scala的版本,x.y.z
是对应Scala编写的Kafka的版本。
各版本主要演进内容:
Kafka的线上部署架构
IO模型:主流的 I/O 模型通常有 5 种类型即阻塞式 I/O、非阻塞式 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。每种 I/O 模型都有各自典型的使用场景,比如 Java 中 Socket 对象的阻塞模式和非阻塞模式就对应于前两种模型;而 Linux 中的系统调用 select
函数就属于 I/O 多路复用模型;大名鼎鼎的 epoll
系统调用则介于第三种和第四种模型之间;至于第五种模型,其实很少有 Linux 系统支持,反而是 Windows 系统提供了一个叫 IOCP
线程模型属于这一种。
Kafka的IO模型:Kafka 客户端底层使用了 Java 的 selector,selector
在 Linux 上的实现机制是 epoll
,而在 Windows 平台上的实现机制是 select
。因此在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的 I/O 性能。
Linux系统支持IO传输零拷贝(Zero Copy)技术,在 Linux 部署 Kafka 能够享受到零拷贝技术所带来的快速数据传输特性。
Kafka对磁盘性能要求不苛刻,对可用性要求亦不苛刻,Kafka自身实现了应用级的存储高可用方案。
Kafka重要的集群参数
Broker 端参数也被称为静态参数(Static Configs)。所谓静态参数,是指你必须在 Kafka 的配置文件 server.properties
中进行设置的参数,不管你是新增、修改还是删除。同时,你必须重启 Broker 进程才能令它们生效。而主题级别参数的设置则有所不同,Kafka 提供了专门的 kafka-configs
命令来修改它们。至于 JVM 和操作系统级别参数,它们的设置方法比较通用化。
Broker 端参数
目前 Kafka Broker 提供了近 200 个参数,这其中绝大部分参数都不用你亲自过问。
# 存储信息 参数
log.dirs: #这是非常重要的参数,指定了 Broker 需要使用的若干个文件目录路径。要知道这个参数是没有默认值的,它必须由你亲自指定。
log.dir: #注意这是 dir,结尾没有 s,说明它只能表示单个路径,它是补充上一个参数用的。
# 一般而言只需要设置第一个参数,是个scv格式的多个目录,采用多块磁盘可提升性能和可用性。
# Kafka 与 ZooKeeper 相关参数
zookeeper.connect: # CSV 格式的参数,比如我可以指定它的值为zk1:2181,zk2:2181,zk3:2181
# 如果你有两套 Kafka 集群,假设分别叫它们 kafka1 和 kafka2,那么两套集群的zookeeper.connect参数可以这样指定:zk1:2181,zk2:2181,zk3:2181/kafka1和zk1:2181,zk2:2181,zk3:2181/kafka2。切记 chroot 只需要写一次,而且是加到最后的。
# Broker通讯参数
listeners: #学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
advertised.listeners: #和 listeners 相比多了个 advertised。Advertised 的含义表示宣称的、公布的,就是说这组监听器是 Broker 用于对外发布的。
host.name/port: #列出这两个参数就是想说你把它们忘掉吧,压根不要为它们指定值,毕竟都是过期的参数了。
# Topic 管理参数
auto.create.topics.enable: #是否允许自动创建 Topic,建议设置为false,避免无规划的创建topic。
unclean.leader.election.enable: #是否允许 Unclean Leader 选举,建议显式的设置为false,避免数据落后的副本可以选主成功。
auto.leader.rebalance.enable: #是否允许定期进行 Leader 选举,建议设置为false,该参数的作用是定期换主节点。
# 数据留存方面参数
log.retention.{hours|minutes|ms}: #这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说 ms 设置最高、minutes 次之、hours 最低。
log.retention.bytes: #这是指定 Broker 为消息保存的总磁盘容量大小。
message.max.bytes: #控制 Broker 能够接收的最大消息大小,建议根据实际情况设置的大一些。
Topic级别参数
Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数
# 保存消息方面
retention.ms: #规定了该 Topic 消息被保存的时长。默认是 7 天,即该 Topic 只保存最近 7 天的消息。一旦设置了这个值,它会覆盖掉 Broker 端的全局参数值。
retention.bytes: #规定了要为该 Topic 预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的 Kafka 集群中会有用武之地。当前默认值是 -1,表示可以无限使用磁盘空间。
max.message.bytes: #决定了 Kafka Broker 能够正常接收该 Topic 的最大消息大小
# 设置topic参数的方法发,启动时通过--config 指定
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic transaction --partitions 1 --replication-factor 1 \
--config retention.ms=15552000000 --config max.message.bytes=5242880
JVM参数
由于Kafka Broker 在与客户端进行交互时会在 JVM 堆上创建大量的 ByteBuffer
实例,Heap Size 不能太小。
建议采用java8以上版本,使用G1垃圾回收器,配置6G以上JVM堆内存。
export KAFKA_HEAP_OPTS=--Xms6g --Xmx6g
export KAFKA_JVM_PERFORMANCE_OPTS= -server -XX:+UseG1GC \
-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 \
-XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true
bin/kafka-server-start.sh config/server.properties
操作系统参数
Kafka 并不需要设置太多的 OS 参数,但有些因素最好还是关注一下,比如下面这几个:
- 文件描述符限制:
ulimit -n
设置个较大值,不关心它即可,避免Too many open files
- 文件系统类型:ZFS > ext4
Swappiness
网上很多文章都提到设置其为 0,将 swap 完全禁掉以防止 Kafka 进程使用 swap 空间。我个人反倒觉得还是不要设置成 0 比较好,我们可以设置成一个较小的值。为什么呢?因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警。但如果设置成一个比较小的值,当开始使用 swap 空间时,你至少能够观测到 Broker 性能开始出现急剧下降,从而给你进一步调优和诊断问题的时间。基于这个考虑,我个人建议将swappniess
配置成一个接近 0 但不为 0 的值,比如 1。思路是让系统急剧变慢而被发现,而不是直接挂掉。- 提交时间:结合实际场景设置,默认是5s。
《Kafka核心技术与实战》
上文内容来自极客时间《Kafka核心技术与实战》,胡夕老师讲的非常好,这里安利一下。