Kafka如何保证数据高可靠

这篇具有很好参考价值的文章主要介绍了Kafka如何保证数据高可靠。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kafka它本身其实不是一个金融级别数据可靠的分布式消息系统。

Kafka如何保证数据高可靠虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉,其实数据是不丢失的。

但实际上它是存在风险的,因为Kafka它利用了缓存。就是数据在真正落盘之前都要存在Block Case里进行缓存。以便增加磁盘的读写性能,缓存满了或者是失效了,缓存里的数据才会往磁盘里面进行溢写。

这种情况下就一定会带来风险,一旦你的集群断电了,缓存里的数据还没有来得及往磁盘溢写,那这个时候数据就丢失了。

当然在生产中可以有其他的选型,比如说RabbitMQ,它的性能大概是Kafka的一半甚至一半不到。它是数据直写磁盘的,这样的话它不存在数据安全性的问题。换来的代价是它的性能会下降,延迟会增加。

我们现在要做的是,在保证高性能的同时,还希望数据尽量不丢失。这能不能做到?当然能做到。

Kafka生产者产生数据进行消息发送,它会采用这种ack机制,去保证数据可靠性。Ack就是当生产者将数据写入到Kafka之后,Kafka会返回一个标志,这个标志叫ack。

min.insync.replicas

它这种ack的机制其实有三种级别,一种是默认级别,即将min.insync.replicas参数设置为1的时候。生产者只要将数据发送到leader副本,kafka就会返回ack,leader中的数据先在缓存中,数据写磁盘需要一段时间。这个过程中如果两个从副本没有同步数据,直接断电后就会丢数。

Kafka如何保证数据高可靠

如果ack的级别配置成0,效率更高。不需要kafka返回任何ack的确认。这种的话性能更好,但是丢数的风险就更高。

当这种ack可以设为-1的时候,数据安全性是最高的。0安全级别最低,1安全级别中等。

-1这种情况是,当produce将数据发送到主副本以后,在ISR列表里面,也就是候选人列表中的从副本会立即从leader进行数据同步。完成数据同步以后,Kafka才会向生产者返回ack。生产者接收到ack后再继续发送其他的消息。

虽然说性能会有下降,但是数据可靠性提高了。

因为返回ack的时候,其实数据已经在多个节点里了。任意一个节点挂掉,其实对系统是没有影响的。

这里有一个细节,如果目前ISR里面的一个从副本,当它长时间与leader数据不同步,也就是落后了很多消息。超过一定时间之后它就会被移出ISR,ISR现在只剩一个从副本了。这个时候可靠性就会降级。

还有一种极端情况就是,两个follower都被移出ISR,ISR现在为空。这个时候ack这种-1级别,也被称为all级别,就降级成了1这个级别。

这种时候我们该怎么去限制?我们可以调整ISR最小副本数min.insync.replicas。

min.insync.replicas

这个参数它一定是配合ack等于all (-1)来使用。比如说min.insync.replicas限制为1,就是说ISR里面必须有1个副本,这样的话它才能保证数据的一个可靠性。如果小于1的话就是ISR为空,在生产者往Kafka里面写数据的时候就会报错。报NotEnoughReplicaseException异常。没有足够的副本,保证不了数据安全。

所以一般来说它俩是配合来使用的,避免ack=all降级为ack=1,能够提升我们数据安全级别。

ISR假设为空,或者小于最小副本数,生产者往Kafka写数据的时候一直会报错,不能说它一报错Kafka生产者就直接终止,我们肯定要设置一个重试次数,来提升程序的健壮性。

retries

即使我们ack开到all(-1),它数据还是先会写缓存,从副本同步的数据也在缓存里。当Kafka向生产者返回ack后,假设集群挂掉了。leader挂了,数据丢不丢失?不丢失,因为另外两个从副本也有数据。那现在整个集群同时宕机了,缓存中的数据肯定就都给清理掉了。就一定会出现数据丢失的情况。

所以我们也印证了前面说的,为什么Kafka它不是一个金融级别可用的,或者金融级别数据安全的消息系统。原因就在这里。

当然每个产品有它自己的使用场景,Kafka本身就是用来抗压的,它的性能越高越好,数据可靠性的要求要低一些。

这个时候有的同学就很矛盾了,我既想用Kafka的这种高性能高吞吐,但是我又不希望它丢数,我们换一种思路该怎么办?

先依赖Kafka,让它完成抗压的作用,数据可靠性既然不能依赖Kafka来完成,可以依赖谁来完成?依赖生产者。

生产者在将数据,向Kafka里写入的时候,能不能顺手将这个数据写到数据库里呢?比如Mysql。写入完成后再把数据推到Kafka中。

当然不写数据库也可以,可以先本地做备份,备份完以后再往Kafka里推送。一旦Kafka发生丢数,没关系,生产者可以拿到备份的数据进行补数操作。

如果补数的时候数据重复了,这个时候灵活一点,消费者这里是不是可以去重?就可以解决数据重复问题。

