实施:
step1: 生产者生产每一条数据,将数据放在一个batch 批次中,如果batch 满了或者达到一定的时间,提交写入请求;
step2: 生产者根据分区规则构建数据分区,从Zookeeper中获取对应的元数据,将请求提交给leader副本所在的Broker
问题1: 生产者可以计算出数据要写入哪个分区,但是我怎么知道这个分区的leader副本在哪台机器?
(1)Kafka中所有Topic、Partition、Replication信息都存储在Zookeeper的元数据中;
(2)先从Zookeeper中获取这个Topic的这个分区所对应的Leader副本所在的节点的Brokerid。
问题2:生产者连接zookeeper读取元数据,元数据长什么样呢?
(1)辅助选举主节点:Controller
在 Kafka 当中,通过选举,这个临时节点谁创建成功了,谁即为主节点;其他的 Broker 都要监听这个临时节点。如果主节点故障,这个临时节点就会自动被删除,所对应的监听机制就会触发,所有的Broker 都会收到这个监听,再去Zookeeper中创建新的临时节点,谁创建成功,谁就是我们的新的主节点。
(2)存储元数据:生产者获取这个 Topic 的元数据以后会将该Topic 的元数据缓存在本地。定时刷新元数据。
step3: 先写入这台Broker的 PageCache【操作系统级别内存】中,Kafka 也用了内存机制来实现数据的快速访问。
· Kafka 使用 OS 级别的内存,只有操作系统故障,重启机器,内存数据才会清空
· 只考虑机器故障重启才会出现内存数据丢失:通过构建副本 来解决。
step4: 操作系统的后台自动将页缓存的数据SYNC(以追加的形式 顺序写磁盘)同步到磁盘文件中:最新的Segment的.log中【相当于在内存中构建了磁盘文件的映射(mmap),数据写到内存中,即写到对应的磁盘文件中,只是内存与磁盘的同步工作由操作系统来完成。】
· 条件:占用操作内存达到10%或者数据写入超过30s
· 顺序写磁盘:速度可以媲美写内存
step5 :其他的 Follower到Leader 中同步数据,Follower 同步完成会返回ACK给Leader
小结:Kafka数据的写入过程:(1)先写PageCache内存区域;(2)顺序写磁盘【以追加方式写入文件】
网友评论