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

什么是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的延迟非常敏感

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值