赞
踩
kafka要点
创建一条记录,记录中一个要指定对应的topic和value,key和partition可选。 先序列化,然后按照topic和partition,放进对应的发送队列中。
kafka,从逻辑上划分,分为多个topic,每个topic由一个或多个partition组成,多个partition分布在不同的机器上,每个partition都有自己的1个或多个备份,每组partion都有一个leader负责接收信息,其他的follower负责复制信息,每个partition内部的记录是有序的,partition之间是无序的。
kafka为什么快,kafka的快指的是较大的读写吞吐量,从读写两个角度来看:
顺序写:比随机写的效率高很多。
page cache:由于文件的写入是顺序写,所以读取时利用page cache提升很大效率。
zero-copy:使用sendfile方式,减少了用户缓存,调用两次DMA copy,减少了两次CPU copy。
consumer使用mmap方式读取文件,减少了一次cpu copy,加速了读数据的效率。
由于多分区的设计,所以consumer可以并发读,加速读取速度。当然多分区也加大了并发写。
攒多条记录,批量处理请求。
消息支持压缩
消息投递可靠性:ack机制
当我们用producer写入数据时,我们需要知道producer是否收到消息同时消息的partition是否已经复制成功,这种向Produce发送消息的确认机制就叫做ack机制,ack机制有三种选择,不同模式有自己的侧重点,要么为了较大的吞吐量,要么为了保证消息的可靠性。
ack有三个可选值:1,0,-1
ack=1:这也是ack的默认值,producer只收到leader partition写入成功的消息就认为成功。
ack=0:producer把消息发出去,不需要等待任何确认收到的消息。数据可靠性最低,传输效率最高。
ack=-1/all:producer把消息发出去,需要等待leader、follower确认收到消息,才认为这条消息是写入成功的。保证了消息的可靠性,但是效率会受到影响。
ack=-1/all就一定保证消息的可靠吗?
不是,当partition只有一个副本时,ack=-1/all就等价于ack=1。所以当想设置ack=-1/all时,先检查partition的副本数是否为1。
kafka中zookeeper做了什么事
zk记录了所有broker的存活信息,broker会向zk发送心跳来上报自己的状态。zk维护了一个正在运行的broker列表。
从多个broker中选举出controller,controller负责管理集群所有分区和副本的状态,比如某个分区的leader故障了,controller会选举出新的leader。如果一个broker故障了,所有在该broker上的leader都会被重新选举。
限额权限:kafka允许client有不同的生产和消费的限额,这些限额配置信息保存在zk中。所有的topic的访问控制信息也在zk中维护。
offset:kafka旧的版本中将offset存储在zk中,新版本中,kafka专门做了一个offset manager
和broker一样,consumer也需要向zk注册。 Producer不需要管理,随便一台计算机都可以作为Producer向Kakfa Broker发消息。
kafka还有一些场景用到了zk,详情参见:
http://t.zoukankan.com/yogoup-p-12000545.html
https://www.jianshu.com/p/a036405f989c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。