一、kafka基础内容
先了解下基础的概念 主题(Topic) 主题是承载消息的容器,我们发布与订阅的对象就是主题,在实际的应用中通常会按照业务去划分不同的主题。
分区(Partition) 每个主题可以有多个分区,分区数量可以在创建主题时定义。 消息位移(Offset)表示每个分区中每条消息的位置信息,是一个单调递增且不变的值。
副本(Replica) 顾名思义是同一条消息的备份数据存放的地方。kafka的副本分为领导者副本和追随者副本。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
生产者(Producer) 向主题发布新消息的应用。
消费者(Consumer) 从主题订阅新消息的应用。
集群节点(Broker) 一个kafka集群由一个或者多个broker组成,集群的基本组成单位
消费者组(Consumer Group) 多个消费者实例共同组成的一个组,每个组中的实例只能消费一次消息。
重平衡(Rebalance) 消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
说完了基础的概念,那么kafka是怎么通过以上的模块进行运作的呢? 首先,kafka的发布与订阅都是针对于topic来说的,不同的应用程序,producer创建的数据与cunsumer的消费数据都是通过topic来进行生产与消费。 kafka会将topic分成多个partition,存放于不同的broker的目录中,这其中的目的有很多,比如说为了水平扩展提升性能,为了数据的不丢失等。producer产生的每个消息都会通过不同的负载均衡策略发送到不同的partition中去。 对于partition来说,他是需要设置不同的副本的,每个partition必须要有一个领导者副本和多个追随者副本。领导者副本是对外提供数据,追随者副本仅仅用于做数据备份。而Offset则是表明当前副本已经消费到的位置。 最后,如果消费者组有实例挂掉了,那么kafka会自动触发重平衡。
二、kafka 中重要的参数配置
2.1、log.dirs
Broker 中存放数据的目录集合。 通过这个参数可以配置多个数据存放目录。为什么要配置多个目录,目的是为了实现故障转移。
2.2、unclean.leader.election.enable
是否允许 Unclean Leader 选举。 正常的生产配置中,这个参数是配置成fasle的。上文有说道partition中有分领导者副本和追随者副本,这个参数就是为了在领导者副本挂了的时候起作用的。所谓的Unclean副本,指的就是落后于领导者副本进度过多的副本,没有处于In-sync Replicas副本集合中(这块内容后续分析)。如果配置成ture,一旦unclean副本竞选领导者副本成功了,那么kafka有可能会丢失数据。
2.3、message.max.bytes
Broker 能够接收的最大消息大小 这个没啥好说的,消息队列不适合传输bigdata。
2.4、request.required.acks = 0、1和-1(all)
acks=0
Producer把消息发送出去,不需要等待任何确认收到的消息,生产者觉得自己发送成功了,但是实际上消息有可能因为kafka挂了而丢失了。保证了高性能,但是数据的可靠性得不到保障。
acks=1(默认)
Producer把消息发送出去,至少要等待领导者副本已经成功将数据写入本地log,但是并没有等待所有追随者副本是否成功写入。该情况下,如果follower没有成功备份数据,而此时leader刚好又挂掉了,就会导致消息丢失。
acks=-1/all
Producer把消息发送出去,这要求isr副本集合中所有的副本都与领导者副本同步了消息,才能认为这条消息是写入成功的。牺牲了性能但是保证了数据的可靠性。
2.5、min.insync.replicas
isr最小副本数,默认值是1。
|