kafka 总结
1、常见问题:Kafka启动后瞬间挂掉
查看是否存在脏数据(zookeeper和kafka数据目录数据都要清理)。
2、在zookeeper 上查看已启动的 kafka 节点状态;查看 topic 状态
-
查看 kafka 数据目录
ls -l /opt/module/kafka/datas
-
查看 kafka 运行日志
tail -n 500 /opt/module/kafka/logs/server.log
-
用 kafka-producer-perf-test.sh 实际测试 producer 吞吐量参数调节
./kafka-producer-perf-test.sh \ --topic test_perf \ --num-records 100000 \ --record-size 1000 \ --throughput -1 \ --producer-props \ bootstrap.servers=hadoop102:9092
3、如何保证数据不丢失
1.producer 角度
- acks=0,生产者发送过来的数据,不需要等待落盘应答,可靠性低,效率高;
- acks=1,生产者发送过来的数据,Leader应答,可靠性中等,效率中等;
- acks=-1,生产者发送过来的数据,Leader和ISR队列里的所有Follower 收齐数据后应答,可靠性高,效率低。
在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。
2.broker 角度
- 副本数大于等于2
- min.insync.replicas 大于等于2
4、如何保证数据不重复
1.生产者角度
- acks 设置为 -1(acks=-1)
- 幂等性(enable.idempotence=true)+ 事务
2.broker 服务端角度
- 分区副本大于等于2(–replication-factor 2)
- ISR 里应答的最小副本数量大于等于2(min.insync.reolicas=2)
3.消费者
- 事务 + 手动提交 offset(enable.auto.commit=false)
- 消费者输出的目的地必须支持事务(MySQL、Kafka)
5、如何保证数据有序
Kafka 最多只保证单分区内的消息是有序的,所以如果要保证业务全局严格有序,就要设置Topic 为单分区。
如何保证单分区数据有序
方案一:
禁止重试,需设置以下参数
设置 retries 等于 0
说明:数据出现乱序的根本原因是,失败重试,关闭重试,则可保证数据是有序的。但是这样做,可能会导致数据的丢失。
方案二:
启用幂等,需设置以下参数
设置 enable.idempotence=true,启用幂等
设置 max.in.flight.requests.per.connection,1.0.X 之后,小于等于5
设置 retries,保证其大于 0
设置 acks,保证其为 -1
6、如何提高 Kafka 吞吐量
1.提升生产吞吐量
- buffer.memory:发送消息的缓冲区大小,默认值是32m,可以增加到 64m
- batch.size:默认是 16k。如果 batch 设置太小,会导致频繁网络请求,吞吐量下降;如果 batch 太大,会导致一条消息需要等待很久才能发送出去,增加网络延时
- linger.ms:这个值默认是 0,意思就是消息必须立即被发送。一般设置为 5-100ms。如果linger.ms设置太小,会导致频繁网络请求,吞吐量下降;如果linger.ms设置太大,会导致一条消息需要等待很久才能发送出去,增加网络延时。
- compression.type:默认是none,不压缩,但是也可以使用 lz4 压缩,效率还是不错的,压缩之后可以减小数据量,提升吞吐量,但是会加大 producer 端的 CPU 开销。
2.增加分区
3.消费者提高吞吐量
- 调整 fetch.max.bytes 大小,默认是 50m
- 调整 max.poll.records 大小,默认是 500条
7、Kafka 挂掉的故障排除
在生产环境中,如果某个 Kafka 节点挂掉。
正常处理办法:
- 先看日志,尝试重新启动一下,如果能重新启动,那直接解决。
- 如果重启不行,检查内存、CPU、网络带宽。调优- >调优不行增加资源
- 如果将 Kafka 整个节点误删除,如果副本数大于等于 2,可以按照服役新节点的方式服役一个新节点,并执行负载均衡。
8、调节 Kafka 堆内存
vim /opt/module/kafka/bin/kafka-server-start.sh
# 修改如下行
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
9、提高消费者每批次处理数据(1000条)
在消费者配置中加入如下配置:
max.poll.records=1000
10、Kafka 怎样高效读写
- Kafka 本身是分布式集群,可以采用分区技术,并行度高
- 读数据采用稀疏索引,可以快速定位要消费的数据
- 顺序写磁盘
- Kafka 的 producer 生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。
- 页缓存 + 零拷贝技术
- 零拷贝:Kafka的数据加工处理操作交由Kafka生产者和消费者处理。Kafka Broker应用是不关心存储的数据,所以就不用走应用层,传输效率高。
- PageCache 页缓存:Kafka重度依赖底层操作系统提供的 PageCache 功能。当上层有写操作时,操作系统只是将数据写入 PageCache。当读操作时,先从PageCache中查找,再去磁盘中读取。实际上PageCache是把尽可能多的空闲时间内存都当做了磁盘缓存来使用。