Kafka使用指南
翁正存
做一名合格的工程师
展开
-
Kafka消息保留策略
Kafka Broker默认的消息保留策略是:要么保留一定时间,要么保留到消息达到一定大小的字节数。当消息达到设置的条件上限时,旧消息就会过期并被删除,所以,在任何时刻,可用消息的总量都不会超过配置参数所指定的大小。topic可以配置自己的保留策略,可以将消息保留到不再使用他们为止。因为在一个大文件里查找和删除消息是很费时的事,也容易出错,所以,分区被划分为若干个片段。默认情况下,...原创 2018-11-01 17:24:02 · 6846 阅读 · 0 评论 -
Kafka消费者能获取的消息范围
Kafka消费者使用poll()获取消息时,分区首领副本broker只会返回所有同步副本里全部复制到的那部分消息,即下图中的消息0、消息1、消息2。一个滞后的同步副本会导致生产者和消费者变慢,因为在消息被认为已提交之前,客户端会等待所有同步分区副本接受到消息,造成延迟。Kafka不关心非同步的分区副本是否发生滞后,但是非同步副本很多时,发送宕机时丢失数据的风险更大。...原创 2018-11-08 16:04:52 · 540 阅读 · 0 评论 -
Kafka Broker处理请求流程
生产请求:生产者发送的请求,包含客户端要写入分区首领broker的消息。获取请求:消费者和跟随着副本需要从分区首领broker读取消息时发送的请求。broker会在它监听的每一个端口上运行一个Acceptor线程,这个线程会去创建一个连接,并把它交给Processor去处理。Processor线程的数量是可配置的。Processor线程获取请求消息,把请求消息放入请求队列,然后从响应队列获...原创 2018-11-08 15:54:38 · 775 阅读 · 0 评论 -
Kafka消费者提交操作
消费者每次调用poll()方法,它总是返回由生产者写入Kafka但没有被消费者读取过的记录,我们因此可以知道哪些消息是被群组里的哪个消费者读取的。Kafka不会像JMS队列那样需要得到消费者的确认,消费者使用broker里的MetaData来追踪消息在分区里的位置(offset)。更新分区当前位置的操作叫提交。消费者会向_consumer_offset的特殊主题发送消息,消息里包含每个分区...原创 2018-11-08 14:52:59 · 635 阅读 · 0 评论 -
Kafka分配分区过程
当消费者要加入群组时,它会向担任群组协调器的broker发送一个JoinGroup请求。第一个加入群组的消费者将成为“群主”。群主从协调器那里获得群组的成员列表(列表中包含了所有最近发送过心跳的消费者,它们被认为是活跃的),并负责给每一个消费者分配分区。群主使用一个实现了PartitionAssignor接口的分类来决定哪些分区应该被分配给哪些消费者。Kafka内置了两种分配分区的策略:R...原创 2018-11-08 13:54:48 · 333 阅读 · 0 评论 -
Kafka消息丢失原因
1.生产者:往Broker写入消息时,发生网络错误,消息不可达。2.Broker:分区leader收到消息,同步分区复制到新消息之前,分区leader崩溃。3.消费者:读取到一批消息,消费者提交了偏移量却未能处理读到的消息(如数据需要的算力很大,处理时间会很长),这是消费者丢消息的主要原因。...原创 2018-11-10 16:48:54 · 1363 阅读 · 0 评论 -
Kafka Broker可靠性
Broker有3个配置参数会影响Kafka消息存储的可靠性。这3个参数可以应用在Broker级别,控制所有主题的行为,也可以应用在主题级别,用于控制个别主题的行为。1.复制系数主题级别的配置参数是replication.factor,而Broker级别可以通过default.replication.factor来配置自动创建的主题。即使在主题创建之后,也可以通过新增或移除副本来改变复制参数...翻译 2018-11-10 16:23:20 · 939 阅读 · 0 评论 -
Kafka分区副本的同步条件
分区leader是同步副本,而对于跟随者副本来说,它需要同时满足以下条件才可以被认为是同步的:1.与Zookeeper之间保持活跃的会话,即在过去的6s(可配置)内向Zookeeper发送过心跳。2.在过去的10s(可配置)从分区leader那里获取过消息。3.在过去10s从leader那里获取过最新的消息,这个条件保证了从leader那里获取的消息是无延迟的。一个非同步副本通过与...原创 2018-11-10 15:09:53 · 732 阅读 · 0 评论 -
kafka消费者群组与分区再均衡
group.id指定了消费者所属的消费群组,默认是必须指定的。同一个群组里的消费者订阅的同一个主题,每个消费者接收主题的一部分分区的消息。如果群组里的消费者数量超过主题的分区数量,就会有一部分消费者被闲置,不会接收到任何消息。同一个主题可以被多个消费者群组消费,消费者群组之间互不影响,而且正常情况下,同一条消息只能被群组里的一个消费者消费一次。再均衡:读取分区的所有权从群组内的一个...原创 2018-11-07 13:57:24 · 2236 阅读 · 0 评论 -
Kafka消息顺序保证
Kafka可以保证同一个分区里的消息是有序的。生产者按照一定的顺序发送消息,broker会按照这个顺序将消息写入分区的批次缓存中,消费者也会按照同样的顺序读取它们。如果把retries设置为非零整数,同时把max.in.flight.requests.per.connection设置为大于1的整数,那么,如果第一个批次写入消息失败,而第二个批次写入消息成功,broker会重试写入第一个批次。如...原创 2018-11-07 13:25:46 · 3436 阅读 · 0 评论 -
Kafka生产者属性配置
多样的使用场景意味着多样的需求:是否每个消息都很重要?是否允许丢失一小部分消息?偶尔出现重复消息是否可以接受?是否有严格的延迟和吞吐量要求?不同的场景对生产者API的使用和配置会有直接影响。必选属性有3个:bootstrap.servers:该属性指定broker的地址清单,地址的格式为host:port。清单里不需要包含所有的broker地址,生产者会从给定的broker里查询其他...翻译 2018-11-07 13:14:29 · 3350 阅读 · 0 评论 -
kafka的broker配置
1.broker.id每个broker都需要一个broker.id来唯一标识,它的默认值是0,也可以被设置成其他任意的整数。这个值在整个kafka集群里必须是唯一的,这个值是任意的整数,但是建议设置成与机器名具有相关性的整数,便于将ID号映射到机器名。例如机器名包含唯一性数字:host1.test.com/host2.test.com/host3.test.com,那么在这2台机器上部署的ka...翻译 2018-11-02 14:55:50 · 1017 阅读 · 0 评论 -
Kafka零复制技术
Kafka把消息和偏移量保存在文件里。保存在磁盘上的数据格式与从生产者发送过来或者发送给消费者的消息格式是一样的。因为使用了相同的消息格式进行磁盘存储和网络传输,Kafka可以使用零复制技术将消息直接发送给消费者,避免了对生产者已经压缩过的消息进行解压和再压缩。消息体包括键、值、偏移量、消息大小、校验和CRC、消息版本号、压缩算法(Snappy、GZip或LZ4)和时间戳。时间戳是可配置的,可...原创 2018-11-09 17:12:03 · 496 阅读 · 0 评论 -
Kafka控制器
Kafka使用Zookeeper的临时节点/controller来选举控制器,一个集群同一时刻只能有一个控制器,Zookeeper会在节点介入集群或者退出集群时通知控制器。控制器负责在节点加入或者离开集群时进行分区首领选举。控制器使用epoch来避免“脑裂”。“脑裂”是指两个节点同时认为自己是当前的控制器。...原创 2018-11-09 10:32:41 · 299 阅读 · 0 评论 -
Kafka发送消息过程
Kafka发送消息模型 ProducerRecord对象包含目标主题和要发送的内容,还可以指定键或分区。发送ProducerRecord对象时,生产者要先把键和值对象序列化为字节数组(默认使用StringSerializer),这样才可以在网络上传输。然后,字节数组被传给分区器。如果在ProducerRecord对象里指定了分区,那么分区器不会再做任何事,直接把指定的分区返回。如果没有指...翻译 2018-11-06 12:09:00 · 835 阅读 · 1 评论 -
序列化的原因?
Java的RMI调用、Kafka发送的消息等,都将对象序列化后在网络中传输,为何一定要序列化后再传输呢?因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!...原创 2018-11-06 10:21:38 · 319 阅读 · 0 评论 -
Kafka消费者群组消费不到消息解决办法
测试环境发Kafka消息,不能消费,我让测试重启一下brokekr,再发消息,发现能正常消费了。原创 2018-11-14 16:43:01 · 3399 阅读 · 0 评论