Kafka简介

Kafka的主要特点:

1. 为发布和订阅提供高吞吐量,每秒可产生25万消息(50MB),每秒可处理55万消息(110MB)
2. 可进行持久化操作
3. 分布式系统,支持热扩展
4. 消息被处理的状态是consumer维护,不是server维护
5. 支持online和offline场景

Kafka架构:

分布式架构,Producer、Broker、Consumer都有多个,采用Push-and-Pull的模式,消息由Producer产生,Push进Broker,Broker起到中间缓存和分发的作用,Consumer从Broker Pull消息做处理,消息的产生和消费是异步的。

一些概念

1.Broker:Kafka集群中包含的服务器
2.Topic:每条发不到Kafka集群的消息所属的类别
3.Partition:分区,物理概念,每个topic包含一个或多个partition,Kafka同一个Partition内保证消息有序性
4.Producer:消息生产者,向Broker写消息
5.Consumer:消费者,从Broker读取消息
6.Consumer Group:每个Consumer属于一个特定的ConsumerGroup,每个分区分配给消费者组中不同的而且是唯一的消费者,并确保一个分区只属于一个消费者
7.replication:partition的副本,保障partition的高可用,同一个partition可能有多个replication,多个replication选举leader,其他replication作为folloer从leader复制数据
8.leader:replica中的一个角色,producer和consumer只跟leader交互
9.follower:replica中的一个角色,从leader中复制数据
10.controller:Kafka集群中的一个服务器,用来进行leader election以及各种failover
11.zookeeper:Kafka通过zookeeper来存储集群的meta信息

Topic和Partition

消息发送时都被发送到一个topic,其本质就是一个目录,而topic由是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:

每个Partition中的消息都是有序的,生产的消息被不断追加到PartitionLog上,其中的每一个消息被赋予唯一的offset值。Kafka集群会保存所有的消息,不管消息有没有被消费,我们可以设定消息的过期时间,只有过期的数据才会被自动清除以释放磁盘空间。Kafka需要维持的元数据只有一个,消费消息在Partition中的offset值,Consumer每消费一条消息,offset值加1,Consumer可以重置offset值来读取任意位置的消息。

发布消息

producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。

消息路由:
producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。其路由机制为:
1.指定了 patition,则直接使用。 
2.未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition。
3.patition 和 key 都未指定,使用轮询选出一个 patition。

Zookeeper在Kafka中的作用

Kafka在zk中的一些存储结构

1.Broker Node的注册

当一个Kafka broker启动后,会向zookeeper注册自己的节点信息,该节点为一个临时节点,当broker断开和zookeeper的连接时,其临时节点将会被删除。

路径:/broker/ids/[0...N]

其中[0..N]表示broker id(broker id唯一,不可以重复),znode的值为对应broker的相关信息,如下:

{
    "jmx_port": -1, //JMX的端口号
    "timestamp": "1460082147315",//broker启动的时间戳
    "host": "xx.xxx.xxx.xxx",//host
    "version": 1,//默认的版本
    "port": 9092 //broker进程的对外监听的端口号
}

2.Broker Topic注册

当一个broker启动时,会向zookeeper注册自己持有的topic和partitions信息,为临时节点

路径:/broker/topics/[topic]/partitions/[0...N]

其中[0..N]表示partition索引号。其znode下的信息如下:

{
    "controller_epoch": 17,//中央控制器的总的选举次数
    "leader": 0, //此partition的broker leader的id
    "version": 1, //默认版本号
    "leader_epoch": 1,//此partition的leader选举的次数
    "isr": [ 0 ] //同步副本组brokerId顺序列表
}

3.Consumer id注册

在kafka consumer的配置参数中有consumer.id,为临时节点

路径:/consumers/[group_id]/ids/[consumer_id]

{
    "version": 1,
    "subscription": { "user11": 1 },
    "pattern": "static",
    "timestamp": "1460083658252"
}

{“topic_name”:#streams…},即表示此consumer目前所消费的topic + partitions列表

4.Consumer offset 跟踪

用来跟踪每个consumer group目前所消费的partition中最大的offset,此znode为永久节点

路径:/consumers/[group_id]/offsets/[topic]/[partition_id]

可以看出offset跟group_id有关,以表明当group中一个消费者失效,其他consumer可以继续消费

5.PartitionOwner注册

用来标记partition被哪个consumer消费,为临时节点

路径:/consumers/[group_id]/owners/[topic]/[partition_id]

问题:

1. Kafka如何保证消息顺序一致性?
(1)一个topic只用一个partition,不推荐
(2)使用同一个key,这样相同key的消息会落在同一个partition

2. 如何删除Kafka的旧数据?有几种方式?Kafka读取消息的时间复杂度?
(1)基于时间:log.retention.hours=168
(2)基于大小:log.retention.bytes=1073741824

3. Kafka消息消费采用什么模型?为什么使用Pull而不用Push?Pull有什么缺点,Kafka是如何解决的?
(1)Push模型很容易使得Consumer来不及处理消息,可能造成消息丢失,典型表现就是拒绝服务以及网络拥塞
(2)Pull模型,可以使消费者自主控制消费消息的速率,也可控制逐条消费或批量消费
(3)Pull模型缺点,如果没有数据,consumer会陷入无限循环中等待数据到达,为避免这种情况,pull请求中有参数,允许消费者请求在等待数据到达的长轮询中进行阻塞。

参考资料:
https://blog.csdn.net/qq_35641192/article/details/80956244
https://blog.csdn.net/taoy86/article/details/80271784
https://www.cnblogs.com/yinchengzhe/p/5111648.html
https://blog.csdn.net/ouyang111222/article/details/51094912

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容