文章目录
我的疑问:
为什么要对主题进行分区 ?
为什么要对主题进行分区 ?如果消息没有分区,所有的消息就只能存储到一个节,或上 。 这样无限地追加消息会导致一个节点的文件非常大,这就需要解决文件切分的问题 。 与 其在一个节点上按照一定大小切分文件,还不如在源头控制消息写往不同的节点,从而 分散每个节点的压力 。 使用分区的优势是,生产者可以将一批消息同时写入不同的节点, 而没有分区的写操作只能串行 。 读操作与之类似,多个消费者可以同时读耳又不同节点的 不同分区,从而加快消息消费进度 。
Kfaka的备副本为什么不提供读取功能?
如何选主的?
生产者设置的应答值等于 -1 ,服务端必须等待 ISR 所有副本都同步完消息,才会发送生产结果给 生产者。 消费者或备份副本设置的最小拉取大小等于l字节,服务端必须至少读取到l字节的消息,才 会发送拉取结果给消费者或备份副本。
Kafka是一个分布式的( distributed )、分区的( partitioned )、复制的( r巳plicated )提交日志( commit log )服务 。 “分布式”是所有分布式系统的特性 ;“分区”指消息会按照分区分布在集群的所有节点上 ; “复制”指每个分区都会有多个剧本存储在不同的节点上;“提交日志”指新的消息总是以追加的方式 进行存储 。
数据的更新操作在分布式存储系统中很常见,比如不同时间产生相同键( key )的数据 。 分布式存储系统为了保证写数据的性能,采用追加方式,而不是直接修改已有记录。 为了只保存最近的一条 数据,会有一个后台的压缩( compaction )操作
,负责将相同键的多条记录合并为一条 。 Kafka的消 息如果指定了键,也会有类似的日志压缩操作,保证相同键的消息只会保留最近的一条。
如果Kafka的消息没有指定键,那么消息的写入顺序和读取顺序一致,就不会有压 缩操作
日志的读写
分区、副本、日志、日志分段
为了理解 Kafka分区的概念,以HDFS分布式文件系统为例进行对比 。 如表 6-1所示, HDFS的文件 以数据块的形式存储在多个数据节点上,名称节点保存了文件和数据块的对应关系 。 Kafka的 主题以分区的形式存储在多个代理节点上,ZK记录了主题和分区的对应关系 。
如图6-1 (左)所示,分区从逻辑上分成一个主副本(图中灰色背最)和多个备份副本。 每个分区 都有唯一的分区编号,比如,分区l用Pl表示,分区5用P5表示。 如图6-1 (有)所示,分区从物理上 来看,所有的副本分布在不同的消息代理节点上 。 每个副本的编号表示所在的消息代理节点编号 。 比 如, Pl的第一个副本编号是2,表示这个备份副本在编号为2的消息代理节点上。
- 分区、副本的逻辑和物理表示
写入日志
延迟操作
Kafka在处理这种类型的请求时,会将“延迟返回响应结果的请求” 即 “延迟操作”对象 (DelayedOpe「ati.on)放入“延迟缓存队列”(DelayedOpeati.onPu「gato「y)。 延迟的操作对象有两种方 式可以从“延迟缓存队列”中完成,井从缓存 队列中移除 。
- 延迟操作对应的外部事件发生时,外部事件会尝试完成延迟缓存中的延迟操作。
- 如果外部事件仍然没有完成延迟操作,超时时间达到后,会强制完成延迟的操作。
控制器
Kafka的控制器( KafkaContoller)会将主题的不同分区分布在不同的代理节点上 。 另外,每个分区 有多个副本, Kafka的控制器还负责为分区选择出一个主副本,其他副本都是备份副本。 分区的不同 副本也会分布在不同的代理节点上。 Kafka的控制器除了分区的分配、分区的选举
,还有下面这些工作。
- 代理节点启动或下线时,处理代理节点的故障转移。
- 新创建或删除主题,或新增加分区时,处理分区的重新分配。
- 管理所有分区的状态机和副本的状态机 , 处理状态机的变化事件 。
因此我们在这里来看下分区的选主是如何的?
控制器选举
Kafka实现 领导选举的做法是: 每个代理节点都会作为ZK的客户端,向ZK服务端尝试创建/controller 临时节点, 但最终只有一个代理节点可以成功创建/controller节点。 由于主控制器创建的ZK节点是临时节点, 因此当主控制器出现故障,或者会话失效时,临时节点会被删除。 这时候所有的代理节点都会尝试重 新创建 /controller 节点,并选举出新的主控制器 。 如图 7-1所示,有三个消息代理节点,它们都会尝试创建/controller 节点,但只有第三个代理节点创建成功 ,那么第三个代理节点就是Kafka集群的主控制器 。
每条消息的内容:CRC校验值、 Magic值、属性值、键的长度、键的内容、值的长度、值的内容,时间戳。