多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Kafka 术语 * 消息(Record) * Kafka 中发布订阅的对象是 `Topic`,可以为每个业务、应用、数据类型定义 Topic。 * 生产者(Producer) * 消费者(Consumer) * 客户端(Clients):生产者、消费者统称为客户端 * 服务端 * Kafka 的服务器端:Broker 服务进程 * 一个 Kafka 集群由多个 Broker 组成 * Broker:负责接收和处理客户端发送过来的请求 & 消息持久化 * 多个 Broker 进程能够运行在同一台机器上 * 但常见做法:将不同的 Broker 分散运行在不同的机器上 * 备份机制(Replication) * 备份思想:把相同的数据拷贝到多台机器上 * 副本(Replica):Kafka 中称这些相同的数据为副本 * 副本保存相同的数据 * 但有不通的角色和作用 * 领导者副本(Leader Replica) * 对外提供服务(i.e. 与客户端进程交互) * 追随者副本(Follower Replica) * 只追随领导者副本数据 * 不对外提供服务 * 副本的工作机制 * Producer * 向 Leader Replica 写消息 * Consumer * 从Leader Replica 读消息 * Follower Replica * 向 Leader Replica 发送请求,获取最新生产的消息 * 目的:与 Leader 保持同步 * 副本的优缺点 * 优点 * 保证数据的持久化 / 消息不丢失 * 缺点 * 不能解决伸缩性问题 * 伸缩性(Scalability) * 伸缩性问题:当 Leader Replica 副本积累太多以至于单台 Broker 机器无法容纳的问题 * 考虑将数据分割成多份保存在不同的 Broker 上 * 分区机制(Partitioning) * Kafka 将每个 Topic 划分为多个分区(Partition) * 每个分区是一组有序的消息日志 * Producer 生产的每条消息只会发送到一个分区中 * Kafka 分区编号从 0 开始 * 副本是分区这个层级定义的,即对 Partition 实现副本机制 * 每个 Partition 可以配置 N 个副本,其中 1 个 Leader Replica,N-1 个 Follower Replica * Producer 向分区写消息,每条消息在分区中的位置信息由一个叫`位移(Offset)`的数据来表征 * 分区位移从 0 开始 * 日志 * 追加写 * 日志段 * 通过日志段进行回收 ### Broker 持久化数据 * Kafka 使用消息日志(Log)保存数据 * 一个日志 * 定义:磁盘上一个只能追加写(Append-only)消息的物理文件 * Apped-only 避免了缓慢的随机 IO 操作,改为性能更好的顺序 IO 写 * 回收磁盘 * 通过日志段(Log Segment)机制 * 当写满了一个日志段后,Kafka 会自动切分出一个新的日志段 * 同时将老日志段封存 * Kafka 在后台通过定时任务,定期检查老日志段是否可以删除,从而回收磁盘 ### P2P 模式的实现 * P2P 指消息只能被下游一个消费者消费 * 消费者组(Consumer Group) * 通过饮用消费者组来实现 P2P * 定义:多个 Consumer 共同组成一个组来消费一组 Topic * 这组 Topic 中的每个 Partition 都只会被组内的一个 Consumer 消费 * e.g. 一个 Topic 被分 N 个 Partition,那么这个消费者组中可以有 N 个 Consumer,每一个 Consumer 消费一个 Partition * 分配后的 Partition 其他 Consumer 不能消费 * 引入消费者组的目的 * 提升消费端吞吐量(TPS) * 一个消费者实例(Consumer Instance) * 可以是业务 * 也可以是单个进程、线程 * Kafka 重平衡(Rebalance) * 当一个消费者组内某个 Consumer 实例挂了 * Kafka 通过自动检测,将 Failed Consumer 实例之前负责的 Partition 转移给其他活着的消费者 * 消费者位移(Consumer Offset) * 每个 Consumer 在消费中通过字段记录它当前消费到了哪个 Partition 的哪个位置 * 每个 Consumer 都是不一样的 * 上面位移表示 Partition 内消息的位置,是不同的,因此其也称为分区位移 * 消费者位移可能随时变化,类似一个指针 ### Kafka 的三层架构 * Topic * 每个 Topic 配置 M 个 Partition * Partition * 每个 Partition 配置 N 个副本 * 1 个 Leader Replica,对外提供服务 * N-1 个 Follower Replica,只提供消息冗余作用 * Record * 每个 Partition 包含若干 Record * 每个 Record 的位移从 0 开始,依次递增 ### Kafka 提供高可用的手段总结 * Broker * Kafka 集群中每台机器都会运行多个 Broker 进程 * 一台机器挂了,其他机器的 Broker 依然能够对外提供服务 * 备份机制 ### Follower Replica & MySQL * Kafka 的 Follower Replica 是不会对外提供服务的 * 相反的,MySQL 的从库会对外提供读服务 ![](https://img.kancloud.cn/06/db/06dbe05a9ed4e5bcc191bbdb985352df_1173x634.png)