觉醒吧!Kafka!!!

        最近一直在学Kafka相关的知识,推荐一本书:《深入理解Kafka核心设计与实践原理》——朱忠华 著。这本书确实写的很不错,写的非常透彻、细致,研读下来能收获不少。所以从今天开始,我打算用一个月的时间解读一下这本书。整理成类似笔记的文章,算是一种学习总结吧。如果你也刚好在学Kafka或者想了解这方面的知识,又或者已经在工作中使用到了,欢迎大家下面留言讨论!

        言归正传,下面我们直接开始第一篇《初识Kafka》。

                                                                             

                                                                                          初识Kafka

>>>> 基本概念

         Kafka是一个多分区、多副本基于Zookeeper协调分布式消息系统。目前已定位为一个分布式流式处理平台。一个典型的Kafka体系结构包括若干Producer、若干broker、若干Consumer,以及一个Zookeeper集群。如图下图: 

        其中,Zookeeper是Kafka用来负责集群元数据管理、控制器的选举等操作的。Producer将消息发送到broker,broker负责将收到的消息存储到磁盘中,然后Consumer负责从broker订阅并消费消息(Consumer是使用拉(Pull模式)从服务端拉取消息)。

>>>> 术语与概念

Producer:生产者,负责创建消息,然后将消息发送到Kafka中

Consumer:消费者,消费者连接到Kafka上并采用Pull模式订阅消息,进而进行相应的业务处理。

broker:一个独立的Kafka服务节点或Kafka服务实例

Topic与Partition

        主题是一个逻辑上的概念,它可以细分为多个分区,一个分区只属于单个主题。分区可以分布在不同的broker上,即一个主题可以横跨多个broker。每条消息被发送到broker之前,会根据分区规则选择存储到哪个具体到分区。如果分区规则设定的合理,所有的消息可以均匀地分配到不同的分区中(即不同的broker上)。这样,就不会因为单台机器I/O造成这个主题的性能瓶颈。通过增加分区的数量可以实现水平扩展,以此来提供比单个broker更强大的性能。

        同一主题下的不同分区包含的消息是不同的。分区在存储层面可以看作是一个可追加的日志(Log)文件,消息在被追加到分区日志文件到时候都会分配一个特定的偏移量(offset)offset是消息在分区中的唯一标识,Kafka通过它来保证消息在分区内的有序性,但offset并不夸分区,所以Kafka保证的是分区有序而非主题有序

        Kafka为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。副本之间是“一主多从”的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步,同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全相同)副本处于不同的broker中,当leader副本出现故障时,从follower副本中选举新的leader副本对外提供服务。通过多副本机制实现了故障的自动转移

IR、ISR、OSR

        分区中的所有副本统称为AR(Assigned Replicas)。所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成ISR(In-Sync Replicas)。消息会先发送到leader副本,之后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本而言会有一定程度的滞后。与leader副本同步滞后过多的副本(不包括leader副本)组成OSR(Out-of-Sync Replicas),由此可见,AR=ISR+OSR。ISR与OSR都是AR的一个子集。

        一定程度的滞后是指可忍受的滞后范围,这个范围可以通过参数进行设置。正常情况下,所有的follower副本都应该与leader副本保持一定程度的同步,即AR=ISR,OSR为空集。

        leader副本负责维护和跟踪ISR集合中所有follower副本的滞后状态,当follower副本落后太多或失效时,leader副本会把它从ISR集合中剔除。如果OSR集合中有follower副本“追上”的leader副本,那么leader副本会把它从OSR集合转移至ISR集合。默认情况下,当leader副本发生故障时,只有在ISR集合中的副本才有资格被选举为新的leader(不过这个原则可以通过修改相应的参数配置来改变)。

HW与LEO

HW(High Watermark),俗称高水位。它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个offset之前的消息

