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


本文章摘自博客园,原文发布日期:2014-06-26

目录
相关文章
|
6月前
|
消息中间件 分布式计算 Kafka
亿万级别Kafka演进之路:可靠性+事务+消息中间件+源码+日志
Kafka起初是由LinkedIn公司采用Scala语言开发的-一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
|
消息中间件 存储 安全
聊聊 Kafka:Kafka 如何保证可靠性
聊聊 Kafka:Kafka 如何保证可靠性
719 0
|
1月前
|
消息中间件 SQL 分布式计算
大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解
大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解
23 2
|
4月前
|
消息中间件 存储 Kafka
深入Kafka:如何保证数据一致性与可靠性?
**Kafka一致性详解:** 讲解了幂等性如何通过ProducerID和SequenceNumber确保消息唯一,防止重复处理,维持数据一致性。Kafka利用Zookeeper进行控制器和分区Leader选举,应对节点变动,防止脑裂,确保高可用性。实例中,电商平台用Kafka处理订单,保证每个订单仅处理一次,即使在异常情况下。关注微信公众号“软件求生”获取更多技术内容。
731 0
|
5月前
|
消息中间件 缓存 监控
Kafka性能优化策略综述:提升吞吐量与可靠性
Kafka性能优化策略综述:提升吞吐量与可靠性
752 0
|
5月前
|
消息中间件 Kafka API
深入解析Kafka消息传递的可靠性保证机制
深入解析Kafka消息传递的可靠性保证机制
79 0
|
6月前
|
消息中间件 Kafka
面试官:你说说Kafka是怎么保证消息可靠性的
面试官:那要是Kafka消费堆积了怎么办。每个topic是分为多个分区给不同Broker处理,要合理分配分区数量来提高Broker的消息处理能力。比如3个Broker2个分区,可以改为3个Broker3个分区
面试官:你说说Kafka是怎么保证消息可靠性的
|
6月前
|
消息中间件 监控 Java
✈️【Kafka技术专题】「核心原理篇」深入实战探索Kafka的Broker的原理及可靠性机制分析
✈️【Kafka技术专题】「核心原理篇」深入实战探索Kafka的Broker的原理及可靠性机制分析
192 0
|
消息中间件 存储 缓存
Kafka如何保证数据的可靠性&Kafka集群
Kafka如何保证数据的可靠性&Kafka集群
246 0
Kafka如何保证数据的可靠性&Kafka集群
|
消息中间件 Kafka RocketMQ
Kafka vs RocketMQ——单机系统可靠性
引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准——软件可靠性。 何为“可靠性”? 先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区均能很好应对泥泞的路况。当一同开去穿越西藏,A车会因为西藏本地的汽油不达标,导致油路受阻无
7758 5
下一篇
无影云桌面