《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基本指令
- 增加主题-指定zk,主题,分区,副本数
sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 1 --partitions 1 --topic topicname
- 删除主题
sh kafka-topics.sh --delete --zookeeper hadoop01:2181 --topic enbook
- 查看主题
sh kafka-topics.sh --list --zookeeper hadoop01:2181
- 启动生产者(只需写一台地址)
sh kafka-console-producer.sh --broker-list hadoop01:9092 --topic enbook
- 启动消费者(只需写一台地址)
sh kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic enbook --from-beginning
kafka基本配置
- broker.id port
- zookeeper.connect 保存broker远数的zk地址
- log.dirs 指定消息日志片段的目录
- num.recovery.threads.per.data.dir 每个目录恢复使用的线程数
- auto.create.topics.enable 自动创建主题
主题的配置 - num.partitions 指定主题包含的分区数,通过增加主题的分区数,可以使得kafka吞吐率线性提高,而且可以实现负载均衡的作用
若需要每秒钟从主题读写1GB的数据,而且消费者吞吐量为50MB,则至少需要20个分区,然后让20个消费者同时消费 - log.retention.ms 配置分区的数据持久化时间限制,若超过则消息删除
- log.renetion.bytes 配置分区的数据持久化字节限制,若超过则消息删除
- log.segement.bytes 配置日志片段的字节限制,若超过则创建新得日志片段,旧的日志片段开始过期
- log.segement.ms 配置日志片段的时间限制,需要考虑并行关闭多个日志片段对磁盘性能的影响(多个日志片段达不到上限,则会出现多个日志片段同时关闭的情况)
- message.mex.bytes 配置消息字节限制,默认1mb,值越大处理时间越长,还会增加磁盘写入块的时间
kafka集群
- 可以跨服务器进行负载均衡
- 使用复制功能避免单点故障造成的数据丢失
需要多少个broker
- kafka集群需要保存的数据量&单个broker的存储空间,复制会加一倍空间
- 考虑集群吞吐量和内存不足造成的性能问题
broker配置
怎么将一个broker加入到集群呢???
修改两个配置
- 配置相同的zookeeper.connect
- 配置broker的broker.id
操作系统调优
- 虚拟内存
Linux的虚拟内存根据系统的工作负荷进行自动调整,我们可以对交换分区的处理方式和内存脏页进行调整
a) 对于吞吐量大的程序来说,要尽量避免内存交换。内存交换可以防止OS系统内存不足突然终止进程。
建议把vm.swappiness参数尽量小=1,指明os子系统如何交换分区,优先减小页面缓存,而不是内存交换
b) kafka依赖I/O性能为生产者提供快速响应。
建议使用快速磁盘SSD具有NVRAM的缓存磁盘子系统RAID,当刷新脏页到磁盘之前,可以减少脏页的数量
将将vm.dirty_backgroud_ratio设为小于 10 的值,值得是系统内存百分比,加快脏页写入缓存
vm.dirty_ratio>20增加内核进程,刷新到磁盘的脏页数量 - 磁盘
批量磁盘写入具有更高的效率,提升整体IO吞吐量
文件元数据:创建时间(ctime)+最后修改时间(mtime)+最后访问时间(atime),每次读写都会更新atime
atime一般没有什么用,为挂载点设置noatime参数 - 网络
对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 //允许更多数据包排队,有助于应对网络流量爆发
生产环境调优
- 垃圾回收器配置
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的延迟非常敏感