阿里面试,为什么Kafka不支持读写分离
转载自 阿里面试,为什么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不支持读写分离相关推荐
- 干货|为什么Kafka不支持读写分离
在 Kafka 中,生产者写入消息.消费者读取消息的操作都是与 leader 副本进行交互的,从 而实现的是一种主写主读的生产消费模型.数据库.Redis 等都具备主写主读的功能,与此同时还支持主写从 ...
- EF通用数据层封装类(支持读写分离,一主多从)
浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...
- 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 ...
- Sharding-JDBC 1.3.0发布——支持读写分离
当当的分布式数据库中间层Sharding-JDBC正式开源.经过近半年的潜心打磨,Sharding-JDBC于六一前夕正式发布1.3.0里程碑版本. Sharding-JDBC源于当当应用框架ddfr ...
- 让Dapper支持读写分离
在上一篇说了封装Dapper扩展方法为一个接口来支持Mock,接下来看看如何实现读写分离. 其实定义两个接口,一个用来实现读,一个用来实现写.在读的接口里只有Query的方法,在写的接口里实现Quer ...
- 使用阿里云Mysql集群做读写分离_以及使用阿里云服务器自己搭建MyCat集群_费用核算---Linux工作笔记046
咨询了一下阿里云,如果买阿里云的MySQL服务器的话,一台是5500一年,4GHz频率的CPU, 50G的硬盘,如果你也跟我一样,一个单表的数据就达到了20GB的话,那么,只买一台阿里的MySql 服 ...
- 阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统
秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台知名度.一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而提升秒 ...
- .NETCore 下支持分表分库、读写分离的通用 Repository
首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参数 abp vnext,定义和实现基础的仓储层(CURD). 安装 do ...
- 高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制)
高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制) 视频地址:https://www.bilibili.com/video/BV1ry4y1v7Tr?p=8& ...
最新文章
- 【小项目关键技术五】控制全彩 WS2812 灯环/灯带
- leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法
- 【C语言】创建一个函数,并调用比较两个数的大小
- linux ls 命令
- SPT20 协议_【笔试时间有变】关于国家电网三方协议的那些事!
- 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例Reducer_案例_Debug调试---大数据之hadoop3.x工作笔记0132
- 上下文保存 中断_从操作系统(Windows)的角度讨论中断和异常机制
- tlo是什么意思_单片机计时器程序里TMOD、THO、TLO都是什么意思?需要编一个计时器来代替delay,让单片机保持状态3秒...
- 关键时刻救一命:旧手机改造求生工具
- 当你在追梦的路上抱怨生活太累快要放弃的时候,不妨看看我的这篇文章
- Android Studio gradle 自定义签名设置
- map集合用于存储信息(映射关系)
- macbook proa1708_MacBook Pro 2017 A1708自己更换电池
- python soup中文歌词_Python调用BeautifuSoup进行html的文本内容提取问题 [ 求问吃鸡主播beautifu1 boy...
- vscode如何同时运行多个vue项目
- 单片机初学者电路常识
- 三坐标检测基础知识之坐标系2021
- android联系人中英文混合排序
- Linux特殊权限命令
- 设计模式综合-媒体播放器的实现
热门文章
- python编程中的小问题汇总
- 数据结构与算法--求1~n能组成的所有二叉搜索树的排列
- 数据结构与算法--丑数
- 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m
- Codeforces Round #607 (Div. 2) E. Jeremy Bearimy dfs + 思维
- cf1561D Up the Strip(D1D2)
- CF1526 D. Kill Anton
- Saving Beans HDU - 3037(卢卡斯定理)
- Strategic game(树的最小点覆盖)
- 牛客题霸 [栈和排序] C++题解/答案