kafka+logstash多管道的配置中出现的有管道不工作的问题的解决方法
切勿忽略:kafka中某个topic设立下的分区(partition)只能由相同group中的一个consumer进行消费。
相同group的consumer可以同时消费一个topic,但是如果topic只设立了一个分区,那么这组consumer只能其中的一个进行消费。
故:在分布式集群中最好的方法是有几个消息分区(partition)就设立几个消费者(consumer)组。
再说两个问题:1、kafka为什么要在topic中加入分区的概念?
topic是逻辑概念,partition是物理概念,对于用户来说都是透明的。producer只需要关心消息发往哪一个topic,而consumer只需要关心自己订阅哪一个topic。他们都不需要关心每条消息存在于整个集群的哪个broker。
为了性能考虑,如果topic内的消息只存放在一个broker,那么这个broker就会成为一个瓶颈,无法做到水平扩展。所以我们在考虑扩展性的同时选择了将topic的消息平铺于集群之上。partition的引入就是解决水平扩展。
我们可以将partition看成一个无限长度的数组,新数据会追加到这个数组。物理上,partition又像是一个文件夹,一个broker可以存放好多个这样的文件夹。这样producer将数据发送给多个broker上的多个partion,consumer又从多个broker上面的多个partition并行读数据,完成水平扩展。
2、如果没有分区,topic中的segment消息写满后直接给订阅者不也是可以吗?
其实consumer消费只要他想,并不需要等segment写满,只要有一条消息被commit,他就可以立马被消费。segment对应两个文件,一个数据文件,一个索引文件。一个partition对应一个文件夹,一个partition可以包含任意多个segment。所以 partition可以理解为在segment上做了一层包装。
如果没有partiton,我们直接对segment进行顺序写,那么这个文件就会一直增大。同时,在做data purge时候,需要把文件的前面部分删除,不符合Kafka对文件顺序写优化方案。现在有了partition,每次做data purge只需要把旧的segment文件 整个删除即可,保证了每个segment的顺序写。
这里附加上知乎大佬的发言:
Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力。由于消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高(引用Apache Kafka – A High Throughput Distributed Messaging System的观点),是Kafka高吞吐率的重要保证之一。为了保证数据的可靠性,Kafka会给每个分区找一个节点当带头大哥(Leader),以及若干个节点当随从(Follower)。消息写入分区时,带头大哥除了自己复制一份外还会复制到多个随从。如果随从挂了,Kafka会再找一个随从从带头大哥那里同步历史消息;如果带头大哥挂了,随从中会选举出新一任的带头大哥,继续笑傲江湖。(作者:张琪 知乎链接:https://www.zhihu.com/question/28925721/answer/139861200)

浙公网安备 33010602011771号