前言:
十年生死两茫茫,千行代码,Bug何处藏。 纵使产品经理祭苍天,又怎样? 朝令改,夕断肠。 相顾无言,惟有泪千行。 每晚灯火阑珊处,夜难寐,加班狂

KafKa
Kafka是一个分布式消息队列:生产者、消费者的功能,提供了类似于JMS的特性,作用是日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer
Kafka对消息保存是根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer
kafka集群有多个kafka实例(节点/broker)组成,每个实例(kafka节点)称为broker。 Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer 
Kafka的高效读写的原因
1.顺序写入磁盘
Kafka的producer生产数据,要写到log文件中,写的过程是一直追加到文件的末尾,顺序写入磁盘的速度600M/s,这个和硬盘是机械还是固态有一些关联,随机写入默认100K/s , 根据是否需要进行磁盘寻址
2.零复制技术
Linux中提供的一种文件处理技术,Linux总会将系统中还没有使用到的内存挪给 Page cache 当写操作发生的时候, 他会将写入page Cache中,并在该写入位置加入dirty标志,当读操作发生的时候,它会首先查找Page cache中是否存在,如果存下就直接返回,如果没有就从磁盘中读取再写入到Page Cache中
Zookeeper在kafka中的作用
0.8版本以后的Zookeeper就不在维护偏移量offset,Zookeeper在后续的Kafka中起到的是一个选举作用
Kafka集群中有一个broker被选举为Controller,负责管理集群中broker的上下线,所有topic的分区和副本分配和leader的选举工作Controller的管理工作都是依赖于Zookeeper的  
Kafka如何保证数据一致性

数据可靠性保证(ack机制)
为了保证producer发送数据,能够可靠的发送到指定topic,topic的每个partition收到producer发送数据就会向producer发送"ack"(acknowledgement 确认收到) 如果producer收到ack,就会进行下一轮的发送,否则就重新发送数据。
为了保证Topic的partition可以正常提供服务,会提供副本机制,所以会有多个partition存在
例如:一个topic存在三个partition,topic中有一个leader两个follower当leader接收到Producer发送的消息后,是等待所有follower全部完成后再发送ack还是只要有过半机制就发送ack
Kafka选择了全部完成方案,原因如下:
Kafka的每个分区都有大量的数据,过半机制的副本保存会造成大量数据冗余
全部完成方案的网络延迟会比较高,但网络延迟对Kafka的影响较小
(针对所有follower都开始同步数据,有一个follower,迟迟不能与leader进行同步的情况。采用ISR(一个存储着follower集合),如果follower长时间未向leader同步数据则该follower将被踢出ISR,如果是Leader发生故障,会从ISR中选举新的leader。)
ack应答机制作用是确认收到消息(发送ack的两种情况):
- prodeucer发送消息到leader,leader收到后发送ack
- leader 和 follower 之间同步完成会发送ack
ACK应答机制
所以Kafka为了用户提供了三种可靠级别设置,可以根据不同雪球来修改选择acks参数配置:参数是0 ,1 和 -1

幂等机制
幂等简单来说1的几次幂都等于1,也就是说一天消息无论发送几次都只算一次,无论多少条消息,我们只实例化一次
Kafka完成幂等性其实就是给消息添加一个唯一ID,这个ID组成PID(ProducerID),这样就可以保证每一个Producer发送的时候都是唯一,还会为Producer中每条消息添加一个消息ID,当消息发送到kafka后会暂时缓存ID,写入数据后没有收到ACK会重新发送,消息收到后会与缓存中ID进行比较,如果已存在,不再接收 
offset的维护
Kafka0.9版本之前,consumer默认将offet保存在Zookeeper,从0.9版本开始后,consumer默认将offset保存在kafka这一个内置的topic中,该topic为 __consumer_offsets
手动维护(可以维护到redis中),自动维护(将偏移量维护到kafka记录偏移量的topic中)
确定kafka机器的数量(2n+1)
Kafka机器数量=2*(峰值生产速度20M*副本数/100)+1
kafka分区有多少个3-10个分区(分区影响消费的并发度,分区个数不建议超过集群的个数)
kafka副本数2(影响磁盘io)
Kafka中topic数量
(一般情况下一张表对应一个topic,也可以相同主题的表进行轻度聚合放在一个topic中 例如: 将商品列表,商品详情,商品点击放到一个topic中。 将广告放在一个tpoic中。 通知、前台活跃、后台活跃放到一个topic中。 评论、点击、收藏、点赞放到一个topic中。 故障日志放一个topic中)
Kafka 中数据量计算
每天总数据量150g-250g,每天产生1.5-2.5亿条日志, 平均每秒钟: 15000-25000万/24/60/60=1 500-2500条/每秒钟。 低谷每秒钟: 800 条。 高峰每秒钟: 1150 条* (2-20倍) -3300 条-23000条。 每条日志大小: 0.5k-2k 每秒多少数据量: 2.3M-20MB 。 
Kafka如何进行分区的

Consumer消费数据的方式
- round-robin(轮询)将每一个分区一次发送给一个消费者组
- range(范围)按首先对同一个topic里面分区序号进行排序,并对消费者按照字母进行排序,照一定的范围进划分,尽量将每个消费中分区数据保存一致
常用命令示例
查看topic列表: bin/kafka-topics.sh --zookeeper localhost:2181 –list 查看指定topic明细: bin/kafka-topics.sh --zookeeper localhost:2181 --desc --topic demo
常用的kafka工具:kafkaTools
有收获?希望烙铁们来个三连击,让更多的同学看到这篇文章
1、烙铁们,关注我看完保证有所收获,不信你打我。
2、点个赞呗,可以让更多的人看到这篇文章,后续还会有很哇塞的产出。
本文章仅供学习及个人复习使用,如需转载请标明转载出处,如有错漏欢迎指出 务必注明来源(注明: 来源:csdn , 作者:-马什么梅-) 
|