kafka-1kafka基本概念和集群架构
kafka基本概念和集群架构
消息系统的意义
- 解耦
- 生产者和消费者可以单独的进行扩展和修改,只需要遵循同样的接口约束就行
- 扩展性
- 因为解耦特性,可以单独的增加消息入队和处理频率
- 冗余和防止数据丢失
- 消息队列接受大量的数据并将数据持久化,直到被消费为止
- 从消息队里删除数据前,需要处理系统明确的告知消息队里已处理完数据,从而保证了数据不会丢失。
- 消息队列接受大量的数据并将数据持久化,直到被消费为止
- 灵活性和峰值处理能力
- 数据可能有峰值,按照峰值来配置资源会造成浪费。有了消息系统,峰值的压力由消息系统承担,大量的数据可以进入消息队里等待,而不是必须马上处理。
- 可恢复性
- 可恢复性主要指的是处理数据程序的可恢复性。系统的一部分组件失效时,不会影响整个系统。当某个处理程序重新启动后,可以继续处理数据
- 顺序保证
- 大部分消息队列是有序的,并且能保证数据会按照特定的顺序被处理。(kafka保证一个partition内的消息的消息有序,全局不保证,除非只有一个partition。但是只有一个partition就没意义了)
- 缓冲
- 由于解耦合消息队列的存在,生成消息和消费消息的速度可以不一致
- 异步通信
- 很多时候,用户不想也不需要立即处理数据。消息队列提供了异步通信机制。生产者可以一直向消息系统的消息队列放入数据,消费者可以在需要的时候处理数据。
简单来说消息系统的核心意义是
- 解耦
- 消息队列
- 数据持久化
由以上特性延展派生出可扩展、缓冲、异步通信、灵活性、顺序保证和可恢复性。
kafka前身和概念
kafka前身
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
kafka概念
kafka是一个分布式消息队列。
- 具有高性能、持久化、多副本备份、横向扩展能力。
- 生产者往队列里写消息,消费者从队里里取消息进行业务逻辑。
- kafka是一种发布-订阅模式,将消息保存在磁盘中,以顺序读写的方式访问磁盘,避免随机读写导致性能瓶颈。
kafaka特性
- 高吞吐、低延迟
- kafka最大的特点就是,收发消息特别快。每秒可以处理几十万条消息,最低延迟只有几毫秒
- 高伸缩性
- 每个主题(topic)包含多个分区(partition),主题中的分区可以分布在不同的主机(broker)中
- 持久性、可靠性
- kafka允许数据持久化存储,消息被持久化到磁盘中,并支持数据备份来防止数据丢失
- 容错性
- 允许集群中的节点失败、某个节点宕机、kafka仍然能正常工作。
- 高并发
- 支持数千个用户同时读写
kafka集群架构
kafka集群中的角色
-
producer
- 消息生产者,发布消息到kafka集群的终端或服务
-
broker
- kafka集群中的服务器,一个broker代表kafka集群的一个节点
-
topic
- 每条发布到kafka集群的消息属于的类别,某一类消息的聚集,如:订单topic。不同类别的消息会去往不同的topic。kafka是面向topic的
- topic就像一个消息队列,生产者根据消息的类别写往不同的topic,消费者从中读取消息。
- 一个topic支持多个订阅者同时订阅它。
-
partition
- 每个topic包含一个或多个partition。kafaka分配的单位是partition
-
replica
- partition的副本,保障kafka的高可用
-
consumer
- 消费者,从kafka中消费消息的终端或服务
- consumer数量大于partition则有consumer空闲
- consumer数量小于partition,则一个consumer消费多个partition
- consumer数量等于partition,则一对一
- 消费者,从kafka中消费消息的终端或服务
-
consumer group
- 每个consumer都属于一个consumer group
- 同一个partition只能被同一个consumer group中的一个consumer消费
- 同一个partition从可以被不同consumer group中的多个不同consumer消费
- 因为一般同一个consumer group一般处理同一个业务,比如统计订单数据。同一组的多个如果消费同一个partition则可能导致数据统计重复。
- 每个consumer都属于一个consumer group
-
leader
- 每个topic有至少一个partition,每个partition有且仅有一个leader。
- leader负责当前partition数据的读写,生产者和消费者只和leader互动
-
follow
- Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader
-
controller
- controller主要负责kafka集群的管理,包含
- 感知broker是否宕机
- leader的选举
- partition的选举
- 对新增broker的监听
- 新增加broker后数据的迁移和负载均衡
- kafka集群的各种元数据:如leader、partition、follower的位置等等
- 删除topic后partition的删除
- 等等
- controller负责管理整个集群的各种东西
- controller主要负责kafka集群的管理,包含
-
zookeeper
- kafka通过zookeeper来存储集群的元数据信息
- controller节点回在ZK上注册一个临时节点,其他节点监听该临时节点。当该controller节点宕机后,其他broker争抢再次创建临时节点,保证一台新的broker会成为controller角色。
-
offset
- 偏移量即消费者在对应分区上已经消费的消息数(位置)。offset保存的地方和kafka的版本有关系
- kafka0.8 版本之前offset保存在zookeeper上
- kafka0.8 版本之后offset保存在kafka集群上
- 偏移量即消费者在对应分区上已经消费的消息数(位置)。offset保存的地方和kafka的版本有关系
-
ISR机制: ISR机制主要是为了保证数据的不丢失,ISR列表中存放和leader数据完全同步的follower
- 多副本机制能保证kafka的高可用,但不能保证数据不丢失。leader宕机时,数据还没有被同步到其他follower,即使选举了新的leader,也会丢失没有同步部分的数据。
- ISR是:in-sync replica,就是跟leader partition保持同步的follower partition的数量,只有处于ISR列表中的follower才可以在leader宕机之后被选举为新的leader,因为在这个ISR列表里代表他的数据跟leader是同步的。