zoukankan      html  css  js  c++  java
  • kafka文件存储结构和如何保证数据不丢失

    一: kafka文件组成

    基本组成:

    1- broker 节点,多个broker构成一个集群

    2- topic 对消息进行归类

    3- producer 生产者

    4- comsumer 消费者

    5- consumerGroup 消费组

    topic的组成:

    1- partition  物理上数据存储的概念,一个topic包含多个partition,每个partition内部是有序的;每个partition是一个目录;

    2- segment  一个partition包含多个segment,包含两种文件.index和.log。

    这两个文件的命令规则为:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值,数值大小为64位,20位数字字符长度,没有数字用0填充,如下:

    00000000000000000000.index
    00000000000000000000.log
    00000000000000170410.index
    00000000000000170410.log
    00000000000000239430.index
    00000000000000239430.log

    index索引文件存储大量的元数据,log数据文件存储大量的消息。

    partition内部读取数据的流程为(例如读取offset=170418的消息):

    1- 首先查找segment文件。确认数据存储在00000000000000170410.index和00000000000000170410.log这两个文件中。

    2- 到index文件中查找,log数据存贮的位置信息。

    3- 从log日志中读取所需日志信息。

    二:数据可靠性和持久性保证

    1- producer端

    request.required.acks参数进行配置,可靠性级别为:

    1(默认) producer写到kafka中,收到leader的反馈信息后,下确认其写入成功。leader宕机,会丢失数据。

    0 producer端不会收到任何的反馈信息,数据可靠性很低。

    -1 producer端需要确认leader和follower都反馈成功,才认为写入成功。和min.insync.replicas参数(最小同步副本数,必须大于等于2)一起使用。利用副本冗余信息来确保数据不会丢失。但是可以会重复传输。

    2- comsumer端

    producer.type=sync一定要设置成同步的方式。

    consumer先读取消息并处理,在commit。这种方式可以保证至少一次;

    consumer 先读取消息,再commit,在处理,这种方式会丢失数据;

    3- 自定义实现,缓存消息去重

     Consumer保持无状态和幂等性就可以了

  • 相关阅读:
    angular5 二维码插件
    ag-grid 设置默认选中多行
    断点续传和下载原理分析
    Volley 实现原理图
    Volley全方位解析,带你从源码的角度彻底理解
    23种设计模式
    android service
    Android drawable微技巧
    Android ListView实现不同item的方法和原理分析
    Android 网络框架 volley源码剖析
  • 原文地址:https://www.cnblogs.com/parent-absent-son/p/10863861.html
Copyright © 2011-2022 走看看