kafka相关问题总结
一直在使用kafka,遇到过很多问题,总结一下
很多人对比kafka和AMQP的时候,都会强调kafka会丢数据,感觉好像只要用kafka就会丢数据一样,从而排斥使用kafka,亦或者在使用的过程中,发现数据丢失就认定罪魁祸首是kafka,好像丢数据就是使用kafka的代价。悄悄的鄙视一下这些伪程序猿。
kafka是一个强调高性能、高吞吐量的分布式消息中间件,在CAP中强调CP,当失去Broker Controller,选举新的Controller前服务处于不可用的状态,毕竟作为消息中间件对数据一致性还是有很高的要求。
大致解释一下kafka集群,kafka server一般叫broker,在集群里,各个broker通过zookeeper抢占broker controller,Controller的职责是管理所有的Partition和Replica的分布以及ISR列表并通知其他broker,如果controller宕机,其他broker又通过zk抢占Controller,在Controller选举的过程中,服务处于不可用的状态。
partition leader和partition replica:新建过topic的同学肯定知道,在新建topic的时候,我们一般会指定两个变量partition和replica,其实每个topic都是由多个partition组成的,一般情况下,partition的数量等于broker的数量,生产端产生数据存储在这些partition中。如果每个partition都没有备份,一旦服务器宕机,其中的数据都无法消费了,所以需要若干partition replica去备份这些partition, 而这些被备份的partition就称之为partition leader。这里再解释一下leader和replica切换的问题,leader与replica的数据copy肯定会有延迟的问题,不可能保证每时每刻replica的数据都与leader一致,所以就引入了一个ISR列表去维护哪些replica的数据是完整的,是值得信赖的,当replica中的数据与leader中的数据的延迟量超过一定的数值(可以自己设定的)或者卡住多少时间不返回的时候,这个replica就会被移除ISR列表,意味着此时如果leader宕机,当前这个replica是没有机会成为leader的,除非ISR列表里没有可用的replica。当这个replica的延迟或者返回时间恢复正常后,又会动态的把这个replica加入到ISR列表,总之ISR列表是动态的。
消息写入kafka的过程:producer会通过所连接的broker获取到当前kafka集群的状态例如broker地址、partition的分配等,producer通过消息中的key或者round robin选择要写入的partition, producer只会将消息写入partition leader, 再由leader分发给所有的replica。在这个过程中,producer可以指定消息写入的ack模型,acks= 大专栏 kafka相关问题总结0时,意味着不在乎消息是否已经写入partition leader,只要发送了就好;acks=1,消息写入leader需要返回ack才算成功;acks=-1或者all,消息写入leader后且所有replica也都写入并返回leader ack后才算成功。producer发送消息的确认模式选择就可能导致数据丢失,例如:当acks=1时,数据成功写入partition leader,producer会认为消息投递成功啦,突然partition leader在通知replica备份之前挂了,这条数据就沉入大海了,即使这个leader在一段时间后恢复,其他的replica可能早就已经取代它,成为新的leader了。
消息持久化broker时也可能发生丢失,在未写入硬盘前,机器挂掉也可能丢失数据,这种情况就认命吧,或者让acks更严格,消息未确认写入成功时能够继续重试。
最后就是消费的时候也可能发生丢失,kafka的消费模式和传统的AMQP是完全不同的,传统AMQP通过broker推送从而由broker控制消息的消费,消费端处理消息后需要通知broker消费状态(例如rabbitmq的ack,nack)如果失败broker会重新将消息推给其他消费端;kafka则是通过pull的方式,由消费端从broker上拉取消息,而拉取哪些消息由消费端自己控制(存在zk也是自己控制),这就导致如果消费失败,且消费端没有做好相应处理,offset+1后,这条消息也就丢失了,所以对不允许数据丢失的业务,可以通过代码管理offset。
消费消息没有顺序???
kafka的消费端有两个概念consumer group和consumer, consumer group由多个consumer组成,partition只能被在同一个consumer group中的一个consumer消费,但是可以被多个不同consumer group的consumer同时消费,如果consumer group中只有一个consumer,那么这个consumer可以消费所有的partition,所以一般来说有多少partition就初始化多少consumer,这样消费效率最高。
既然kafka允许多个consumer对多个partition同时消费且producer投递的消息也落于不同的partition中,那么在这种情况下,消费这些消息的顺序肯定是不可控的。但是要知道kafka的partition是只能被一个consumer(同一group下)消费的,那么只要让消息全部都落入同一个partition不就好了,我们投递消息的过程中通过设定消息的key就能让kafka producer根据key进行hash选择要写入的partition,就能保证消息写入的顺序以及消费的顺序。
kafka相关问题总结的更多相关文章
- 简单封装kafka相关的api
一.针对于kafka版本 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>ka ...
- kafka相关文章引用
kafka相关内容说明: Kafka压缩 Kafka端到端审计 kafka数据可靠性深度解读 Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常? Kafka之 ...
- kafka相关应用
一.kafka官网地址 http://kafka.apache.org 下载地址: http://kafka.apache.org/downloads.html 二.版本 0.9.0.1 is the ...
- Kafka相关内容总结(存储和性能)
Kafka消息的存储 Kafka的设计基于一种非常简单的指导思想:不是要在内存中保存尽可能多的数据,在需要时将这些数据刷新(flush)到文件系统,而是要做完全相反的事情.所有数据都要立即写入文件系统 ...
- Kafka相关内容总结(概念和原理)
说明 主要内容是在网上的一些文章中整理出来: 加粗的字体是比较重要的内容,部分是自己的经验和理解: 整理的目的主要是为了方便查阅: 为什么需要消息系统 解耦: 在项目启动之初来预测将来项目会碰到什么需 ...
- kafka相关资料
先来说一下Kafka与RabbitMQ的对比: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. kafka是Linkedin于20 ...
- kafka相关业务必会操作命令整理
参考:https://kafka.apache.org 服务相关命令 1.启动/停止zk > bin/zookeeper-server-start.sh config/zookeeper.pro ...
- kafka 相关命令 偏移重置
kafka官方文档 https://kafka.apache.org/documentation.html#quickstart kafka 安装文档 https://www.jianshu.com/ ...
- 日志收集ELK+kafka相关博客
SpringBoot+kafka+ELK分布式日志收集 使用 logstash + kafka + elasticsearch 实现日志监控 Kibana 安装 与 汉化 windows系统安装运行f ...
随机推荐
- Microsoft COCO 数据集
本篇博客主要以介绍MS COCO数据集为目标,分为3个部分:COCO介绍,数据集分类和COCO展示. 本人主要下载了其2014年版本的数据,一共有20G左右的图片和500M左右的标签文件.标签文件标记 ...
- Fabric不支持对同一个数据的并发事务处理
Fabric不支持对同一个数据的并发事务处理,也就是说, 如果我们同时运行了invoke(一),invoke(二),那么只会第一条Transaction成功, 而第二条失败.因为在Committer节 ...
- 使用okhttp连接网络,再把数据储存进Sqlite
这次会把所有之前学过的东西应用在一起,写一个登入的功能. 1. Activity调用CONFIG,获得URL后 2. Activity再调用Okhttp,从服务器返回JSON 3. Activity调 ...
- 二十、linux文件系统讲解
1.分区和文件系统的关系: 为什么需要格式化呢?这是因为分区文件系统在没有格式化前,操作系统是无法识别系统分区的格式的,就没办法组织文件目录属性和权限等内容,把分区格式化成操作系统支持的某个文件系统后 ...
- wsdl中含ref="s:schema"时处理
转载地址:http://ljhzzyx.blog.163.com/blog/static/38380312201471375946602/
- android流式布局、待办事项应用、贝塞尔曲线、MVP+Rxjava+Retrofit、艺术图片应用等源码
Android精选源码 android模仿淘宝首页效果源码 一款艺术图片应用,采用T-MVVM打造 Android MVP + RxJava + Retrofit项目 android流式布局实现热门标 ...
- iOS燃烧动画、3D视图框架、天气动画、立体相册、微信朋友圈小视频等源码
iOS精选源码 iOS天气动画,包括太阳,云,雨,雷暴,雪动画. 较为美观的多级展开列表 3D立体相册,可以旋转的立方体 一个仪表盘Demo YGDashboardView 一个基于UIScrollV ...
- 95)PHP,文件上传知识和代码
首先是知识总结: 上传: 从浏览器端传输的到服务器端. 请求时: 数据从浏览器端传输到服务器端. 可见: 上传,发生在浏览器向服务器发出请求过程中. 文件,对于浏览器来讲,就是表单中的一个特殊类型的数 ...
- 2019ICPC南京网络赛B super_log(a的b塔次方)
https://nanti.jisuanke.com/t/41299 分析:题目给出a,b,mod求满足条件的最小a,由题目的式子得,每次只要能递归下去,b就会+1,所以就可以认为b其实是次数,什么的 ...
- KUKA机器人常见十大问题及解决方法
1 开机坐标系无效 世界坐标系是以枪头为基点,在这种坐标系中,机器人所有的动作都是按照以枪头为顶点来完成移动,XYZ方向切割枪方向不改变,如果机器人在世界坐标系中移动,枪头也随着改变方向,那就是我们在 ...