提示
Kafka是一个分布式的、分区的、多副本的、多订阅者的消息中间件,最初由Linkedin公司开发,后贡献给了Apache基金会成为顶级开源项目。Kafka常用于日志收集系统、消息系统等场景。其优点包括解耦、冗余、扩展性、灵活性、峰值处理能力、可恢复性、顺序保证、缓冲和异步通信等。在Kafka中,常见术语包括Broker(服务器节点)、Topic(消息类别)、Partition(数据分割)、Producer(生产者)、Consumer(消费者)、Consumer Group(消费者组)、Leader(负责读写数据的副本)和Follower(跟随Leader的副本)。

Kafka最先是由Linkedin公司开发,是一个分布式的、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当作MQ系统),常见可用于web/nginx日志、访问日志、消息服务等等。于2010年贡献给了Apache基金会并成为顶级开源项目。
一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需要关系数据,不需要关心数据之间是如何传递的。
分布式消息传递基于可靠的消息队列,在客户端和消息系统之间异步传递消息。
消息的传递模式:


解耦
我们在项目开始的时候预测将来可能出现的需求是十分困难的。但是消息系统不用关心其内部处理过程,只需要遵循其约定好的消息的接口。这就允许你方便的扩展或修改其两边的处理过程,只需要保证其双方均遵循同样的接口约束。
冗余(副本)
扩展性
灵活性&峰值处理能力
可恢复性
顺序保证
缓冲
异步通信
在深入理解Kafka之前,先介绍一下Kafka中的术语。下图展示了Kafka的相关术语以及之间的关系:

上图中一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。
如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。
Kafka 集群包含一个或多个服务器,服务器节点称为broker。
broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
类似于数据库的表名
topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。
消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。
本文作者:CodeJump
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!