kafka入门学习笔记
1.kafka是一个分布式消息系统,是由scala编写,具有生产者和消费者的功能,生产者将消息推送到Kafka集群,消费者从kafka集群上拉取消息
2.kafka的特性:
a.消息持久化:kafka基于文件系统来存储和缓存消息
b.高吞吐量 :kafka支持数据压缩及批量发送,同时kafka将每个主题划分为多个分区,这种实现方法使得Kafka具有很高的吞吐量。
c.高扩展性: kakfa依赖zookeeper来对集群进行协调管理,这样使得kafka更加容易进行水平扩展,生产者,消费者和代理都委分布式,可配置多个。同时在机器上扩展格式无需将整个集群停机,集群能够自动感知,重新进行负载均衡及数据复制
d.多客户端支持:kafka核心模块用scala语言开发,kafka提供了多种开发语言的接入。
e.安全机制
f.数据备份:kafka可以为每个主题指定副本数,对数据进行持久化备份,这样可以一定程度上防止数据丢失,提高可用性
g.消息压缩:kafka支持Gzip,Snappy,LZ4这三种压缩方式,通常把多条消息放在一起组成MessageSet,然后再把MessageSet放到一条消息里面去,从而提高压缩比率进而提高吞吐量。
3.Kafka的应用场景:
a.消息系统:kafka作为一款优秀的消息系统,具有高吞吐量,内置的分区,备份冗余分布式等特点,为大规模消息处理提供了一种很好的解决方案
b.应用监控:利用Kafka采集应用程序和服务器健康相关的指标,如cpu占用率,io,内存,连接数,tps,qps等,然后将指标信息进行处理,从而构建一个具有监控仪表盘,曲线图等可视化监控系统。
c.网站用户行为追踪:为了更好地了解用户行为,操作习惯,改善用户体验,进而对产品经行升级改进,将用户操作轨迹,内容消息发送到kafka集群上,通过hadoop,spark,或storm等进行数据分析处理,生成相应的统计报告,为推荐系统推荐对象建模提供数据源,进而为每个用户经行个性化推荐
d.流处理:kafka提供了kafka streams支持对流数据的处理
e.持久性日志:kafka可以为外部系统提供一种持久性日志分布式系统,日志可以在多个节点间进行备份,kafka为故障节点数据恢复提供了一种重新同步的机制。同时,kafka很方便与hdfs和flume进行整合,这样就方便讲kafka采集的数据持久化到其他外部系统。
4.kafka的同步和异步发送(默认采用的是异步方式)
a.异步方式:两个send方法都返回一个Future对象,即只负责将消息发送到消息缓冲区,并不等待Sender线程处理结果,若希望了解异步方式消息发送成功与否,可以在回调函数中进行相应处理,当消息被Sender线程处理后会回调Callback
b.同步方式:通过调用Send方法返回的Future对象的get方法以阻塞式获取执行结果,及等待Sender线程处理的最终结果
5.分区和消费者的关系
a.同一个partition的数据可以被不同的消费组获取
b.同一个组内的消费者不能同时消费同一个partition
c.同一个组内的消费者可以消费不同的partition,也就是说,同一个组内的消费者数要小于等于partition的数量,不然的话就一定会有消费者是空闲的
创建topic时,可以指定分区,将一个topic的数据分散存储到多个broker,实现分区存储,从而解决一个机器存储不下的问题,也就是实现了存储的横向扩展
6.副本
创建topic时,如果设置副本,那么kafka将在其他分区中保存该分区的数据,可以确保数据的可靠性,在多个副本中,kafka会选取一个作为Leader提供服务,其他的作为follower节点存在。
7.副本之间同步数据会发生数据丢失的情况吗?
场景:消息的生产者将消失发送到leader,然后follower会进行同步消息,但是在消息还没有同步完成是,leader宕机了,那么消息会丢失吗?
其实, Kafka为生产者提供3种消息确认机制(acks),分别是,0,-1,1,默认为:1。
( 1) 当 acks=0时,生产者不用等待代理返回确认信息,而连续发送消息。显然这种 方式加快了消息投递的速度,然而无法保证消息是否己被代理接受 ,有可能存在丢失数据 的风险。
(2)当 acsk=1时,生产者需要等待 Leader 副本己成功将消息写入日志文件中。这种方式 在一定程度上降低了数据丢失的可能性,但仍无法保证数据一定不会丢失。如果在 Leader副本 成功存储数据后, Follower 副本还没有来得及进行同步,而此时 Leader 着机了,那么此时虽 然数据己进行了存储,由于原来的 Leader 己不可用而会从集群中下线,同时存活的代理又再也不会有从原来的 Leader副本存储的数据,此时数据就会丢失。
(3)当 acks=-1 时, Leader副本和所有 ISR列表中的副本都完成数据存储时才会向生产者 发送确认信息,这种策略保证只要 Leader 副本和 Follower 副本中至少有一个节点存活,数据就 不会丢失。为了保证数据不丢失,需要保证同步的副本至少大于1,通过参数 min.insync.replicas 设置,当同步副本数不足此配置值时,生产者会抛出异常,但这种方式同时也影响了生产者发 送消息的速度以及吞吐量。