kafka开篇
一、Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
二、消息队列的流派
1.什么是 MQ
Message Queue (MQ),消息队列中间件。很多人都说:MQ通过将消息的发送和接收分离来实现应用程序的异步和解耦,这个给人的直觉是MQ 是异步的,用来解耦的,但是这个只是 MQ 的效果而不是目的。MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。一个分布式系统中两个模块之间通讯要么是 HTTP,要么是自己开发的 (rpc) TCP,但是这两种协议其实都是原始的协议。HTTP 协议很难实现两端通讯,TCP 就更加原始了,粘包、心跳、私有的协议,想一想头皮就发麻。MQ 所要做的就是在这些协议之上构建一个简单的“协议”——生产者/消费者模型。
MQ 带给我的“协议"不是具体的通讯协议,而是更高层次通讯模型。它定义了两个对象。——发送数据的叫生产者:接收数据的叫消费者,提供一个SDK 让我们可以定义自己的生产者和消贵者实现消息通讯而无视底层通讯协议。
2.常用消息队列
- rabbitMQ
- roketMQ
- kafka
- zeroMQ
三、为什么使用消息队列
1.目的:解耦、异步、削峰
2.说明:解耦:为了减少业务层面的逻辑耦合性,缺点增加了系统的复杂性和节点指点的风险值。异步:相对于同步导致的时间等待,异步更加有效的缓解阻塞的问题。削峰:当数据量比较大的时候,计算量有限的情况下,如果硬塞给处理的应用,很有可能导致内存溢出等问题,那么通过queue现有的处理能力来来取数据,即保证了执行的效率,也保证了数据不丢失。
四、为什么选择kafka
1.分布式
2.数据以磁盘方式存在,O(1)的查询时间
3.高吞吐
4.支持分区消息
五、基本概念
1.主题(topic)
可以看着一类数据的集合的名称
2.分区(partition)
将一个topic的消息分区来存储:
- 分区存储可以解决文件过大问题。
- 提供更高的吞吐量
3.副本(replicas)就是分区备份的意思
- 副本会有一个leader,多个follower。
- kafka的读写都发生在leader上,然后把数据同步到follower。如果leader挂了,会从follower中选举leader。
- ISR:一个集合同步和已同步的集合。如果节点性能较差,会被ISR剔除集合。
4.偏移量
- offset可以理解为已经被消费的下标。
- 消息消费出现异常的时候,记录消费的下标值,当服务正常消费的时候,可以通过这个位置在进行消费,这种方式可以理解为偏移量。
- 偏移量属于,消费者概念。在消费者眼中,可以自由的设置消费位置,以及消费的顺序。
5.顺序消费
- 如果只有一个分区,默认就是顺序消费的。
- 如果多个分区的时候,可以指定分区进行生产和消费,当然,也会损失性能。
六、机制
1.controller: 每个broker启动的时候都会在zookeeper创建一个临时节点,最小标号的为这个集群的controller。
- 在集群中如果一个副本的leader挂了,会从副本中选择leader,遵从最左原则。
- 新增或者减少broker的时候,controller会同步给其他broker。
- 分区增加或者较少也会同步给其他broker
2.rebalance机制
- 前提:消费者没有指明消费分区。
- 触发条件:当消费者或者分区数量发生变化时。
- 机制:重新调整消费者消费那个分区
- 消费分区策略:range(计算),轮询,sticky(在原来不变的基础上进行修改)
3.LEO
- 表示下一个写入的位置。
4.HW
- HW被称为高水位,HighWatermark的缩写。在partition中取一个LEO(log-end-offset)作为HW,那么消费者就之多智能消费到HW的位置。
- 每个replica都存在HW,leader和follower各执维护自己的HW。对于leader新写入的数据要等ISR中的replicas同步更新到HW后,在被消费者消费。这个为了保证leader所在的broker挂了,replicas重新选举leader,也可以被消费。
七、详细篇
3.kafk优化-3