欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《kafka权威指南》之基本配置和调优

程序员文章站 2022-06-14 10:53:39
...

什么是kafka

Kafka是一基于发布/订阅的分布式消息系统,它不仅能高效并实时的吞吐数据,而且还可以通过副本冗余机制保证数据安全

kafka关键字介绍

  • ***(offset):每个分区都会append多个有顺序,不可变的消息
  • 生产者(producer):生产消息到kafka集群
  • 消费者(consumer):从kafka集群中消费消息
  • 消费者组(consumer group):组间共享,组内竞争。每条消息只会被组内的一个消费者消费,保证组内不重复消费消息
  • 主题(topic):每条消息都属于某主题-表
  • 分区(partition):每个主题会分配多个分区,是一个有序队列-记录
  • 副本(replication):分区和副本不能在同一台机器上
  • leader:分区的角色,生产者和消费者交互的分区
  • flower:分区的角色,负责复制leader中的数据
  • broker:kafka集群中的机器
  • controller:服务器的角色,用来进行leader选举以及失败恢复

kafka基本指令

  1. 增加主题-指定zk,主题,分区,副本数
sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 1 --partitions 1 --topic topicname
  1. 删除主题
sh kafka-topics.sh --delete --zookeeper hadoop01:2181 --topic  enbook
  1. 查看主题
sh kafka-topics.sh --list --zookeeper hadoop01:2181
  1. 启动生产者(只需写一台地址)
sh kafka-console-producer.sh --broker-list hadoop01:9092  --topic  enbook
  1. 启动消费者(只需写一台地址)
sh kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic enbook --from-beginning

kafka基本配置

  1. broker.id port
  2. zookeeper.connect 保存broker远数的zk地址
  3. log.dirs 指定消息日志片段的目录
  4. num.recovery.threads.per.data.dir 每个目录恢复使用的线程数
  5. auto.create.topics.enable 自动创建主题
    主题的配置
  6. num.partitions 指定主题包含的分区数,通过增加主题的分区数,可以使得kafka吞吐率线性提高,而且可以实现负载均衡的作用
    若需要每秒钟从主题读写1GB的数据,而且消费者吞吐量为50MB,则至少需要20个分区,然后让20个消费者同时消费
  7. log.retention.ms 配置分区的数据持久化时间限制,若超过则消息删除
  8. log.renetion.bytes 配置分区的数据持久化字节限制,若超过则消息删除
  9. log.segement.bytes 配置日志片段的字节限制,若超过则创建新得日志片段,旧的日志片段开始过期
  10. log.segement.ms 配置日志片段的时间限制,需要考虑并行关闭多个日志片段对磁盘性能的影响(多个日志片段达不到上限,则会出现多个日志片段同时关闭的情况)
  11. message.mex.bytes 配置消息字节限制,默认1mb,值越大处理时间越长,还会增加磁盘写入块的时间

kafka集群

  1. 可以跨服务器进行负载均衡
  2. 使用复制功能避免单点故障造成的数据丢失

需要多少个broker

  1. kafka集群需要保存的数据量&单个broker的存储空间,复制会加一倍空间
  2. 考虑集群吞吐量和内存不足造成的性能问题

broker配置

怎么将一个broker加入到集群呢???
修改两个配置

  1. 配置相同的zookeeper.connect
  2. 配置broker的broker.id

操作系统调优

  1. 虚拟内存
    Linux的虚拟内存根据系统的工作负荷进行自动调整,我们可以对交换分区的处理方式内存脏页进行调整
    a) 对于吞吐量大的程序来说,要尽量避免内存交换。内存交换可以防止OS系统内存不足突然终止进程。
    建议把vm.swappiness参数尽量小=1,指明os子系统如何交换分区,优先减小页面缓存,而不是内存交换
    b) kafka依赖I/O性能为生产者提供快速响应。
    建议使用快速磁盘SSD具有NVRAM的缓存磁盘子系统RAID,当刷新脏页到磁盘之前,可以减少脏页的数量
    将将vm.dirty_backgroud_ratio设为小于 10 的值,值得是系统内存百分比,加快脏页写入缓存
    vm.dirty_ratio>20增加内核进程,刷新到磁盘的脏页数量
  2. 磁盘
    批量磁盘写入具有更高的效率,提升整体IO吞吐量
    文件元数据:创建时间(ctime)+最后修改时间(mtime)+最后访问时间(atime),每次读写都会更新atime
    atime一般没有什么用,为挂载点设置noatime参数
  3. 网络
    对Linux系统网络优化,实现大流量的支持。
    修改socket读写缓冲区
    a) net.core.wmem_default(socket读缓存):128KB-2MB
    b) net.core.rmem_default(socket写缓存):128KB-2MB
    修改TCP socket读写缓冲区
    a) net.ipv4.tcm_wmem 最小值 默认值 最大值
    b) net.ipv4.tcm_rmem 最小值 默认值 最大值
    修改并发连接和最大阻塞队列
    a) net.ipv4.tcp_max_sync_blocking>1024 //可接受更多并发连接
    b) net.core.netdev_max_blocklog>1000 //允许更多数据包排队,有助于应对网络流量爆发

生产环境调优

  1. 垃圾回收器配置
    G1自动根据工作负载情况进行自我调节,轻松处理大块堆内存,将堆内存分为若干区域
    maxGCPauseMills=200ms:指定每次垃圾回收的默认停顿时间,决定了gc回收频率以及每轮回收的区域
    InitiatingHeapOccupancyPercent=45%:指定gc回收前可使用的堆内存百分比,若超过则进行回收
    kafka对堆内存使用率非常高,容易产生垃圾,尽量把这些值设的小些

kafka启动脚本没有启用G1回收器,而是采用CMS(并发标记清扫),可通过配置环境变量修改
2. 数据中心布局
把集群的broker安装在不同的机架上,不让他们共享可能出现单点故障的基础设施
3. 共享zk
kafka使用zk保存broker,主题,分区的元数据信息
对zk群组来说,kafka集群的流量并不算多,所以在很多部署环境里,让多个kafka集群共享一个zk群组

消费者可以选择将offset提交到zk或kafka,还可以选择提交偏移量的时间。
但不建议把zk集群共享给其他应用程序,因为kafka对zk的延迟非常敏感

相关标签: 面试