kafka学习(二)
kafka学习(二)
内部工作原理 && 可靠数据传递
内部工作原理
控制器:一个集群中只能有一个,负责分区leader的选举
复制
首领副本
跟随者副本:首领以外的副本
同步的副本:持续请求到的最新消息副本
每一个分区有一个首选首领
处理请求
broker在其所监听的端口上运行Acceptor
线程,这个线程会创建一个连接,并将它交给Processor
线程处理,Processor
线程负责从client获取请求消息并放进请求队列交由IO线程
处理,然后从响应队列中获取响应消息。
生产请求:生产者发送的请求,客户端要写入broker的消息
获取请求:从broker中读取消息时发送的请求
元数据请求
都需要发送给分区的首领副本,因为首领副本拥有这个分区完整且最新的信息,如果发到一个不包含改首领副本的broker上,会报错
一般客户端只能读取被写入到所有同步副本的消息,防止首领崩溃后,这些消息消失。
数据存储
对broker的分区分配,一个原则是每个分区的副本分配在不同的broker上,或者指定机架信息,则副本应该处于不同的机架的broker上
kafka将分区分成了若干个片段,并且为了帮助broker快速定位偏移量,为分区维护了一个索引,索引将偏移量映射到片段文件和偏移量在文件里的位置。
清理:
日志片段分为:- 干净部分(旧的数据)
- 污浊部分,清理线程读取该部分,并创建map(可以节省空间的来清理)
从最旧的消息与map进行比对,如果旧消息的键map中没有,说明它就是最新的,就把其复制到替换片段,如果有,则说明会被后面的包含了,略过。之后将整个替换片段替代原始片段就完成了清理工作。
可靠数据传递
1. 生产数据
滞后的同步副本会导致生产者和消费者变慢,因为前面提到过消息被认为已提交的前提是被所有同步副本接收。非同步副本对这个性能不会产生影响,但如果非同步副本的数量越多,意味着复制系数越小,宕机的风险越大。
主题的复制系数:即每个分区总共会被n个不同的broker复制n次(每个broker复制一次)
不完全首领选举:
unclean.leader.election :true
意味着允许不同步的副本成为leader,否则就需要等旧首领重新上线
min.insync.replicas
设置最少同步副本
对于生产者要处理的错误分为可自动处理和开发者手动处理。前者根据broker返回的错误信息判断是否可通过重试解决,带来的问题是消息重复,解决方法是消息里加上唯一ID或者消息是幂等的。
2. 读取数据
可靠性配置
偏移量提交
3. 验证
配置验证
VerifiableProducer/VerifiableConsumer
应用程序验证
生产环境监控可靠性
构建数据管道
数据格式 -> 可插拨组件开发
管道构建:ETL/ELT
Kafka Connect:以work进程集群方式运行,为在kafka和外部数据存储系统之间移动数据提供可靠可伸缩的方式。