依赖kafka的高性能同时,尽量减少对kafka数据可靠性的依赖,并协调生产者与消费者去保障数据问题,这种解决方案能够满足生产上多数需求。

那Kafka的数据可靠性,就聊到这里,谢谢大家。文章来源地址https://www.toymoban.com/news/detail-488148.html

到了这里,关于Kafka如何保证数据高可靠的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kafka如何保证数据不丢失

    1.1 生产者如何保证数据不丢失 ACK机制: 当生产者将数据生产到Broker后, Broker应该给予一个ack确认响应, 在kafka中, 主要提供了三种ack的方案:     ack=0 : 生产者只管发送数据, 不关心不接收Broker给予的响应     ack=1 : 生产者将数据发送到Broker端, 需要等待Broker端对应的Topic上对应

    2024年02月06日
    浏览(41)
  • kafka如何保证数据不丢失?

    生产者生产数据有两种模式:一种是同步模式,一种是异步模式。 同步模式:生产者生产一条数据,就保存一条数据,保存成功后,再生产下一条数据,能够保证数据不丢失,但是效率太低了。 异步模式(采用ack机制): 在producer端开启一块buff缓冲,用来缓存数据,缓存一批

    2023年04月27日
    浏览(36)
  • kafka是如何保证数据不丢失的

    Kafka通过一系列机制来确保数据不丢失,这些机制涵盖了生产者、Broker和消费者等关键环节。以下是Kafka保证数据不丢失的主要方式: 生产者生产数据不丢失: 同步方式:生产者发送数据给Kafka后,会等待Kafka的确认。如果在一定时间内(如10秒)没有收到Broker的ack响应,生产

    2024年04月25日
    浏览(40)
  • RabbitMQ如何保证可靠

    消息从生产者到消费者的每一步都可能导致消息丢失: 发送消息时丢失: 生产者发送消息时连接MQ失败 生产者发送消息到达MQ后未找到Exchange 生产者发送消息到达MQ的Exchange后,未找到合适的Queue 消息到达MQ后,处理消息的进程发生异常 MQ导致消息丢失: 消息到达MQ,保存到队

    2024年02月20日
    浏览(32)
  • TCP如何保证可靠性,TCP如何实现可靠性传输的

    tcp 如何保证可靠性 大家都知道TCP是可靠性传输协议,既然是可靠的,就需要解决比如包丢失了、数据被破坏了、包重复了、乱序了等等这样的问题。下面将从几个方面介绍TCP的可靠性。 1. 校验和 TCP每一段报文都有校验和,这保证了报文不被破坏或篡改,如果收到的报文在校

    2024年02月10日
    浏览(50)
  • RabbitMQ如何保证消息可靠性

    目录 1、RabbitMQ消息丢失的可能性 1.1 生产者消息丢失场景 1.2 MQ导致消息丢失 1.3 消费者丢失 2、如何保证生产者消息的可靠性 2.1 生产者重试机制 2.2 生产者确认机制 2.3 实现生产者确认 2.3.1 配置yml开启生产者确认 2.3.2 定义ReturnCallback 2.3.3 定义ConfirmCallback 3、MQ消息可靠性 3.1

    2024年02月20日
    浏览(58)
  • [rocketmq] 如何保证消息可靠性

    1、生产者发送消息到Broker时; 2、Broker内部存储消息到磁盘以及主从复制同步时; 3、Broker把消息推送给消费者或者消费者主动拉取消息时; 1.重试策略,发送消息失败后会进行一定的重试策略 重试机制:固定重试次数,同步刷盘会切换 broker 重试,异步刷盘会在同一 broker

    2024年02月11日
    浏览(46)
  • TCP如何保证传输可靠性?

    文章参考: 《网络是怎样连接的》:https://book.douban.com/subject/26941639/ 《图解网络》:https://www.xiaolincoding.com/network/ 在开始阅读该博客之前,先要好好了解一下 TCP报文头部 到底有那些信息,阅读后续内容时有任何模糊的地方都可以回来这里 查看梳理 ,接下来我来解释一下:

    2024年02月20日
    浏览(49)
  • 如何保证 RabbitMQ 的消息可靠性?

    项目开发中经常会使用消息队列来 完成异步处理、应用解耦、流量控制等功能 。虽然消息队列的出现解决了一些场景下的问题,但是同时也引出了一些问题,其中使用消息队列时如何保证消息的可靠性就是一个常见的问题。 如果在项目中遇到需要保证消息一定被消费的场景

    2024年02月07日
    浏览(51)
  • rabbitmq如何保证消息的可靠性

    RabbitMQ可以通过以下方式来保证消息的可靠性: 在发布消息时,可以设置消息的delivery mode为2,这样消息会被持久化存储在磁盘上,即使RabbitMQ服务器重启,消息也不会丢失。 可以创建持久化的队列,这样即使RabbitMQ服务器重启,队列也不会丢失。 在消费者端,可以 设置手动

    2024年01月23日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包