kafka可靠的数据传递

 

kafka可靠性保证

ACID 是关系型数据库保证数据的规范,指的是原子性,一致性,隔离性和持久性,这是数据库给出的可靠性保证。
 

kafka给出的保证是什么?

1.kafka可以保证分区消息的顺序。
2.只有当消息被写入分区的所有同步副本时,它才认为是已提交的。
3.只要一个副本是活跃的,那么已经提交的消息就不会丢失。
4.消费者只能读取已经提交的消息。
 
 

复制

kafka的复制机制和分区的多副本架构师kafka可靠性保证的核心。
kafka复制机制
kafka的主题被分为多个分区,分区是基本的数据块。分区存储在单个磁盘上,kafka可以保证分区里的事件是有序的,分区可以在线(可用),也可以离线(不可用).每个分区有多个副本,只有一个首领副本,所有的事件都会发给首领副本,其他副本只需要同步首领副本,并及时复制最新的事件,当首领副本不可用的时候,其中一个同步副本将成为新首领。
 
分区首领是同步副本,而对于跟随者来说,它需要满足以下条件才能被认为是同步的。
1.与zookeeper之间有一个活跃的绘画,也就是说,它在过去的6s(可配置)内向zookeeper发送过心跳。
2.在过去10s内(可配置)从首领哪里获取过消息。
3.在过去的10s内从首领哪里获取过最新的消息。光从首领哪里获取消息是不够的,它还必须是几乎零延迟。
 
kafka可靠性保证之broker配置
broker有3个配置参数会影响kafka消息存储的可靠性。
 

复制系数

 
主题级别的配置参数是replication.factor 而在broker级别则可以通过default.replication,factor来配置自动创建的主题。如果复制系数是n 那么在n-1个broker失效的情况下,仍然能够从主题读取数据或向主题写入数据。
 
不完全的首领选举
 
unclean.leader.election 只能在broker级别进行配置,它的默认值是true。当分区首领不可用时,一个同步副本才会被选举为新首领。如果在选举过程中没有丢失数据,也就是说提交数据同时存在于所以的同步副本上,那么这个选举就是完全的。
 
但假设在首领不可用时其他副本都是不同步的,这种情况会在两种场景里出现。
1.分区有3个副本,其中两个副本跟随者副本不可用。
2.分区有3个副本,因为网络问题导致两个跟随者复制消息滞后,所以尽管他们还在复制消息,但已经不同步了。首领副本一直继续接受消息,但是这个时候首领副本不可用。另外两个就再也无法变成同步了。
 
对于这两种场景,我们要作出一个两难的选择
1.如果不同步的副本不能被提升为新首领,那么分区在旧首领(最后一个同步副本)恢复之前是不可用的。
2.如果不同步的副本可以被提升为新首领,那么在这个副本变为不同步之后写入旧首领的消息会全部丢失,导致数据不一致。
所以一般我们把unclean.election.enable 设为false 从而降低了可用性,从而保证了数据的一致性,如果要求不高,可以设置为false,提高效率。
 

最少同步副本

 
在主题级别和broker级别上,这个参数都叫min.insync.replicas
 
在可靠的系统里使用生产者
 
根据可靠性需求配置恰当的acks
在参数配置和代码正确处处理错误。
发送确认把acks设置为all是保证数据提交和一致性的保证。
 
配置生产者重试的参数,一般环境临时问题都会重试发送消息。这个重试的参数是保证数据发送成功的必要条件。
 

额外的错误处理

 
使用生产者内置的重试机制可以不造成消息丢失的情况下处理了很多错误,不过对于开发人员来说。仍然需要处理其他类型的错误,包括:
 
1.不可重试错误,列如消息大小错误,认证错误
2.消息发送前的序列化错误
3.生产者达到重试次数上限时或者消息占用的内存达到上限时发送的错误。

在可靠的系统里使用消费者

 
消息者的可靠性配置
1.group.id 确保设置唯一的group.id
2.auto.offset.reset(earliest/latest 默认latest 会减少重复消息的)
3.enable.auto.commit (自动提交偏移量)

显示提交偏移量

 
如果选择了自动提交偏移量,就不需要关心显示提交的问题。
 
1.总是处理完事件后再提交偏移量。
2.提交频度是性能和重复消息数量之间的权衡
3.确保对提交的偏移量心里有数
4.再均衡,提交的时候应注意再均衡问题。
5.消费者可能需要重试。
列如:轮询拿到数据之后插入数据库的时候,数据库不可能用的时候我们需要重试 如果你此时提交的偏移量是30 那么30之内的消息将会被确认消费。但是其实只有29失败了,这条信息一般我们都会用单独的日志存储,手工来处理,但是kafka提供了两种模式来解决这个问题
第一种模式,在遇到可重试错误的时候,提交最后一个偏移量,然后在消息存入缓冲区,下一次轮询就不会把消息覆盖掉,调用consumer.pause()来保证其他的轮询不会返回消息。然后在保持轮询的过程中尝试重新处理,如果尝试成功,或者次数达到上限并决定放弃,那么把错误记录下俩并丢弃消息,然后调用resume()方法让消费者继续从轮询里获取新数据
第二种模式。在遇到可重试错误时,把错误写入一个独立的主题,然后继续。
 

