这是我参与[第五届青训营]伴学笔记的第13天。
1.1问题引出
- 系统崩溃
- 服务能力有限
- 链路耗时长尾
- 日志如何处理
2.1使用场景
- 搜索服务
- 直播服务
- 订单服务
- 支付服务
2.2如何使用Kafka
新增集群->新增Topic->编写生产者逻辑->编写消费者逻辑
2.3基本概念
- Topic︰逻辑队列,不同Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
- Offset :消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增。
- 每个分片有多个Replica,Leader Replica将会从ISR中选出。
2.4数据复制
2.5Kafka架构
2.6一条消息的自述
producer生产到broker,然后消费consume。
2.7producer
批量发送:批量发送可以减少IO次数,从而加强发送能力 数据压缩:通过压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法
2.8数据的存储
Broker消息文件结构
路径:/Topic/Partition/Segment/(log|index|timeindex l ...)
Broker磁盘结构
移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本。
Broker顺序写
采用顺序写的方式进行写入,以提高写入效率
Broker如何找到消息
Consumer通过发送FetchRequest请求消息数据,Broker 会将指定Offset处的消息,按照时间窗口和消息
Broker偏移量索引文件
二分找到小于目标offset的最大索引位置
Broker时间戳索引文件
二分找到小于目标时间戳最大的索引位置,在通过寻找 offset的方式找到最终数据。
Broker传统数据拷贝
Broker零拷贝
2.9consumer消息的接收端
low level
通过手动进行分配,哪一个 Consumer消费哪一个Partition完全由业务来决定。
缺点:
- 当consumer故障,partition数据流会断开,无法容灾。
- 可能发生机器或进程的启停,会导致数据中断。
high level
协调者来帮助各个conwumer进行自动分配partition,该过程也叫做rebalance。
可以帮助Kafka提高吞吐或者稳定性的功能的方法:
- Producer:批量发送、数据压缩
- Broker:顺序写,消息索引,零拷贝
- Consumer: Rebalance
2.10Kafaka数据复制问题
- 重启操作
关闭leader,选定follower为新leader重启后,原leader追赶新leader写数据,该过程可能导致数据差异。数据同步完成后。需要leader回切,时间成本高。
- 替换、扩容、缩容
节点的变动都会带来时间成本、运维成本以及人工成本。
- 负载不均衡
问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
03.消息队列-BMQ
BMQ简介
兼容Kafka协议,存算分离,云原生消息队列
3.2运维操作对比
3.3HDFS写文件流程
随机选择一定数量的Database进行写入
3.4BMQ文件结构
全部segment都不全部分布在同个节点,随机在集群中分配。
3.5broker
partation状态机
保证对于任意分片在同一时刻只能在一个broker上存活
写文件流程
消息先进行CRC校验。检查参数是否合法,检验完后,将数据存入buffer,通过异步writer thread将数据拉出来做最终写入,写入完成后,写入底层的roil new segment file。还能配置返回策略。
写文件 failover
如果 DataNode节点挂了或者是其他原因导致我们写文件失败,应该如何处理? 不能等待节点,而是寻找可用节点将其替换。
3.6 proxy
3.7多机房部署
3.8 BMQ-高级特性
3.9泳道消息
BOE: Bytedance Offline Environment,是一套完全独立的线下机房环境 PPE: Product Preview Environment,即产品预览环境
小结
- BMQ的架构模型(解决Kafka存在的问题)
- BMQ读写流程(Failover机制,写入状态机)
- BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)