目录
前言
kafka虽然运行在jvm中,不过部署在linux居多.io模型,数据网络传输效率(linux零拷贝,win平台需要在java8的60更新才可以),社区支持度.
kafka的io模型
Kafka 客户端底层使用了 Java 的 selector,selector 在 Linux 上的实现机制是 epoll,而在 Windows 平台上的实现机制是 select。因此在这一点上将 Kafka 部署在 Linux 上是有优势的,因为能够获得更高效的 I/O 性能。
不同系统的io模型:
阻塞式 I/O、非阻塞式 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。每种 I/O 模型都有各自典型的使用场景,比如 Java 中 Socket 对象的阻塞模式和非阻塞模式就对应于前两种模型;而 Linux 中的系统调用 select 函数就属于 I/O 多路复用模型;大名鼎鼎的 epoll 系统调用则介于第三种和第四种模型之间;至于第五种模型,其实很少有 Linux 系统支持,反而是 Windows 系统提供了一个叫 IOCP 线程模型属于这一种。
磁盘
kafka的io是顺序io,因此选择ssd性能优势没那么大.
kafka内部的分片机制,冗余机制在软件层面实现了负载均衡,因此底层的raid优势不大.
磁盘大小
磁盘消息数消息大小副本数保存天数(1.1-1.2 冗余空间)*压缩比
带宽
贷款消耗大,贷款分配按照 单台*70%(过大容易出现丢包) / 3 (使用1/3的网络带宽)
参数配置
server
参数 | 参数说明 |
---|---|
log.dirs | 多个路径,csv格式,用’,’分割. |
log.dir | 单个路径,它是补充上 log.dirs |
zookeeper.connect | csv格式 zk1:port,zk2:port,多个kafka集群使用同一套zk,zk1:2181,zk2:2181,zk3:2181/kafka1和zk1:2181,zk2:2181,zk3:2181/kafka2 |
listeners | 监听器,诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。 |
advertised.listeners | Advertised 的含义表示宣称的、公布的,就是说这组监听器是 Broker 用于对外发布的 |
host.name/port | 已经过期 |
auto.create.topics.enable | 允许自建topic,最好为false,由运维严格把控 |
unclean.leader.election.enable | 允许unclean选举。kafka重只有数据较多的副本才能竞选为leader,unclean在保存数据多的副本都挂掉了,是否可以参选。若为true,在此情况会丢数据。显式设置为false |
auto.leader.rebalance.enable | 定期进行leader选举。满足一定的条件后,会更换leader。没有什么好处,设置为false |
log.rentention.{hours|minutes|ms} | 一条消息保存的时长,优先级顺序 ms,minutes,hour。虽然ms的优先级最高,不过通常设置为hour的情况多一些 |
log.rentention.bytes | broker为消息保存的总磁盘容量,默认为-1,不限制。在云上构建多租户kafka时使用 |
message.max.bytes | broker能够接收最大消息的大小,默认1000012,不到1mb |
topic
topic参数会覆盖全局broker参数
|参数 | 参数说明 |
|:–|:–|
|retention.ms|该topic消息保存时长,默认为7天|
|rentention.bytes|topic预留磁盘空间,默认-1|
|max.message.bytes|kafka borker接受topic的最大消息大小还要修改 Broker的 replica。fetch.max.bytes 保证复制正常消费还要修改配置 fetch.message.max.bytes|
设置topic级参数的方式
- 创建topic时设置
- 修改topic时设置,最好使用第二种进行修改
1 |
|
jvm参数
参数 | 参数说明 |
---|---|
KAFKA_HEAP_OPTS | 堆大小 |
KAFKA_JVM_PERFORMANCE_OPTS | 指定gc参数 |
1 |
|
堆空间设置
通用设置jvm堆为6g,默认为1g,1g太小, Kafka Broker 在与客户端进行交互时会在 JVM 堆上创建大量的 ByteBuffer 实例,Heap Size 不能太小。
gc的设置
jdk8使用g1收集器,在没有任何调优的情况下,g1表现比cms出色,更少的fullgc,需要调整的参数少。
系统参数设置
文件描述符限制:通常情况下将它设置成一个超大的值是合理的做法,比如ulimit -n 1000000,,不设置容易出现Too many open files
文件系统类型:XFS 的性能要强于 ext4,所以生产环境最好还是使用 XFS。zfs性能更强。
swappiness:网上很多文章都提到设置其为 0,将 swap 完全禁掉以防止 Kafka 进程使用 swap 空间。我个人反倒觉得还是不要设置成 0 比较好,我们可以设置成一个较小的值。为什么呢?因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警。但如果设置成一个比较小的值,当开始使用 swap 空间时,你至少能够观测到 Broker 性能开始出现急剧下降,从而给你进一步调优和诊断问题的时间。基于这个考虑,我个人建议将 swappniess 配置成一个接近 0 但不为 0 的值,比如 1。
提交时间:提交时间或者说是 Flush 落盘时间。向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入到操作系统的页缓存(Page Cache)上就可以了,随后操作系统根据 LRU 算法会定期将页缓存上的“脏”数据落盘到物理磁盘上。这个定期就是由提交时间来确定的,默认是 5 秒。一般情况下我们会认为这个时间太频繁了,可以适当地增加提交间隔来降低物理磁盘的写操作。
linux页缓存