KafkaKafkaKafkaKafka集群文档一、入门...............................................................................................11、简介...........................................................................................12、Topics/logs.............................................................................23、Distribution...........................................................................44、Producers.................................................................................55、Consumers.................................................................................5二、使用场景.......................................................................................61、Message.....................................................................................62、Websitactivitytracking..................................................63、LogAggregation.....................................................................6三、设计原理.......................................................................................71、持久性.......................................................................................72、性能...........................................................................................73、生产者.......................................................................................84、消费者.....................................................................................105、消息传送机制.........................................................................216、复制备份.................................................................................227、日志.........................................................................................238、zookeeper...............................................................................25四、主要配置.....................................................................................291、Broker配置............................................................................292、Consumer主要配置................................................................303、Producer主要配置................................................................30五、broker集群的搭建..................................................................311、单机环境的搭建部署.............................................................312、集群环境的搭建部署.............................................................32一、入门一、入门一、入门一、入门1111、简介Kafka是linkedin用于日志处理的分布式消息队列,同时支持离线和在线日志处理。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性,为集群保存一些meta信息。2222、Topics/logsTopics/logsTopics/logsTopics/logs一个Topic可以认为是一类消息,每个topic将被分成多个partition(区),每个partition在存储层面是appendlog文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一标记一条消息。kafka并没有提供其他额外的索引机制来存储offset,因为在kafka中几乎不允许对消息进行“随机读写”。在kafka中,即使消息被消费,消息仍然不会被立即删除。日志文件将会根据broker中的配置要求,保留一定的时间之后删除;比如log文件保留2天,那么两天后,文件会被清除,无论其中的消息是否被消费。kafka通过这种简单的手段,来释放磁盘空间,以及减少消息消费之后对文件内容改动的磁盘IO开支。对于consumer而言,它需要保存消费消息的offset,对于offset的保存和使用,由consumer来控制;当consumer正常消费消息时,offset将会线性的向前驱动,即消息将依次顺序被消费。事实上consumer可以使用任意顺序消费消息,它只需要将offset重置为任意值。(offset将会保存在zookeeper中,参见下文)kafka集群几乎不需要维护任何consumer和producer状态信息,这些信息由zookeeper保存;因此producer和consumer的客户端实现非常轻量级,它们可以随意离开,而不会对集群造成额外的影响。partitions的设计目的有多个。最根本原因是kafka基于文件存储。通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;可以将一个topic切分多任意多个partitions来保存消息。此外越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力。(具体原理参见下文)。3333、DistributionDistributionDistributionDistribution一个Topic的多个partitions,被分布在kafka集群中的多个server上;每个server(kafka实例)负责partitions中消息的读写操作;此外kafka还可以配置partitions需要备份的个数(replicas),每个partition将会被备份到多台机器上,以提高可用性。基于replicated方案,那么就意味着需要对多个备份进行调度;每个partition都有一个server为leader;leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);follower只是单调的和leader跟进,同步消息即可。由此可见作为leader的server承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多少个leader,kafka会将leader均衡的分散在每个实例上,来确保整体的性能稳定。�发送到partitions中的消息将会按照它接收的顺序追加到日志中。�对于消费者而言,它们消费消息的顺序和日志中消息顺序一致。�如果Topic的replicationfactor为N,那么允许N-1个kafka实例失效。4444、ProducersProducersProducersProducersProducer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于round-robin方式或者通过其他的一些算法等。5555、ConsumersConsumersConsumersConsumers本质上kafka只支持Topic。每个consumer属于一个consumergroup;反过来说,每个group中可以有多个consumer。发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。如果所有的consumer都具有相同的group,这种情况和queue模式很像;消息将会在consumers之间负载均衡。如果所有的consumer都具有不同的group,那这就是发布-订阅,消息将会广播给所有的消费者。在kafka中,一个partition中的消息只会被group中的一个consumer消费;每个group中consumer消息消费互相独立;我们可以认为一个group是一个订阅者,一个Topic中的每个partions,只会被一个订阅者中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息。kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的。事实上,从Topic角度来说,消息仍不是有序的。kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。二、使用场景二、使用场景二、使用场景二、使用场景1111、MessagMessagMessagMessageeee对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势。不过kafka并没有提供JMS中的事务性、消息确认机制、消息分组等企业级特性,kafka只能作为常规的消息系统,在一定程度上,尚未确保消息的发送与接收绝对可靠(比如,消息重发,消息发送丢失等)。2222、WebsitWebsitWebsi