1、kafka是什么

  类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据。 kafka是一个生产-消费模型。
  producer:生产者,只负责数据生产,生产者的代码可以集成到任何系统中。数据的分发策略由producer决定,默认是Defaultpartition Utils.abs(key.hashCode)%numPartitions.
  Broker;当前服务器上的kafka进程,俗称拉皮条。只管数据存储,不管是谁消费。在集群中每个broker都有一个唯一的brokerid,不得重复。
  Topic:目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个Partition的目录。partition的目录中有多个segment组合(index,log)
      一个Topic对应多个partition[0,1,2,3],一个Partition对应多个segment组合。一个segment有默认的大小是1G。
      每个Partition可以设置多个副本,会从所有的副本中选取一个leader出来。所有读写操作都是通过leader来进行的。特别强调,和mysql中主从有区别,mysql做主从是为了读写分离,在kafka中读写操作都是leader。
  Consumer:数据消费者,Consumer可以有多个,每个consumer消费的数据都是一样的。
  ConsumerGroup;可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消息。

2、kafka生产数据时的分组策略

  默认是Defaultpartition Utils.abs(key.hashCode)%numPartitions.
  上文中的key是producer在发送数据时传入的,producer.send(KeyMessage(topic,mypartitionKey,messageContent))

3、Kafka如何保证数据的完全生产?

  ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
      0 :不等待broker返回确认信息。
      1 :等待topic中某个partition leader保存成功的状态反馈。
      -1:等待topic中某个partiton 所有副本都保存成功的状态反馈

4、broker如何保存数据?

  在理论环境下,broker按照顺序读写的机制,可以每秒保存600M的数据。主要通过pagecache机制,尽可能的利用当前物理机器上的空闲内存来做缓存。当前topic所属的broker,必定有一个该topic的partition,partition是一个磁盘目录。partition的目录中有多个segment组合(index,log)

5、partition如何分布在不同的broker上。

list(kafka01,kafka02,kafka03)//broker列表
int partitions=4;//partitions个数
for(int i=0;i<partitions;i++){
brIndex=i%broker;
hostname=list.get(brIndex)
}

6、consumerGroup的组员和partition之间如何做负载均衡?

  最好是一一对应,一个partition对应一个consumer。如果consumer的数量过多,必然有空闲的consumer

  算法:
  假如topic1,具有如下partitions: P0,P1,P2,P3
  加入group中,有如下consumer: C1,C2
  首先根据partition索引号对partitions排序: P0,P1,P2,P3
  根据consumer.id排序: C0,C1
  计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
  然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]

7、如何保证kafka消费者消费数据是全局有序的?

  伪命题
  如果要保证消费有序,必须保证生产有序,存储有序,消费有序。
  由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,就需要全局全局有序,就需要保证每个环节都有序。
  只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用相悖。

Kafka系列二 kafka相关问题理解的更多相关文章

  1. Kafka 系列(五)—— 深入理解 Kafka 副本机制

    一.Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息.每个 broker 都有一个唯一标识 broker.id,用于标识自己在集群中的身份,可以在配置文 ...

  2. Kafka系列之-Kafka Protocol实例分析

    本文基于A Guide To The Kafka Protocol文档,以及Spark Streaming中实现的org.apache.spark.streaming.kafka.KafkaClust ...

  3. Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用

    KafkaOffsetMonitor是一个可以用于监控Kafka的Topic及Consumer消费状况的工具,其配置和使用特别的方便.源项目Github地址为:https://github.com/q ...

  4. Kafka系列之-Kafka入门

    接下来的这些博客,主要内容来自<Learning Apache Kafka Second Edition>这本书,书不厚,200多页.接下来摘录出本书中的重要知识点,偶尔参考一些网络资料, ...

  5. kafka系列二:多节点分布式集群搭建

    上一篇分享了单节点伪分布式集群搭建方法,本篇来分享一下多节点分布式集群搭建方法.多节点分布式集群结构如下图所示: 为了方便查阅,本篇将和上一篇一样从零开始一步一步进行集群搭建. 一.安装Jdk 具体安 ...

  6. Kafka系列(二)特性和常用命令

    Kafka中Replicas复制备份机制 kafka将每个partition数据复制到多个server上,任何一个partition有一个leader和多个follower(可以没有),备份的个数可以 ...

  7. kafka系列二、kafka manager的安装和使用

    1. Yahoo kafka manager介绍 项目地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or ...

  8. Kafka系列二之部署与使用

    Kafka部署与使用 写在前面 从上一篇Kafka的架构介绍和安装中,可能,你还一直很蒙,kafka到底该怎么使用呢?接下来,我们就来介绍Kafka的部署与使用.上篇文章中我们说到,Kafka的几个重 ...

  9. Apache Kafka系列(二) 命令行工具(CLI)

    Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [roo ...

随机推荐

  1. python升级 (2.6升级到3.5)

    在引用模块pandas时竟然提示不支持2.6, 果断升级,在网上找了很多博客,觉得这个比较清楚(https://blog.csdn.net/my_bai/article/details/7289602 ...

  2. Python学习---爬虫学习[requests模块]180411

    模块安装 安装requests模块 pip3 install requests 安装beautifulsoup4模块 [更多参考]https://blog.csdn.net/sunhuaqiang1/ ...

  3. C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

    各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...

  4. Linux--面试题-01

    1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标识. 4. ...

  5. 【JS】#001 JS定义对象写法(原型、JSON方式)

    下面主要写两种 JS 定义对象的 常用写法 写法1:[很像面向对象语言中的写法] function zhongxia(age) { this.age = age; } zhongxia.name = ...

  6. Phthon3.4 新特性

    1.       print的变化:. 在python3.0中,print成为了一个函数,将传入的参数一输出. Python3.0: Python 2.5: 2.使用比较操作符时,如果被比较的对象没有 ...

  7. 前端技术-HTML页面的加载

    HTML页面的加载 HTML页面的加载实际上是基于http过程+浏览器对数据的解析渲染. http协议的请求过程是基于TCP协议的.http是要基于TCP连接基础上,简单的说,TCP单纯建立连接,不涉 ...

  8. Hadoop学习之路(七)Hadoop集群shell常用命令

    Hadoop常用命令 启动HDFS集群 [hadoop@hadoop1 ~]$ start-dfs.sh Starting namenodes on [hadoop1] hadoop1: starti ...

  9. win10下安装Jenkins

    Jenkins是一个基于java的持续集成工具,开源项目.用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.随着近几年docker技术的成熟和应用,很多公司开始大量尝试 ...

  10. 谈谈我的js学习过程(二)——“Hello World!”

    在<谈谈我的js学习过程(一)>中,我简单聊了一下我认为的javascript的学习方法,接下来我们可以尝试来写一个最简单的js代码. "Hello World!"对于 ...