本文原文链接
尼恩说在前面
在45岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团、蚂蚁、得物的面试资格,遇到很多很重要的相关面试题:
问题11:为什么高并发下数据写入不推荐关系数据?
最近有小伙伴面试招行,都问到了相关的面试题。 小伙伴没有系统的去梳理和总结,所以支支吾吾的说了几句,面试官不满意,面试挂了。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V175版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
招商银行的高阶Java后端面试真题
被狠狠拷打了,问的人都懵了。 项目场景题太难了,不好好准备,真的答不出!
尼恩将给出全部答案:
1.如何让系统抗住双十一的预约抢购活动?
2.如何从零搭建10万级QPS大流量、高并发优惠券系统?
3.百万级别数据的 Excel 如何快速导入到数据
4.如何设计一个支持万亿GB网盘实现秒传与限速的系统?
5.如何根据应用场景选择合适的消息中间件?
即将发布。
6.如何提升 RocketMQ 顺序消费性能?
即将发布。
7.使用分布式调度框架该考虑哪些问题?
即将发布。
9.如何让系统抗住双十一的预约抢购活动?
10.问 : 如何解决高并发下的库存抢购超卖少买?
即将发布。
11.为什么高并发下数据写入不推荐关系数据?
本文。
12.如果让你设计一个分布式链路跟踪系统?
即将发布。这个之前尼恩给一个 小伙伴改造过一个 100wtps 链路跟踪平台简历, 非常NB, 牛到暴表。
1 招行面试:高并发写,为什么不推荐关系数据?
资深老架构师尼恩告诉大家,这是一道考研 IO底层原理、事务底层原理、 IO架构设计技巧、事务架构设计技巧的核心面试题。
非常重要。
需要从以下两个方面作答:
- 存储机制的性能开销
- 事务特性机制的性能开销
- nosql 和 sql 的性能对比
1.1 参考答案视频如下
https://mp.weixin.qq.com/s/PKsa-7eZqXDg3tpgJKCAAw
2 存储机制的性能开销
2.1 关系数据库的存储机制和 随机读写
MySQL 采用的是 B + 树的索引结构,一个表是一颗大的 主键有序的 B+树。 对记录的插入和删除、查找,都是随机读写。
一个高度 为3的B+树, 可以存放多少行数据呢? 这个问题的简单回答是:约 2 千万。
以上内容的详细介绍,请参见尼恩的文章: 滴滴面试:单表能存200亿数据吗?单表只存2000W是真的吗,为什么?
一个高度 为4的B+树, 一共可以存放 1170 * 1170 * 1170 * 16 = 25,625,808,000 (约200亿)
行记录。
回到问题,InnoDB 一棵 B+ 树可以存放多少行数据? 这个问题的简单回答是:200亿。
以上内容的详细介绍,请参见尼恩的文章: 滴滴面试:单表能存200亿数据吗?单表只存2000W是真的吗,为什么?
数据量的增长会使得索引树变得很深,从而增加了查询场景下的磁盘 I/O 操作次数。这不仅延长了查询的响应时间,还限制了数据库在并发下的处理能力。
mysql B+Tree是一个大树,它是一个聚合的完整整体,任何数据的增删改都是在这个整体内进行操作,这就导致了大量的随机读写IO。
2.2 非关系数据库的存储机制和 顺序读写
非关系数据库的 如 hbase、MongoDB、 rockdb等,都是使用LSM Tree,
LSM树它实际上不是一棵树,而是2个或者多个树或类似树的结构(注意这点)的集合。
在LSM树中,最低一级也是最小的C0树位于内存里,而更高级的C1、C2...树都位于磁盘里。数据会先写入内存中的C0树,当它的大小达到一定阈值之后,C0树中的全部或部分数据就会刷入磁盘中的C1树,如下图所示。
2.3 LSM Tree的 顺序写 的流程:
LSM 是由一棵棵小树组成,最小的树在内存, 当我们新数据写入时, 会在内存中暂存,这样能够获得非常大的写并发处理能力。
而当内存中数据积累到一定程度后,会将内存中数据和索引做 顺序写,落地形成一个数据块。
这个数据块内保存着一棵小树和具体的数据,新生成的数据块会保存在Level 0 层(最大有几层可配置),Level 0 层会有多个类似的数据块文件。
每一层的数据块和数据量超过一定程度时,合并不同Level的数据,将多个数据块内的数据和索引合并在一起,并推送到Level的下一层。
通过这个方式,每一层的数据块个数和数据量就能保持一定的数量,合并后的数据会更紧密、更容易被找到。
这样的设计,可以让一个Key存在于多个Level或者数据块中,但是最新的常用的数据肯定是在Level最顶部或内存(0~4层,0为顶部)中最新的数据块内。
2.4 LSM Tree的 查询 的流程:
而当我们查询一个key的时候,会先查内存Level 0 层的树。
如果没找到,会从Level 0层到下层,每层按生成最新到最老的顺序去查询每层的数据块。
同时为了减少IO次数,每个数据块都会有一个BloomFIlter辅助索引,来辅助确认这个数据块中是否 可能有 对应的Key;如果当前数据块没有,那么可以快速去找下一个数据块,直到找到为止。
上面LSM的概念很复杂,具体参见尼恩的电子书 《LSM 学习圣经》,可以找尼恩获取。
2.5 顺序和随机读写的性能比较
械硬盘的顺序和随机读写的性能比较
机械硬盘在顺序读写场景下有相当出色的性能表现,但一遇到随机读写性能则直线下降。
顺序读是随机读性能的400倍以上。顺序读能达到84MB/S。
顺序写是随机读性能的100倍以上。顺序写性能能达到79M/S。
原因:是因为机械硬盘采用传统的磁头探针结构,随机读写时需要频繁寻道,也就需要磁头和探针频繁的转动,而机械结构的磁头和探针的位置调整是十分费时的,这就严重影响到硬盘的寻址速度,进而影响到随机写入速度。
SSD固态硬盘 的顺序和随机读写的性能比较
顺序读:220.7MB/s。随机读:24.654MB/s。
顺序写:77.2MB/s。随机写:68.910MB/s。
总结:对于固态硬盘,顺序读的速度仍然能达到随机读的10倍左右。但是随机写还是顺序写,差别不大。
上面对比的过程很重要,具体参见尼恩的电子书 《LSM 学习圣经》,可以找尼恩获取。
3 事务特性机制的性能开销
3.1 关系数据库 内置ACID 事务的低性能
关系数据库强调 ACID(原子性、一致性、隔离性、持久性)特性,特别是在处理事务的时候。在高并发场景下维持事务的 ACID 特性需要大量的资源开销,尤其是事务的持久化阶段,涉及到日志的同步写入,这都会降低写入的效率。
为了保证数据一致性,关系数据库通常会采用锁的机制来管理并发访问,包括行锁、表锁等等。
在高并发写入场景下,锁机制可能会引起写操作的排队等待,导致写入速度大幅下降,甚至可能会出现死锁的问题,影响系统的整体吞吐量。
- mysql 事务
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
京东面试:RR隔离mysql如何实现?什么情况RR不能解决幻读?
3.2 nosql 如何实现外置事务/ 外挂的事务
3.2.1 使用分布式事务框架 实现 低并发事务
Seata 是一款开源的分布式事务解决方案,支持多种 NoSQL 数据库。
以使用 Seata 与 Cassandra 数据库为例,首先需要在项目中引入 Seata 的相关依赖,然后配置 Seata 的事务协调器(TC)、事务管理器(TM)和资源管理器(RM)。
在业务代码中,通过 TM 开启事务,执行对 nosql 的多个操作,RM 会将这些操作注册到事务中,最后由 TC 来协调事务的提交或回滚。
尼恩团队的实操(即将发布的 高并发 营销中台实操)体系中, 已经完成了 jemter 对 Seata 进行了事务的压测, 吞吐量不过 100tps,还做不到。
3.2.2 基于消息队列实现 高并发事务
以 MongoDB 和 RocketMQ为例,当需要执行一个涉及 MongoDB 的外置事务时,首先将事务操作封装成消息发送到 RocketMQ 的消息队列中。
消费者从队列中获取消息后,开始执行对 MongoDB 的操作。
如果操作成功,将消息标记为已处理;
如果操作失败,RocketMQ 会根据配置进行重新投递, 最终还没有成功,将消息放入死信队列。实现最终一致性。
4 nosql 和 sql 的性能对比
这个在前面的小视频里边说一下一些通用的 常识,
具体请参见 本文前面的 答案小视频。
尼恩架构团队的塔尖 sql 面试题
- sql查询语句的执行流程:
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
- 索引
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?
- 索引下推 ?
- 索引失效
美团面试:mysql 索引失效?怎么解决?(重点知识,建议收藏,读10遍+)
- MVCC
- binlog、redolog、undo log
美团面试:binlog、redolog、undo log底层原理是啥?分别实现ACID哪个特性?(尼恩图解,史上最全)
- mysql 事务
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
京东面试:RR隔离mysql如何实现?什么情况RR不能解决幻读?
- 分布式事务
分布式事务圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
- mysql 调优
说在最后:有问题找老架构取经
只要按照上面的 尼恩团队梳理的 方案去作答, 你的答案不是 100分,而是 120分。 面试官一定是 心满意足, 五体投地。
按照尼恩的梳理,进行 深度回答,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。
很多小伙伴刷完后, 吊打面试官, 大厂横着走。
在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。
另外,如果没有面试机会, 可以找尼恩来改简历、做帮扶。前段时间,刚指导一个小伙 暴涨200%(涨2倍),29岁/7年/双非一本 , 从13K一次涨到 37K ,逆天改命。
狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由” 。
尼恩技术圣经系列PDF
- 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
- 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
- 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
- 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
- 《大数据HBase学习圣经:一本书实现HBase学习自由》
- 《大数据Flink学习圣经:一本书实现大数据Flink自由》
- 《响应式圣经:10W字,实现Spring响应式编程自由》
- 《Go学习圣经:Go语言实现高并发CRUD业务开发》
……完整版尼恩技术圣经PDF集群,请找尼恩领取