kafka 介绍
Kafka is a distributed, partitioned, replicated commit log service.
Terms:
Topic: kafka maintains message in categories called topics
Producer: processes publishing messages to a kafka topic.
Broker: in kafka cluster, each kafka server is called a broker.
Consumer: processes that subscribe to topics and process messages.
1. partition 与 topic
每个topic可以划分为多个partition,这个是可以在创建topic时指定,每个partition存储一部分message。
partition以文件形式存储在系统中,例如创建一个关键字为mobile的有3个partition的topic,那么在数据目录log.dirs中,就会有3个目录:mobile-0,mobile-1,mobile-2。
每个partition中message,都是有序的,即每个message在每个partition中都有个编号(offset或者叫id),另还有messageSize(int32), data(源数据)。
partition数据文件,就是根据message的offset 从小到大写入的,且不是全部写入一个文件,会进行数据分段存储,例如offset 0-999存一个文件,1000-1999存一个文件....
同时为每个分段文件创建一个同名.index的文件,稀疏地记录快速定位点/同步点(相对该段文件起始offset的相对offset,以及对应偏移量)。
kafka会保存所有的message,无论这个message是否已经被消费,保存的时间是可配的,到期后才删除。正常情况下,消费端是线性地消费message,不过也可以以任何顺序消费,如重置offset 消费之前消费过的数据。
kafka只保证每个partition中得message是有序的,并不能保证一个topic的所有partitions里的消息有序,所以如果要求所有有序,则只能用1个partition了
2. destributed 和 replicated
官方描述非常清晰
The partitions of the log are distributed over the servers in the Kafka cluster with each server handling data and requests for a share of the partitions. Each partition is replicated across a configurable number of servers for fault tolerance.
Each partition has one server which acts as the "leader" and zero or more servers which act as "followers". The leader handles all read and write requests for the partition while the followers passively replicate the leader. If the leader fails, one of the followers will automatically become the new leader. Each server acts as a leader for some of its partitions and a follower for others so load is well balanced within the cluster.
3. producers
producers 将消息发往所选择的topic,同时也负责选择具体一个partition去发送,可以是round-robin 或者其他load balance方法。
4. consumers
消息处理方式主要有两种: 队列 和 发布订阅。
队列:一组消费者从队列从取消息,但一条消息只会流向其中一个消费者。
发布订阅:消息广播到所有消费者。
kafka方式:也是广播模式,不过每个consumer可以是一个consumer组,只给每个组中的一个consumer发消息,这就允许同个group的consumers实现负载均衡。换句话说,kafka集群对于同一个gourp的consumers来说,相当于队列方式。
5. kafka 不足之处
partition, replication 使得kafka具备较好的性能和不错的容灾性,也方便扩展。
不过kafka缺乏事务支持,不能确保消息的发送与接收绝对可靠,如消息丢失、重发等。
性能也只是较好,不如flume,因为kafka采用的是磁盘文件存储消息,依赖磁盘IO速度。
6. 负载均衡
producers与topic的所有partitions的leader保持网络连接,具体某条message发送到哪个partition,由producers采用一定的负载均衡算法实现。 在这其中,partition leaders注册到zookeeper,producers作为zookeeper客户端监听partition leaders的变更事件。
7. consumer机制:jms Vs kafka
consumer端向broker发送"fetch"请求,并告知其获取消息的offset;此后consumer将会获得一定条数的消息;consumer端也可以重置offset来重新消费消息.
在JMS实现中,Topic模型基于push方式,即broker将消息推送给consumer端.不过在kafka中,采用了pull方式,即consumer在和broker建立连接之后,主动去pull(或者说fetch)消息;这中模式有些优点,首先consumer端可以根据自己的消费能力适时的去fetch消息并处理,且可以控制消息消费的进度(offset);此外,消费者可以良好的控制消息消费的数量,batch fetch.
其他JMS实现,消息消费的位置是有prodiver保留,以便避免重复发送消息或者将没有消费成功的消息重发等,同时还要控制消息的状态.这就要求JMS broker需要太多额外的工作.在kafka中,partition中的消息只有一个consumer在消费,且不存在消息状态的控制,也没有复杂的消息确认机制,可见kafka broker端是相当轻量级的.当消息被consumer接收之后,consumer可以在本地保存最后消息的offset,并间歇性的向zookeeper注册offset.由此可见,consumer客户端也很轻量级.
对于JMS实现,消息传输担保非常直接:有且只有一次(exactly once).在kafka中稍有不同:
1) at most once: 最多一次,这个和JMS中"非持久化"消息类似.发送一次,无论成败,将不会重发.
2) at least once: 消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功.
3) exactly once: 消息只会发送一次.
at most once: 消费者fetch消息,然后保存offset,然后处理消息;当client保存offset之后,但是在消息处理过程中出现了异常,导致部分消息未能继续处理.那么此后"未处理"的消息将不能被fetch到,这就是"at most once".
at least once: 消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成功之后,但是在保存offset阶段zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时可能获得上次已经处理过的消息,这就是"at least once",原因offset没有及时的提交给zookeeper,zookeeper恢复正常还是之前offset状态.
exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的.
通常情况下"at-least-once"是我们搜选.(相比at most once而言,重复接收数据总比丢失数据要好)
http://my.oschina.net/frankwu/blog/305010#OSC_h4_6
http://shiyanjun.cn/archives/934.html
浙公网安备 33010602011771号