Kafka可靠性的思考
首先kafka的throughput
很牛逼,参考:http://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines
接着主要谈一下,Kafka的可靠性问题,有哪些机会可能丢数据?
从producer,broker,consumer的角度,分别看看
a. Producer到broker
把request.required.acks设为1,丢会重发,丢的概率很小
b. Broker
b.1 对于broker,落盘的数据,除非磁盘坏了,不会丢的
b.2 对于内存中没有flush的数据,broker重启会丢
可以通过log.flush.interval.messages和log.flush.interval.ms来配置flush间隔,interval大丢的数据多些,小会影响性能
但在0.8版本,可以通过replica机制保证数据不丢,代价就是需要更多资源,尤其是磁盘资源,kafka当前支持GZip和Snappy压缩,来缓解这个问题
是否使用replica取决于在可靠性和资源代价之间的balance
c. Consumer
和其他的平台不同的是,其实Kafka真正比较复杂的是consumer,Kafka有两种consumer
c.1 High-level consumer
这个使用比较简单,已经封装了对partition和offset的管理,默认是会定期自动commit offset,这样可能会丢数据的,因为consumer可能拿到数据没有处理完crash
之前我们在0.7上是使用这个接口的,为了保证不丢数据,把自动commit关掉,consumer处理完所有数据,再手动commit,这样丢数据的概率比较小
对于storm,没法这样做,因为spout是会预读大量数据的,当然只要spout线程不crash,也是可以保证这些数据基本不会丢失(通过storm的acker机制)
但如果spout线程crash,就会丢数据
所以High-level接口的特点,就是简单,但是对kafka的控制不够灵活
c.2 Simple consumer,low-level
这套接口比较复杂的,你必须要考虑很多事情,优点就是对Kafka可以有完全的控制
You must keep track of the offsets in your application to know where you left off consuming.
You must figure out which Broker is the lead Broker for a topic and partition
You must handle Broker leader changes
在考虑如何将storm和kafka结合的时候,有一些开源的库,基于high-level和low-level接口的都有
我比较了一下,还是kafka官方列的storm-kafka-0.8-plus比较靠谱些
这个库是基于simple consumer接口实现的,看着挺复杂,所以我先读了遍源码,收获挺大,除了发现我自己代码的问题,还学到些写storm应用的技巧呵呵
这个库会自己管理spout线程和partition之间的对应关系和每个partition上的已消费的offset(定期写到zk)
并且只有当这个offset被storm ack后,即成功处理后,才会被更新到zk,所以基本是可以保证数据不丢的
即使spout线程crash,重启后还是可以从zk中读到对应的offset
So, 结论就是kafka和storm的结合可靠性还是可以的,你真心不想丢数据,还是可以做到的
Kafka只是能保证at-least once逻辑,即数据是可能重复的,这个在应用上需要可以容忍
当然通过Storm transaction也是可以保证only once逻辑的,但是代价比较大,后面如果有这样的需求可以继续深入调研一下
对于kafka consumer,一般情况下推荐使用high-level接口,最好不要直接使用low-level,太麻烦
当前其实Kafka对consumer的设计不太到位,high-level太不灵活,low-level又太难用,缺乏一个medium-level
所以在0.9中consumer会被重新design,https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Client+Re-Design
Kafka可靠性的思考的更多相关文章
- RabbitMQ和Kafka可靠性
RabbitMQ和Kafka可靠性 https://www.cnblogs.com/haolujun/p/9641840.html 我们通过前文知道,RabbitMQ的队列分为master queue ...
- 055 kafka可靠性与高性能
一:可靠性 1. 二:高性能 1.
- kafka可靠性
文章转载自: http://blog.csdn.net/u013256816/article/details/71091774
- Kafka的存储机制以及可靠性
一.kafka的存储机制 kafka通过topic来分主题存放数据,主题内有分区,分区可以有多个副本,分区的内部还细分为若干个segment. 所谓的分区其实就是在kafka对应存储目录下创建的文件夹 ...
- kafka如何保证数据可靠性和数据一致性
数据可靠性 Kafka 作为一个商业级消息中间件,消息可靠性的重要性可想而知.本文从 Producter 往 Broker 发送消息.Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠 ...
- Kafka丢失数据问题优化总结
数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候 ...
- kafka学习笔记(一)消息队列和kafka入门
概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...
- kafka主题offset各种需求修改方法
简要:开发中,常常因为需要我们要认为修改消费者实例对kafka某个主题消费的偏移量.具体如何修改?为什么可行?其实很容易,有时候只要我们换一种方式思考,如果我自己实现kafka消费者,我该如何让我们的 ...
- 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...
随机推荐
- js实现iframe自适应高度
转自:http://www.jb51.net/article/15780.htm 对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的! 不带边框的iframe因为能 ...
- mysql错误:“ Every derived table must have its own alias”(每个派生出来的表都必须有一个自己的别名)
自我感悟: 由此可以延伸,我们得到一个结果集,可以通过as XXX的方式,把结果集给当作一张表来用,以实现子查询: 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的的结果是作为一 ...
- SqlServer 临时表 与 表变量(转)
1. 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime).以@前缀的表变量是本地的,因此 ...
- matlab练习程序(多圆交点)
最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...
- android实现断点续传
代码如下: package com.example.downloaderstopsart; import java.util.ArrayList; import java.util.HashMap; ...
- java.lang.NoClassDefFoundError: org/apache/avro/ipc/Responder
文章发自:http://www.cnblogs.com/hark0623/p/4170174.html 转发请注明 java.lang.NoClassDefFoundError: org/a ...
- ios 适应屏幕
标准做法:auto layout 其中:也可以用代码判断 1.如果不是hardcode的话,又怎么会不兼容呢.. 2.如果你全写320*480也是兼容吗 3.写320嘛的就是hardcode啊. ...
- Quartz Cron 表达式
Cron 表达式包括以下 7 个字段 格式: [秒] [分] [小时] [日] [月] [周] [年] 说明 是否必填 允许填写的值 允许的通配符 秒 是 - , - * / 分 是 - , - * ...
- TYVJ P1024 外星人的密码数字
做题记录:2016-08-16 20:09:30 描述 XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星人用26个英文字母组成的单词中最长不降子序列的长度来表述数字,且 ...
- TYVJ P1036 统计数字 Label:坑!!!(用queue+map做出来的水)
背景 NOIP2007年提高组第一题 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数 ...