Kafka架构探险(二)——一文带你了解Kafka

上篇博文已经讲解了如何安装Kafka的集群环境,今天我们就来一本带大家了解下Kafka,了解kafka的特点以及基本概念

kafka的特点

Kafka设计的初衷是为了解决互联网公司超大量级数据的实时传输,为了实现这个目标,需要考虑以下四个方面的问题

  • 吞吐量/延时
  • 消息持久化
  • 负载均衡和故障转移
  • 伸缩性
  1. 吞吐量是Kafka每秒能够处理的消息数,那么很显然,我们都希望系统的吞吐量越大越好,与此同时,还有个客户端发送指令,kafka服务端接受指令然后反馈给客户端的时间,这个时间就是延时,那么对于一个系统而言,延时时间间隔越短越好。而kafka是一个高吞吐量和低延时的系统,那么他是如何实现的呢?
  • 大量使用操作系统页缓存,内存的操作速度快且命中率高

由于大量使用也缓存,故读取消息时大部分消息很有可能依然保存在页缓存中,因此可以直接命中缓存,不用“穿透”到底层的物理磁盘上获取消息,从而极大的提升了读取的吞吐量

  • kafka不直接参与物理I/O操作,而是交由最擅长此事的操作系统来完成
  • 采用追加写入方式,摒弃了缓慢的磁盘随机I/O操作

kafka在设计时采用了追加写入消息的方式,即只能在日志文件末尾追加写入新的消息,且不允许修改已经写入的消息,因此他属于典型的磁盘顺序访问型操作,这种类型的操作访问速度堪比内存的读写速度,性能是非常高的

  • 使用sendfile为代表的零拷贝技术加强网络间的数据传输效率

kafka在读取消息时,会首先从OS的页缓存中读取,如果命中便把消息经页缓存直接发送到网络的Socket上,这个过程就是零拷贝技术

  1. 消息引擎都必须要具有持久化的机制,持久化的机制有如下的好处:
  • 让消息的生产和消费解耦

消息生产者只需要将消息发送给kafka即可,不必关系消息是被谁消费的,何时消费的

  • 灵活的消息处理

消息保存在kafka中,方便实现消息重演这样的需求,可以很方便的处理消息

  • 减少内存的使用

将消息持久化到kafka中,给内存释放出更多的空间,方便kafka使用页面缓存技术来提升系统的性能

  1. kafka是一个分布式流处理平台,所以kafka具有分布式系统的两个重要的特性——负载均衡和故障转移
  • 负载均衡就是让系统的负载根据一定的规则均衡的分配到所有参与工作的机器上,从而最大限度的提升整体系统的运行效率,kafka的负载均衡实际上是通过partition以及leader来实现的,后面再详细介绍
  • 当分布式系统的一个节点出现了问题,无法发送心跳或者会话,则master服务器认为备份服务器已经无法工作 ,将会根据一系列的算法来计算新的节点,实现了系统的高可用性
  1. 伸缩性,所谓的伸缩性表示向分布方式中额外的增加计算资源时吞吐量提升的能力,通俗点来讲,就是如何通过增加节点来扩展kafka集群环境的系统,这点kafka是通过将服务器的状态的相关的参数交给zookeeper来管理

kafka的基本概念

  1. 消息

消息是每一个消息引擎的重中之重,好的消息的结构设计能极大的优化系统的性能,这里kafka处理的非常好,我们也有必要理解下kafka的消息的组成以及为什么

首先消息是由:消息头部、Key和Value组成,其中消息头部还包括:CRC、版本号、属性、时间戳和键长度。

image

这里主要说明4个字段的含义:

  • 消息键:对消息做partition时使用,即决定消息被保存在某个topic下的哪个partition
  • 消息体:保存实际的消息数据
  • 时间戳:消息发送的时间戳,主要用于流式处理以及其他依赖时间的处理语义,默认是当前时间
  • 属性:kafka使用一个字节来保存消息的压缩属性,当前只支持4中压缩属性:0——无压缩 1——GZIP压缩 2——Snappy压缩 3——LZ4压缩

Kafka使用二进制字节数组来保存消息,这个和RabbitMQ是一样的,为什么要这样设计呢? 试想一下,如果我们使用Java的类来实现,如果存储成String字符串格式 ,那么对于Java内存模型,对象保存的开销是很大的,随着堆里面的数据量越来越大,GC的也就越频繁,那么系统的性能也就越差,其他Java的操作系统通常默认是开启页缓存机制的,也就是说堆上保存的对象可能在页缓存中还保留一份,这也造成了极大的资源浪费

因此,kafka在消息设计时,直接使用紧凑二进制字节数据,这样我们就能有更多的内存使用

  1. topic和partition

准确来说,topic是一个逻辑上的概念,一般我们用来作为业务上的一个区分的尺度,代表一类消息,比如说A发送消息到topicA中,B发送消息到topicB中,一个topic可能被多个消费者来消费,为了提供系统的吞吐量,kafka提出了partition的概念,我们可以认为一个topic是由多个partition组成的

image

kafka中的partition是不可修改的有序消息队列,每个partition有自己专属的partition号,通常是从0开始的,用户对partition唯一能做的就是在消息队列的尾部追加写入消息,每个消息队列中都有一个序号,这个序号就是接下里要说的 offset

  1. offset

partition中的每个消息队列都是固定的,并且从0开始递增

综合之前所说的topicpartition以及offset我们可以确定一条消息

  1. replica

我们知道partition是有序的消息队列,那么一定不是保存在一个地方的,否则一旦kafka挂了,其上保存的消息也就丢失了,分布式要实现高可用性,这里kafka采用了冗余机制——备份多个日志,这些日志在kafka中就被称为replica副本,他存在的唯一目的就是防止数据丢失

replica分为: leader replicafollower replica,follower replica唯一的用途就是leader replica所在的broker宕机了,不能对外提供服务了,则kafka就会从剩余的replica中选举新的leader来提供服务

  1. leader和follower

上面我们说过什么是leaderfollower,在kafka中,leader对外提供服务,follower只能被动的追随leader的状态,保持与leader同步,follower唯一存在的目的就是当leader宕机了,被选举称为新的leader来继续提供服务

kafka保证统一个partition的多个replica一定不会分配在同一台broker上,毕竟如果同一个broker上有同一个partition的多个replica,那么将无法实现备份冗余的效果

  1. ISR

ISR(in-sync replica)在kafka中是一个重要的概念, 翻译过来就是与 leader replica保持同步的replica集合, kafka为partition动态维护一个replica集合,该集合中的所有的replica保存的消息日志都与leader replica保持同步状态,只有这个集合中的replica才能被选为leader,也只有该集合中的replica都同时接收到同一条消息,kafka才会将该消息置为“已提交”状态,即认为该条消息发送成功

这里需要注意两点:

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

推荐阅读更多精彩内容