[1] - Kafka集群组件相关知识

1、kafka概念

kafka cluster集群,是开源的,分布式的,高吞吐量消息中间件(消息系统),可以有多个broker组成,一个broker作为一个实例(节点),kafka集群可以保存多种类型的数据,是由多个topic进行分类的。

2、kafka cluster组件

Producer:消息生产者,就是向kafka broker的多个topic发消息的客户端(client);
1)、生产者负责将数据传入kafka,比如flume,java后台服务,logstash等;
2)、生产者可以有多个,并且可以同时往一个topic中写数据,也可以同时往同一个partition中写数据;
3)、每一个生产者都是一个独立的进程,而且单个生产者就具有分发数据的能力;
4)、一个生产者可以同时往多个topic中分发数据(一般情况下不会发生)。

Consumer :消息消费者,从kafka broker的多个Topic取消息的客户端;

Topic :我们可以理解为一个消息队列,topic元数据信息存储在zookeeper中;topic中的数据是由多副本机制的,原始数据和副本数据不会在同一个节点上,且一个节点只存一份副本;

Consumer Group(CG):消费组,kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段, 一个topic可以有多个CG,topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partition只会在同一时刻把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了,要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic

**注意点:**
1)、消费者负责拉取数据,比如:streaming,storm,java服务
2)、消费者组中可以存在多个consumer,在streaming中,一个consumer对应一个线程(用来描述streaming)
3)、新增或减少group中的consumer数量会触发负载均衡,目的是减少部分brocker压力.提高kafka的吞吐量
4)、一个consumer group可以消费多个分区的数据,不可以同时消费多个分区的数据,可以在同一时间段内
5)、一个分区的数据最多在同一时刻被一个consumer消费
6)、在同一个consumer group中,数据是不可以重复消费的

Broker:一台装有kafka服务的节点即为一个broker,一个集群由多个broker组成。一个broker可以容纳多个topic。

Partition:一个topic可分为多个partitions,可称为分区或者分组,每个partition是一个有序的队列,分区数量可更改,并且在存储数据时有多副本机制,每个partition是由多segment组成的,segment的大小是相同的,默认是1G,但是因为不segment存的数据不同,所以数据条数不一样。
一个非常大的topic可以分布到多个broker(即服务器)上,partition中的每条消息都会被分配到一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如:你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka

3、本质上kafka只支持topic:

1、组件之间的关系简述:
一个broker为一台kafka服务器(节点),Producer端一个Topic可以认为是一个消息队列,一个
特别大的Topic可分布在多个kafka服务器上(broker),一个Topic可分成多个partitions;
Consumer端一个CG可包含多个Consumer,topic的一个partition只能在同一时刻被CG的一个consumer消费,但是CG一个consumer可以同时消费多个不同的partition中的消息,前提是一个CG内的consumer的个数不能大于partition的个数.

2、Consumer与topic的关系(重要): 结合实际场景
1)、每个CG有多个consumer,每个consumer属于一个CG,这样设计不仅可以提高
topic中消息的并发消费能力,而且还能提高"故障容错性",如果group中的
某个consumer失效那么其消费的partitions将会有其他consumer自动接管。
2)、Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个
consumer消费,此消息不会发送给一个group的多个consumer;
3)、那么一个group中所有的consumer将会交错的消费整个Topic,每个group中
consumer消息消费互相独立,我们可以认为一个group是一个"订阅者"。
4)、一个topic可以分成多个partitions,一个partition只能在同一时刻被group的一个consumer消费,但是一个consumer可以消费多个不同的partitions里的消息(同时一个group中不能有多于partition数量的consumer同时消费,否则意味着有些consumer将无法获取到消息)
5)、kafka只能保证一个partition中的消息被某个consumer消费时是顺序的(分区内有序);事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。

##Tip:如何保证kafka数据消费时的全局有序?(很少涉及,更多涉及多分区,跨区数据的有序性)
首先topic有多个partition分区,一个partition内数据是有序的,但是topic的多个分区之间无法保证有序性,所以要想保证全局有序性,只能设置一个partition。

猜你喜欢

转载自blog.csdn.net/murphyZ/article/details/88053465