转载自  阿里面试,为什么Kafka不支持读写分离

为什么数据库、redis都支持了读写分离功能,而kafka却没有?

厮大也是狠人,直接打开源码从头开始讲,我一看这情况不对,按照这进度得讲到天黑了,蹭着厮大上厕所的空隙,我呲溜跑了~~~

厮大估计见我已经呲溜了,第二天就甩我一篇文章,还是热乎的,文末还有精华

从代码层面上来说,在 Kafka 中完全可以支持这种功能,但是会大大增加代码的复杂度,所以我们要从“收益点”这个角度来做具体分析。主写从读可以让从节点去分担主节 点的负载压力,预防主节点负载过重而从节点却空闲的情况发生。但是主写从读也有 2 个很明 显的缺点:

  • 数据一致性问题。数据从主节点转到从节点必然会有一个延时的时间窗口,这个时间 窗口会导致主从节点之间的数据不一致。某一时刻,在主节点和从节点中 A 数据的值都为 X, 之后将主节点中 A 的值修改为 Y,那么在这个变更通知到从节点之前,应用读取从节点中的 A 数据的值并不为最新的 Y,由此便产生了数据不一致的问题。

  • 延时问题。类似 Redis 这种组件,数据从写入主节点到同步至从节点中的过程需要经 历网络→主节点内存→网络→从节点内存这几个阶段,整个过程会耗费一定的时间。而在 Kafka 中,主从同步会比 Redis 更加耗时,它需要经历网络→主节点内存→主节点磁盘→网络→从节 点内存→从节点磁盘这几个阶段。对延时敏感的应用而言,主写从读的功能并不太适用。

现实情况下,很多应用既可以忍受一定程度上的延时,也可以忍受一段时间内的数据不一 致的情况,那么对于这种情况,Kafka 是否有必要支持主写从读的功能呢?

主写从读可以均摊一定的负载却不能做到完全的负载均衡,比如对于数据写压力很大而读 压力很小的情况,从节点只能分摊很少的负载压力,而绝大多数压力还是在主节点上。而在 Kafka 中却可以达到很大程度上的负载均衡,而且这种均衡是在主写主读的架构上实现的。我们来看 一下 Kafka 的生产消费模型,如下图所示。

在 Kafka 集群中有 3 个分区,每个分区有 3 个副本,正好均匀地分布在 3个 broker 上,灰色阴影的代表 leader 副本,非灰色阴影的代表 follower 副本,虚线表示 follower 副本从 leader 副本上拉取消息。当生产者写入消息的时候都写入 leader 副本,对于图 8-23 中的 情形,每个 broker 都有消息从生产者流入;当消费者读取消息的时候也是从 leader 副本中读取 的,对于图 8-23 中的情形,每个 broker 都有消息流出到消费者。

我们很明显地可以看出,每个 broker 上的读写负载都是一样的,这就说明 Kafka 可以通过 主写主读实现主写从读实现不了的负载均衡。上图展示是一种理想的部署情况,有以下几种 情况(包含但不仅限于)会造成一定程度上的负载不均衡:

  • broker 端的分区分配不均。当创建主题的时候可能会出现某些 broker 分配到的分区数 多而其他 broker 分配到的分区数少,那么自然而然地分配到的 leader 副本也就不均。

  • 生产者写入消息不均。生产者可能只对某些 broker 中的 leader 副本进行大量的写入操 作,而对其他 broker 中的 leader 副本不闻不问。

  • 消费者消费消息不均。消费者可能只对某些 broker 中的 leader 副本进行大量的拉取操 作,而对其他 broker 中的 leader 副本不闻不问。

  • leader 副本的切换不均。在实际应用中可能会由于 broker 宕机而造成主从副本的切换, 或者分区副本的重分配等,这些动作都有可能造成各个 broker 中 leader 副本的分配不均。

对此,我们可以做一些防范措施。针对第一种情况,在主题创建的时候尽可能使分区分配 得均衡,好在 Kafka 中相应的分配算法也是在极力地追求这一目标,如果是开发人员自定义的 分配,则需要注意这方面的内容。对于第二和第三种情况,主写从读也无法解决。对于第四种 情况,Kafka 提供了优先副本的选举来达到 leader 副本的均衡,与此同时,也可以配合相应的 监控、告警和运维平台来实现均衡的优化。