LEO(Log End Offset),它标识当前日志文件中下一条待写入消息的offset

        分区IRS集合中的每个副本都会维护自身的LEO,而IRS集合中最小的LEO即为分区的HW,对消费者而言只能消费HW之前的消息。

        同步复制要求所有能工作的follower副本都复制完,这条消息才会被确认为已经提交成功,这种复制方式极大地影响了性能。异步复制下,数据只要被leader副本写入就被认为已经提交成功,这种情况下,如果follower副本都还没有复制完而落后于leader副本,突然leader副本宕机,则会造成数据丢失。Kafka的复制机制既不是完全同步,也不是单纯的异步复制,使用这种ISR的方式则有效地权衡了数据可靠性与性能之间的关系。

>>>>服务端参数配置

1.zookeeper.connect

      该参数指明broker要链接的zookeeper集群的服务地址(包含端口号),没有默认值,且此参数为必填项。类似可以配置为localhost:2181,如果Zookeeper集群中有多个节点,则可以用逗号将每个节点隔开,类似于localhost1:2181,localhost2:2181,localhost3:2181这种格式。

2.broker.id

      该参数用来指定Kafka集群中broker的唯一标识,默认值为-1。如果没有设置,那么Kafka会自动生成一个。

3.log.dir和log.dirs

     Kafka将所有的消息都保存在磁盘上,而这两个参数用来配置Kafka日志文件存放的根目录。一般情况下,log.dir用来配置单个目录,而log.dirs用来配置多个根目录(以逗号分隔),但是Kafka并没有对此做强制性限制,即log.dir和log.dirs都可以用来配置单个或多个根目录。log.dirs的优先级比log.dir高,但如果没有配置log.dirs,则会以log.dir配置为准。默认情况下只配置了log.dir参数,其默认值为/tmp/kafka-logs

4.message.max.bytes

     该参数用来指定broker所能接收消息的最大值,默认值为1000012(B),约等于976.6KB。如果Producer发送的消息大于这个参数所设置的值,那么(Producer)就会报出RecordTooLargeException的异常。如果需要修改这个参数,还需要考虑max.request.size(客户端)、max.message.bytes(Topic端参数)等参数的影响。为了避免修改此参数而引起级联的影响,建议在修改此参数之前考虑分拆消息的可行性。

                                               

如果文章对你有帮助的话

关注转发一下

                                                                              

                                                                                   长按二维码,扫扫关注哦

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.入门 1.1简介 1.2用例 1.3快速入门 1.4生态系统 1.5升级 2. API 2.1生产者API 2.2消费者API 2.3 Streams API 2.4连接API 2.5 AdminClient API 2.6旧版API 3.配置 3.1经纪人配置 3.2主题配置 3.3制片人配置 3.4消费者配置 3.4.1新的消费者配置 3.4.2旧消费者配置 3.5 Kafka Connect配置 3.6 Kafka Streams配置 3.7 AdminClient配置 4.设计 4.1动机 4.2持久性 4.3效率 4.4制片人 4.5消费者 4.6消息传递语义 4.7复制 4。4日志压缩 4.9配额 5.实施 5.1网络层 5.2消息 5.3消息格式 5。4日志 5.5分配 6.运营 6.1基本卡夫卡业务 添加和删​​除主题 修改主题 优雅的关机 平衡领导力 检查消费者的位置 在群集之间镜像数据 扩展您的群集 退役经纪人 增加复制因子 6.2数据中心 6.3重要配置 重要客户端配置 生产服务器配置 6.4 Java版本 6.5硬件和操作系统 OS 磁盘和文件系统 应用程序与OS Flush Management Linux Flush Behavior Ext4笔记 6.6监测 6.7 ZooKeeper 稳定的版本 操作化 7.安全 7.1安全概述 7.2使用SSL进行加密和身份验证 7.3使用SASL进行身份验证 7.4授权和ACL 7.5在正在运行的群集中加入安全功能 7.6 ZooKeeper认证 新集群 迁移群集 迁移ZooKeeper Ensemble 8. KAFKA CONNECT 8.1概述 8.2用户指南 运行Kafka Connect 配置连接器 转换 REST API 8.3连接器开发指南 9. KAFKA STREAMS 9.1使用Streams应用程序 9.2编写自己的Streams应用程序 9.3开发者手册 9.4核心概念 9.5架构 9.6升级指南

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值