kafka读书笔记

kafka中幂等和事务的概念

1、幂等:简单地说就是对接口的多次调用所产生的结果和调用一次是一致的。

1.1、kafka中生产者开启幂等需要设置: properties.put(ProducerConfig .ENABLE_IDEMPOTENCE CONFIG, true); 
并且默认的retries=Integer.MAX_VALUE; acks=-1; max.in.flight.requests.per.connection=5。

1.2、kafka为了实现生产者的幕等性,Kafka为此引入producer id 以下简称(PID)和序号(sequence number)这两个概念.
对于每个PID,消息发送到的每一个分区都有对应的序列号,这些序列号从 1开始单调递增。生产者每发送一条消息就会将<PID 分区>对应的序列号的值加1。
broker 端会在内存中为每一对<PID ,分区>维护一个序列号。对于收到的每一条消息,只有当它的序列号的值(SN_new)比 broker端中维护的对应的序列号的值(SN_old)大1(SN_new = SN_old + 1)时, 
broker 才会接收它 如果 SN_new < SN_old + 1那么说明消息被重复写入。broker 可以直接将其丢弃 如果 SN_new> SN_old + 1,那么说明中间有数据尚未写入, 出现了乱序,暗示可能有消息丢失,
对应的生产者会抛出异常。由于kafka只维护了<pid, partition>这样的数据结果,表明只能实现单个生产者会话中单个分区的幂等。

2、事务:保证操作的原子性,指多个操作要么全部成功,要么全部失败,不存在部分成功、部分失败的可能。

2.1、为了实现kafka中事务需要设置:properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,”transaction_Id”) ; 并且还必须设置幂等的配置。

2.2、kafka中的事务有两种的隔离级别:read_uncommitted[意思是说消费端应用可 看到(消费到)未提交的事务 当然对于己提交的事务也是可见的],
read_committed[,表示消费端应用不可以看到尚未提交的事务内的消息]。举个例子,如果生产者开启事务并向某个分区值发送3条消息 msgl、msg2、msg3,在执行commitTransaction(), bortTransaction() 方法前,
设置为“read_committed ”的消费端应用是消费不到这些消息的,不过在 KafkaConsumer 内部会缓存这些消息,直到生产者执行 commitTransaction()方法之后它才能将这些消息推送给消费端应用。反之,如果生产者
执行了 abortTransaction()方法,那么 KafkaConsumer 会将这些缓存的消息丢弃而不推送给消费端应用。

2.3、kafka__transaction_state主题用来存储用户对应的事务ID的kafka事务状态。每个事务Id的事务状态信息都发往[ hash(”transaction_Id”) % partitionNums ]的分区。

kafka中事务的示例代码: 

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("transactional.id", "my-transactional-id");
Producer<String, String> producer = new KafkaProducer<>(props, new StringSerializer(), new StringSerializer());

producer.initTransactions();

try {
 producer.beginTransaction();
 for (int i = 0; i < 100; i++)
	 producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), Integer.toString(i)));
 producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
 // We can't recover from these exceptions, so our only option is to close the producer and exit.
 producer.close();
} catch (KafkaException e) {
 // For all other exceptions, just abort the transaction and try again.
 producer.abortTransaction();
}
producer.close();

kafka中_consumer _offsets概念

当集群中第一次有消费者消费消息的时候会创建该主题,该主题offsets.topic.replication.factor=3; offsets.topic.num.partitions=50;
每一个消费者组中提交的offset都会发向其中[ hash(consumer-groupId) % partitionNums ]的分区。
其中消费者端发往的消息的存在事件在broker端的配置为:在2.0.0版本及之后offsets.retention.minutes=10080,之前为offsets.retention.minutes=1440。
如果当消费者隔了很久再次执行消费任务,如果这个间隔超过了offsets.retention.minutes原来的消费位移信息将会丢失。只能根据客户端的auto.offset.reset参数选择消费的位置。

查看_consumer _offsets中的内容:
比如查看consumerGroupId的消费者组的offset内容,需要自己计算对应的消费者组对应的分区号.

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic __consumer_offsets partition 20 --formatter "kafka.coordinator.group.GroupMetadataManager.OffsetsMessageFormatter"


kafka中AR和ISR集合概念

1、一个分区中包含一个个副本,其中1个为 leader 副本,其余为 follower 副本,各
个副本位于不同的 broker 节点中。只有 leader 副本对外提供服务, follower 副本只负
责数据同步。分区中的所有的副本统称为AR

2、ISR是指与leader副本保持同步状态的副本集合。失效副本:在 ISR 集合之外, 也就是处于同步失效或功能失效( 比如副本处于
非存活状态)的副本统称为失效副本,失效副本对应的分区也就称为同步失效分区 ,即under replicated 分区

kafka中LEO和HW概念

1、LEO 标识每个分区中最后一条消息的下一位置,分区的每个副本都有自己的 LEO。
2、ISR中最小的LEO即为HW,俗称高水位,消费者只能拉取到HW之前的消息。


kafka的topic partition管理:

1、查询失效副本
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic my_topic under-replicated-partitions

kafka消费者管理:

1、查看消费者的消费情况
bin/kafka-consumer-groups . sh --bootstrap-server localhost:9092 --describe --group consumerGroup

2、查看消费者的状态
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --descrbe --group consumerGroup --state

3、查看每个消费者组的成员信息
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group consumerGroup --members

3、查看每个消费者成员的分配情况
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group consumerGroup --members --verbose

4、 删除指定的消费者组
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --delete --group consumerGroup

kafka消费offset管理

1、重置消费者组的消费者组的内的所有的topic的offset,必须在消费者组内没有消费者在消费的情况下
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group consumerGroup --all-topics --reset-offsets --to-earliest --execute

2、重置消费者组中的指定的topic的分区的offset
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group consumerGroup --topic topic-monitor:2  --reset-offsets --to--latest --execute

前面的两个示例中各 自使用了 to-earliest和to-latest 参数来分别将消费位移调略到分区的开头和末尾。

除此之外, kafka-consumer-groups.sh脚本还提了更多的选择:

by-duration<String: duration> :将消费位移调整到距离当前时间指定间隔最早的位移处duration的格式为"pnDTnHnMnS"。

from-file<String: path to CSV file>:将消费位移重置到 csv 文件巾义的位置。

shift-by<Long:number-of-offsets>:把消费位移调整到 当前位移+mber-of-offsets 处, umber-of-offset~ 的的可 以为负数

to-current: 将消费位移调整到当前位置处。

to-datetime<String: datati me >:将消费位移调整到大于给定时间的最早位移处。 datatime的格式为 "YYYY-MM-DDTHH:mm:SS.sss"

to-offset<Long: offset>: 将消费位移调整到指定的位置。


kafka手动删除消息:

kafka-delete-records.sh脚本,这个脚本可以用来删除指定位置前消息。

首先指定每个分区需要删除的offset之前的消息,写成一下的delete.json文件:

{
	"partitions":[
		{
			"topic":"my_topic",
			"partition":0,
			"offset":10
		},
		{
			"topic":"my_topic",
			"partition":1,
			"offset":10
		},
		{
			"topic":"my_topic",
			"partition":2,
			"offset":10
		}
	],
	"version":1
}

执行删除命令:
bin/kafka-delete-records.sh --bootstrap-server localhost:9092 --offset-json-file delete.json 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值