kafka

1.实时的处理机制为什么使用kafka

kafka是一种分布式的,基于发布/订阅的消息系统,能够高效并实时的吞吐数据,以及通过分布式集群及副本冗余机制实现数据的安全。

       1.我们使用flume收集日志的时候,假设没有kafka 直接给storm去处理,如果说flume收集的太快,storm来不及处理的话,可能就会数据容错,所以这个时候使用kafka消息队列,可以起到一个缓存的作用。

        2.kafka提供了消费持久化机制,无论消费者是否消费,都会存储,而且通过副本冗余机制提供数据的容错性。

        3.kafka是一个分布式架构,可以吞吐海量数据,可以保证数据不丢失,但是不确保精确的事务性,相当于牺牲了精确的事务性,而提高的数据吞吐量。

2.和其他kafka进行对比



3.kafka引入分区的目的

1.可以将数据分布式的存储到多个不同的服务器

2.kafka中可以有多个主题,多个分区,多个副本

    对应的关系如下图


 每一台kafka服务器对应一个主题,一个主题可以有多个分区存储数据,这些分区可以在不同的服务器也可以在同一台服务器中,不同的分区代表不同的硬盘位置。

    1·)分区的好处

            分区可以实现高伸缩性,负载均衡,动态调节等能力。分区机制是kafka实现高吞吐的秘密武器

     2.)分区的数的选择

            分区并不是分区数越多越好,分区越多所消耗的资源越多。决定分区得数两必须根据不同的业务场景来决定,比较无脑的方法就是broker机器数量的2~3倍

       3.)分区写入策略

            a.轮询策略:即按顺序轮流依次写入到不同的分区中;优点是比较均衡的将所有消息平均的送到每一个分区中

            b.随机策略:每次随机的将消息分配到每个分区,先得出分区的数量,按照获取一个随机数,来决定送到那个分区;   

            c.按键保存策略:当生产者发送数据时,可以指定一个key,计算这个key的hashcode,按照hashcode的不同对不同的消息进行存储

              让需要顺序存储的数据都指定相同的键,而不需要顺序存储的数据指定不同的键,这样一来,即实现了顺序存储的需求,又能够享受到kafka多分区的优势,岂不美哉。 

        4.)实现自定义分区

            第一种是在发送producer的时候,在ProducerRecord中直接指定,但需要知道具体发送的分区index,所以并不推荐。   

            第二种则是需要实现Partitioner.class类,并重写类中的partition(String topic, Object key, byte[] keyBytes,Object value, byte[] valueBytes, Cluster cluster) 方法。后面在生成kafka producer客户端的时候直接指定新的分区类就可以了。

4.kafka副本机制

    在kafka中,每个主题可以有多个分区,每个分区又可以有多个副本。这多个副本中,只有一个是leader,而其他的都是follower副本。仅有leader副本可以对外提供服务。

多个follower副本通常存放在和leader副本不同的broker中。通过这样的机制实现了高可用,当某台机器挂掉后,其他follower副本也能迅速”转正“,开始对外提供服务。

kafka的副本都有哪些作用?

在kafka中,实现副本的目的就是冗余备份,且仅仅是冗余备份,所有的读写请求都是由leader副本进行处理的。follower副本仅有一个功能,那就是从leader副本拉取消息,尽量让自己跟leader副本的内容一致。

说说follower副本为什么不对外提供服务?

这个问题本质上是对性能和一致性的取舍。试想一下,如果follower副本也对外提供服务那会怎么样呢?首先,性能是肯定会有所提升的。但同时,会出现一系列问题。类似数据库事务中的幻读,脏读。

比如你现在写入一条数据到kafka主题a,消费者b从主题a消费数据,却发现消费不到,因为消费者b去读取的那个分区副本中,最新消息还没写入。而这个时候,另一个消费者c却可以消费到最新那条数据,因为它消费了leader副本。

看吧,为了提高那么些性能而导致出现数据不一致问题,那显然是不值得的。

