作用(用于消息中间件)
1.可以作为缓冲(流量消减)--防止高并发
2.分布式
3.解耦合
分片机制
简要介绍:
1.Kafka可以将主题划分为多个分区(Partition)
2.主要解决了单台服务器存储容量有限的问题
3.将消息均匀的分布到不同的分区中,这样实现了负载均衡.(提高读写效率)
生产者和消费者对分区的操作:
1.生产者和消费者可以多线程地并行操作,每一个线程处理的是一个分区的数据,所以分区实际上是调优Kafka并行度的最小单元.
2.生产者可以多线程同时向不同分区发送消息
3.消费者:同一个消费组内,一个分区可以被一个组中某一个成员消费,如果消费组中有多于分区数量的消费者,那么一定会有消费者无法消费数据。
4.一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。但每个分区都有自己的资源占用开销,分区多了,副本也多了,资源占用同样也多了.
注意:kafka中的topic在消费时,整体上是无序的,而每个分区的内部消费是有顺序的,如果想要全局有序,可以设置一个分区,但是这样的话丢失了很多的性能。
如何合理的设置分区数:
一个topic分区的个数不是随意来来设置的,需要有些衡量的指标,可以使用如下方法进行测试:
(1)、创建只有一个分区数的topic
(2)、然后测试这个topic的producer和consumer吞吐量
(3)、假设它们的值分别为Tp和Tc,单位可以是MB/s
(4)、然后假设总的目标吞吐量是Tt,那么分区数= Tt / max(Tp, Tc)
注意:
Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。Tp=10m/s
Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大,因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。Tc=5m/s总的目标吞吐量是Tt,可以理解为说业务数据每秒实际产生的数据量100M
副本机制:
副本备份机制解决了数据存储的高可用问题
容错原则例子:
假设有三个分片, 三个副本, 共计9个节点
在三台服务器上 各放置一个分片的副本
第二个副本放置在和这台服务器同机架上
第三个副本放置在不同的机架的服务器上
消息不丢失机制:
生产者端消息不丢失:
1) 消息生产分为同步模式和异步模式
2) 消息确认分为三个状态
a) 参数0:生产者只负责发送数据
b) 参数1:某个partition的leader收到数据给出响应
c) 参数-1:某个partition的所有副本都收到数据后给出响应
3) 在同步模式下
a) 生产者等待10S,如果broker没有给出ack响应,就认为失败。
b) 生产者重试3次,如果还没有响应,就报错。
4) 在异步模式下
a) 先将数据保存在生产者端的buffer中。Buffer大小是2万条。
b) 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
c) 发送一批数据的大小是500条。
注意:异步模式下,如果broker迟迟不给ack,而buffer又满了。开发者可以设置是否直接清空buffer中的数据。
broker端消息不丢失:
1.broker端的消息不丢失,其实就是用partition副本机制来保证。
2.Producer ack -1(all). 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影响数据的完整性。
消费端消息不丢失:
通过offset commit 来保证数据的不丢失,kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费。
生产者数据分发策略:
1.用户指定partition
2. 当用户指定key,使用hash算法。如果key一直不变,同一个key算出来的hash值是个固定值。如果是固定值,这种hash取模就没有意义。
3.当用户既没有指定partition也没有key,使用轮询的方式发送数据。
消息的发布方式:
点对点的发布方式:只要保证所有接收这个topic的消费者都在同一组中
发布订阅方式:只要保证所有接收这个topic的消费者不属于同一组
面对数据量大,消费者消费慢的解决思路:
1.将同组中的消费者数量提高到这个topic分片的数量
2.若消费能力不足,可以将topic的分片数量扩大
3.通过硬件提高消防者处理能力