所以,从某种意义上来说,主写从读是由于设计上的缺陷而形成的权宜之计。

阿里面试,为什么Kafka不支持读写分离相关推荐

  1. 干货|为什么Kafka不支持读写分离

    在 Kafka 中,生产者写入消息.消费者读取消息的操作都是与 leader 副本进行交互的,从 而实现的是一种主写主读的生产消费模型.数据库.Redis 等都具备主写主读的功能,与此同时还支持主写从 ...

  2. EF通用数据层封装类(支持读写分离,一主多从)

    浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...

  3. asp.net mysql 读写分离_[ASP.net教程]SqlSugar ORM已经支持读写分离

    [ASP.net教程]SqlSugar ORM已经支持读写分离 0 2016-11-26 23:00:12 目前只有MYSQL版 3.5.2.9 支持,其库版本12月3号更新该功能 用例讲解using ...

  4. Sharding-JDBC 1.3.0发布——支持读写分离

    当当的分布式数据库中间层Sharding-JDBC正式开源.经过近半年的潜心打磨,Sharding-JDBC于六一前夕正式发布1.3.0里程碑版本. Sharding-JDBC源于当当应用框架ddfr ...

  5. 让Dapper支持读写分离

    在上一篇说了封装Dapper扩展方法为一个接口来支持Mock,接下来看看如何实现读写分离. 其实定义两个接口,一个用来实现读,一个用来实现写.在读的接口里只有Query的方法,在写的接口里实现Quer ...

  6. 使用阿里云Mysql集群做读写分离_以及使用阿里云服务器自己搭建MyCat集群_费用核算---Linux工作笔记046

    咨询了一下阿里云,如果买阿里云的MySQL服务器的话,一台是5500一年,4GHz频率的CPU, 50G的硬盘,如果你也跟我一样,一个单表的数据就达到了20GB的话,那么,只买一台阿里的MySql 服 ...

  7. 阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

    秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台知名度.一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而提升秒 ...

  8. .NETCore 下支持分表分库、读写分离的通用 Repository

    首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参数 abp vnext,定义和实现基础的仓储层(CURD). 安装 do ...

  9. 高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制)

    高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制) 视频地址:https://www.bilibili.com/video/BV1ry4y1v7Tr?p=8& ...

最新文章

  1. 【小项目关键技术五】控制全彩 WS2812 灯环/灯带
  2. leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法
  3. 【C语言】创建一个函数,并调用比较两个数的大小
  4. linux ls 命令
  5. SPT20 协议_【笔试时间有变】关于国家电网三方协议的那些事!
  6. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例Reducer_案例_Debug调试---大数据之hadoop3.x工作笔记0132
  7. 上下文保存 中断_从操作系统(Windows)的角度讨论中断和异常机制
  8. tlo是什么意思_单片机计时器程序里TMOD、THO、TLO都是什么意思?需要编一个计时器来代替delay,让单片机保持状态3秒...
  9. 关键时刻救一命:旧手机改造求生工具
  10. 当你在追梦的路上抱怨生活太累快要放弃的时候,不妨看看我的这篇文章
  11. Android Studio gradle 自定义签名设置
  12. map集合用于存储信息(映射关系)
  13. macbook proa1708_MacBook Pro 2017 A1708自己更换电池
  14. python soup中文歌词_Python调用BeautifuSoup进行html的文本内容提取问题 [ 求问吃鸡主播beautifu1 boy...
  15. vscode如何同时运行多个vue项目
  16. 单片机初学者电路常识
  17. 三坐标检测基础知识之坐标系2021
  18. android联系人中英文混合排序
  19. Linux特殊权限命令
  20. 设计模式综合-媒体播放器的实现

热门文章

  1. python编程中的小问题汇总
  2. 数据结构与算法--求1~n能组成的所有二叉搜索树的排列
  3. 数据结构与算法--丑数
  4. 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m
  5. Codeforces Round #607 (Div. 2) E. Jeremy Bearimy dfs + 思维
  6. cf1561D Up the Strip(D1D2)
  7. CF1526 D. Kill Anton
  8. Saving Beans HDU - 3037(卢卡斯定理)
  9. Strategic game(树的最小点覆盖)
  10. 牛客题霸 [栈和排序] C++题解/答案