搭建 Kafka 前需要考虑什么方面?

一 前言

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 操作系统参数

  1. 文件描述符限制 ulimit -n limit(大一些)。
  2. 文件系统类型 XFS。
  3. swap 调优,一个小的略大于 0 的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooddance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值