• java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

  • java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

kafka-集群部署

目录

  • 目录
  • 前言
    • kafka的io模型
    • 磁盘
      • 磁盘大小
    • 带宽
  • 参数配置
    • server
    • topic
    • jvm参数
    • 系统参数设置

前言

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级参数的方式

  1. 创建topic时设置
  2. 修改topic时设置,最好使用第二种进行修改
1
2
3
4
5

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


bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name transaction --alter --add-config max.message.bytes=10485760

jvm参数

参数 参数说明
KAFKA_HEAP_OPTS 堆大小
KAFKA_JVM_PERFORMANCE_OPTS 指定gc参数
1
2
3
4

$> 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

堆空间设置
通用设置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页缓存

kafka-基础
kafka-admin-client
  1. 1. 目录
  2. 2. 前言
    1. 2.1. kafka的io模型
    2. 2.2. 磁盘
      1. 2.2.1. 磁盘大小
    3. 2.3. 带宽
  3. 3. 参数配置
    1. 3.1. server
    2. 3.2. topic
    3. 3.3. jvm参数
    4. 3.4. 系统参数设置
© 2023 haoxp
Hexo theme