消费者可能需要维护状态

一般会在数据库存储一张表来维护消息的主题,消费者 偏移量等等。
 

长时间处理

如果在轮询的时候需要与外部系统交互时间过久的情况,那么我们要保持客户端与broker的连接,因为心跳包是在轮询中完成,但是这时我们可能长时间阻塞在与某个外部系统交互中,这个时候这种情况一般用一个独立的线程去完成。要保持轮询发送心跳包,这样broker才不会认为应用程序已经死掉了。

仅一次传递

 
kafka还不能完全支持仅一次 完成生产 消费,这其中会出现消息丢失或者消息重复 丢失可以记录 但是重复消费是无法避免的,因为我们考虑到broken可能不可用集群发送了再均衡之后,这时候选择的策略选择为最后一次提交偏移量的位置,但是如果是首领副本不可用的时候,这个时候跟随者却没有同步到,那么有一部分的消息将已经被消费了,这个时候选举跟随者当选首领副本,但是这个跟随者的偏移量并没有同步,那只能按照跟随者的偏移量开始,那么差的这部分消息就会被重复消费,一般做法是消费时候采用一个支持唯一键的系统 如关系型数据库db的主键。那么即使是重复消息也不会有太大的问题。
 

验证系统可靠性

 
通过测试和应用程序的监控来保证系统的可靠性
 
配置验证,需要做一些测试
1.首领选举,停掉首领会发生什么?生产者和消费者需要多久恢复正常需要多少时间?
2.控制器选举,重启控制器后系统需要多少时间来恢复状态
3.依次重启会不会不丢失任何数据吗
4.不完全首领选举测试
 

应用程序验证

1.客户端从服务器断开连接
2.首领选举
3.依次重启broker
4.依次重启消费者
5.依次重启生产者。
 

kafka学习(五)的更多相关文章

  1. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  2. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  3. Kafka学习之(六)搭建kafka集群

    想要搭建kafka集群,必须具备zookeeper集群,关于zookeeper集群的搭建,在Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建博客有说明.需要具备两台以上装有zook ...

  4. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  5. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  6. Kafka学习-简介

      Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.S ...

  7. Kafka学习-入门

    在上一篇kafka简介的基础之上,本篇主要介绍如何快速的运行kafka. 在进行如下配置前,首先要启动Zookeeper. 配置单机kafka 1.进入kafka解压目录 2.启动kafka bin\ ...

  8. Kafka学习之路

    一直在思考写一些什么东西作为2017年开篇博客.突然看到一篇<Kafka学习之路>的博文,觉得十分应景,于是决定搬来这“他山之石”.虽然对于Kafka博客我一向坚持原创,不过这篇来自Con ...

  9. kafka学习2:kafka集群安装与配置

    在前一篇:kafka学习1:kafka安装 中,我们安装了单机版的Kafka,而在实际应用中,不可能是单机版的应用,必定是以集群的方式出现.本篇介绍Kafka集群的安装过程: 一.准备工作 1.开通Z ...

随机推荐

  1. javaweb 项目编码格式设置

  2. ELF程序头部及程序加载

    程序头部 程序头部描述与程序执行直接相关的目标文件结构信息.用来在文件中定位各个段的映像.同时包含其他一些用来为程序创建进程映像所必需的信息. 可执行文件或者共享目标文件的程序头部是一个结构数组,每个 ...

  3. Java 数组复制之clone方法

    一.源码 public class Test1 { public static void main(String[] args) { // Student[] arrs = new Student[] ...

  4. windows如何禁用惹人烦的开机启动广告

    本地组策略编辑器 建立新的路径规则 重启电脑 本地组策略编辑器 你现在还在为那些烦人的互联网开机广告而发愁嘛,比如一下几种广告:这样的 还是这样的: 又或者是这样的: 修改了dns也并没有什么卵用,所 ...

  5. Idea中Springboot热部署无效解决方法

    仅适用IDEA中,eclipse中不需要设置 一.开启idea自动make功能 1 - Enable Automake when the application is running PRESS: C ...

  6. 状态管理-vuex

    1.使用vuex // 使用vuex // 第一步:装包npm i vuex -S // 第二步: import Vuex from 'vuex' Vue.use(Vuex) // 第三步: cons ...

  7. 线程优先级队列( Queue)

    Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现 ...

  8. EF大数据插入

    _April给出代码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotati ...

  9. php+html5实现无刷新上传,大文件分片上传,断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  10. BeanPostProcessor和BeanFactoryPostProcessor的区别

    官方文档: 在Spring核心的1.8章节 使用BeanPostProcessor自定义Bean BeanPostProcessor 接口定义了您可以实现的回调方法,以提供您自己的(或覆盖容器的默认) ...