一 前言
Apache Kafka 是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform)。
搭建一个 Kafka 集群需要仔细地考量各种因素,结合自身的业务需求而制定。本文将从操作系统、磁盘、磁盘容量、带宽和节点、参数等几个方便做一个简单的列举。
二 操作系统
2.1 I/O 模型
主流的 I/O 模型通常有 5 种类型:阻塞式 I/O、非阻塞式 I/O、I/O 多路复用、信号驱动I/O 和异步 I/O。
Linux 中的系统调用 select 函数就属于 I/O 多路复用模型;闻名于世的 epoll 系统调用则介于第三种和第四种模型之间。
Kafka 客户端底层使用了 Java 的 selector,selector 在 Linux 上的实现机制是 epoll,而在 Windows 平台上的实现机制是 select。因此在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的
I/O 性能。
2.2 数据传输模式
Kafka 生产和消费的消息都是通过网络传输的,消息存放于磁盘中。所以 Kafka 需要在磁盘和网络间进行大量数据传输,而 Linux 实现了零拷贝(Zero Copy)技术。
三 磁盘选择
3.1 机械磁盘还是SSD
虽然 Kafka 大量使用磁盘,但是通常是顺序读写操作,一定程度上规避随机读写下机械磁盘操作慢的问题产生。
SSD 在这方面相对优势并没有很大,况且机械磁盘物美价廉,相对 SSD 安全性较高。所以使用普通机械磁盘是一个挺好的选择,当然钱多用 SSD 也没啥关系,不过若消息相对重要最好也做个磁盘阵列(RAID)确保下安全。
3.2 磁盘容量
需要对新增消息数、消息留存时间、平均消息大小、备份数、是否启用压缩等方面综合考虑。
假如:每天有一千万条消息(10000000),平均每条消息 1KB。需要保存 7 天。
则存储一天的消息需要容量:(10000000 * 1) / 1024 / 1024 = 9.5G。
除去消息正文外还有索引数据等等,这部分大概估算使用正文的 10%左右。保存 7 天所需容量为:9.5 + (9.5 * 0.1) * 7 = 73.15 G。
当然上面的例子只是举例,数据量看起来不大。如果你的服务每天就这点数据,那大可不必上 Kafka。
四 带宽和节点
Kafka 这类通过网络大量进行数据传输的服务而言,带宽特别容易成为性能瓶颈。
假如:Kafka 集群所在的以太网是 1Gbps 的千兆网络,正常情况下需要在 1 小时内处理 1TB 的业务数据。那这个集群应该部署多少节点才能平稳运行?
1Gbps 带宽,即每秒处理 1Gb 的数据。网上有文章提到当超过 70% 的阈值就有网络丢包的可能性了,所以这里认为每秒最大处理的数据为 700Mb。
当然这是最大理想值,如果有突发消息则可能超过这个比例。所以还要大概预留 50% 的带宽,故认为单节点使用的带宽为 350Mbps。
1 小时内处理 1TB,故每秒需要处理:1024 * 1024 / 3600 * 8 = 2336Mb。所以总共需要的节点数为:2336(每秒总需处理) / 350(单节每秒处理) = 6.6 ≈ 7台。
若消息还配置了备份,则这个数量还要 * 备份次数。
五 重要参数
5.1 Kafka 参数
存储目录相关
log.dirs:指定了 Broker 需要使用的若干个文件目录路径,如 /home/kafka1,/home/kafka2。
log.dir:单个路径,可忽略不用设置。
1 消息有效期相关
log.retention.{hour|minutes|ms}:控制一条消息数据被保存多长时间,ms 优先级最高,hour最低。
log.retention.bytes:指定 Broker 能使用多少磁盘容量保存消息。
message.max.bytes:控制 Broker 能够接收的最大消息大小,默认 1000012 字节。通常这个值需要调大一些。
2 Broker 相关
listeners:监听器,通过什么协议访问指定主机名和端口开放的 Kafka 服务。
advertised.listeners: 外网访问用的。
3 Topic 相关
Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值。
auto.create.topics.enable:是否允许自动创建 Topic,通常建议设置为 false。
unclean.leader.election.enable:是否允许 Unclean Leader 选举,false 不允许落后太多的副本竞选 Leader;true 允许落后太多的副本竞选 Leader,不过可能导致落后的数据消息丢失。通常建议设置为 false。
auto.leader.rebalance.enable:是否允许定期进行 Leader 选举。true 表示允许 Kafka 定期地对一些 Topic 分区进行Leader 重选举。通常建议设置为 false。
retention.ms:控制 Topic 消息被保存的时长,默认 7 天。
retention.bytes:控制 Topic 可使用多大的磁盘空间,默认 -1 不限制。
max.message.bytes:控制 Kafka Broker 能够正常接收该 Topic 的最大消息大小。
5.2 zookeeper 相关
zookeeper.connect:zookeeper 集群地址,如:zk1:2181,zk2:2181。若有多个 Kafka 集群(kafka1、kafka2)使用同一个zookeeper,如这样配置zk1:2181,zk2:2181/kafka1 zk1:2181,zk2:2181/kafka2。
5.3 JVM 参数
java8及以上 GC 建议用 G1,java8需要显示指定。
配置环境变量 KAFKA_HEAP_OPTS:指定堆大小,如 KAFKA_HEAP_OPTS=–Xms6g --Xmx6g。
配置环境变量 KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。
5.4 操作系统参数
- 文件描述符限制 ulimit -n limit(大一些)。
- 文件系统类型 XFS。
- swap 调优,一个小的略大于 0 的值。