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. Idea集成使用SVN教程

    第一步:下载svn的客户端,通俗一点来说就是小乌龟啦!官网下载地址:https://tortoisesvn.net/downloads.html 下载之后直接安装就好了,但是要注意这里,选择安装所有的 ...

  2. Spring MVC文件上传下载(转载)

    原文地址: http://www.cnblogs.com/WJ-163/p/6269409.html 上传参考 http://www.cnblogs.com/lonecloud/p/5990060.h ...

  3. 随机发送n位数字+字母的验证码

    ''' 随机发送n位数字+字母的验证码 ''' import random def get_verified(length): code = '' for i in range(length): nu ...

  4. Linux安装redis,启动配置不生效(指定启动加载配置文件)

    一.今天有个同学问我,为什么明明安装了redis,修改了配置,启动的时候,配置还是不生效.如下图是安装后的redis文件图. 二.想加载上图中的redis.conf,进入到src中寻找到启动文件red ...

  5. 怎么画一条0.5px的边

    编者按:本文由人人网FED发表于掘金,并已授权奇舞周刊转载 什么是像素? 像素是屏幕显示最小的单位,在一个1080p的屏幕上,它的像素数量是1920 1080,即横边有1920个像素,而竖边为1080 ...

  6. MySQL事务以及特征

    1.什么是事务? 在现实生活中,我们往往会进行转账操作.转账可以分为两部分完成,转入和转出,只要两部分都完成了才算转账完成.在数据库中,这个过程是由两条sql语句来完成的, 如果任意一方的语句没有执行 ...

  7. Python Number(数字) Ⅱ

    Python math 模块.cmath 模块 Python 中数学运算常用的函数基本都在 math 模块.cmath 模块中. Python math 模块提供了许多对浮点数的数学运算函数. Pyt ...

  8. 对DOMContentLoaded的研究 -----------------------引用

    1.    什么是 DOMContentLoaded.打开 Chrome DevTools,切到 Network 面板,重新加载网页,得到如下截图: 标记 1 指向的蓝线以及标记 2 指向的蓝色字 “ ...

  9. jeesite安装时Perhaps you are running on a JRE rather than a JDK

    使用自己本地安装的maven,启动jeesite报错: No compiler is provided in this environment. Perhaps you are running on ...

  10. TTTTTTTTTTT LA 4329 BIT模版

    题意: 有n个打乒乓球的人,住在一排房子内,以房子的顺序从做到由,每个人都有一个不同的乒乓球等级ai.每次比赛需要三人,两人比赛和一人裁判,裁判必须居住在两个比赛者之间,且等级必须也在两个人之间.问最 ...