- kafka In-sync Replicas(ISR

1、ISR不只是追随者副本集合,它必然包括 Leader 副本。甚至在某些情况下,ISR 只有 Leader 这一个副本

2、通过Broker 端replica.lag.time.max.ms 参数(Follower 副本能够落后 Leader 副本的最长时间间隔)值来控制哪个追随者副本与 Leader 同步?只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

3、ISR 是一个动态调整的集合,而非静态不变的。

某个追随者副本从领导者副本中拉取数据的过程持续慢于 Leader 副本的消息写入速度,那么在 replica.lag.time.max.ms 时间后,此 Follower 副本就会被认为是与 Leader 副本不同步的,因此不能再放入 ISR 中。此时,Kafka 会自动收缩 ISR 集合,将该副本“踢出”ISR。

倘若该副本后面慢慢地追上了 Leader 的进度,那么它是能够重新被加回 ISR 的。

4、ISR集合为空则leader副本也挂了,这个分区就不可用了,producer也无法向这个分区发送任何消息了。(反之leader副本挂了可以从ISR集合中选举leader副本)

-kafka leader副本所在broker挂了,leader副本如何选举

1、ISR不为空,从ISR中选举

2、ISR为空,Kafka也可以从不在 ISR 中的存活副本中选举,这个过程称为Unclean 领导者选举,通过Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性。反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

- producer的acks参数

前面说了那么多理论的知识,那么就可以来看看如何在实际应用中使用这些知识。

跟副本关系最大的,那自然就是acks机制,acks决定了生产者如何在性能与数据可靠之间做取舍。

配置acks的代码其实很简单,只需要在新建producer的时候多加一个配置:

val properties =newProperties()......props.put("acks","0/1/-1");//配置acks,有三个可选值......其他配置val producer =newKafkaProducer[String,String](properties)

acks这个配置可以指定三个值,分别是0,1和-1。我们分别来说三者代表什么:

acks为0:这意味着producer发送数据后,不会等待broker确认,直接发送下一条数据,性能最快

acks为1:为1意味着producer发送数据后,需要等待leader副本确认接收后,才会发送下一条数据,性能中等

acks为-1:这个代表的是all,意味着发送的消息写入所有的ISR集合中的副本(注意不是全部副本)后,才会发送下一条数据,性能最慢,但可靠性最强

还有一点值得一提,kafka有一个配置参数,min.insync.replicas,默认是1(也就是只有leader,实际生产应该调高),该属性规定了最小的ISR数。这意味着当acks为-1(即all)的时候,这个参数规定了必须写入的ISR集中的副本数,如果没达到,那么producer会产生异常。

5.kafka offset机制

    1.生产者Ofsset

生产者将消息发送给某一个topic时,要看有多少个分区,因为kafka是通过分区机制实现分布式的。


图 生产者offset

通过此图可以清晰的看到生产者的offset原理,不管是多少个生产者,还是我们规定了他们会写入哪一个分区,但只要他们写入的时候,一定是每一个分区都有一个offset,这个offset就是生产者的offset,同时也是这个分区的最新最大的offset。

有些时候我们在开发生产者代码时并没有指定某一个分区的offset,可能是我们使用的单分区,或者默认均匀的写入多个分区,这个工作kafka帮我们完成了。

        2.消费者Offset


这是某一个分区的offset情况,我们已经知道生产者写入的offset是最新最大的值也就是12,而当Consumer A进行消费时,他从0开始消费,一直消费到了9,他的offset就记录在了9,Consumer B就纪录在了11。等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。

这样即使有多个分区,消费者也能灵活使用。

还有一种offset的说法,就是consumer消费未提交时,本地是有另外一个offset的,这个offset不一定与集群中记录的offset一致。

所以,kafka每一个topic分区和生产者,消费者不同,是有多个offset的。

总结如下:

offset是指某一个分区的偏移量。

topic  partition  offset 这三个唯一确定一条消息。

生产者的offset其实就是最新的offset。

消费者的offset是他自己维护的,他可以选择分区最开始,最新,也可以记住他消费到哪了。

消费者组是为了不同组的消费者可以同时消费一个分区的消息。

6.zero copy

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

推荐阅读更多精彩内容