分享好友 维修大全首页 维修大全分类 切换频道

吉日象维修app

淘宝卡顿怎么处理(作为数据库核心成员,如何让淘宝不卡顿?)

2023-10-31630

时间倒转穿越回2007年年底


一觉醒来,我还是照常去上班,走到西溪湿地附近,马路没有,高楼没有,有的是小山坡和金色的稻田。一番打听之后,才知道此时没有什么西溪园区。没办法,硬着头皮去滨江上班,一刷卡,才发现我并不是我,我现在的身份是淘宝数据库团队的核心成员。


此时全国上下在迎接着奥运的到来,一片祥和。淘宝网成交额突破400亿,日活用户达1000万。工程师们都非常兴奋,磨刀霍霍。但是也遇到了棘手的问题。


一 分析当前的现状


1.1 现有业务背景





1.2 当前的问题


1.2.1 用户体验与反馈


用户普遍反馈逛淘宝卡顿,操作延迟特别明显。


1.2.2 分析核心原因








1.2.3 总结问题



当前现状


二 我要做什么?




高筑墙,广积粮,积极做好准备。


提炼核心:


  1. 提高数据库操作速度。
  2. 同时能应对未来规模变化。


三 我能做什么?


为实现以上两大目标,我能做什么?


3.1 提高数据库操作速度,通用方法


提炼常见的通用方法:




下推的目的:提前过滤数据 -> 减少网络传输、并行计算。








等等。


3.2 如何应对未来的持续变化?



3.3 结合定位,分析自己能做的


3.3.1 分析我们的架构定位


(1)大前提




说明:大修改就意味着不稳定,因此:我们要做到尽可能少的修改原来的代码。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。


(2)当前架构现状


淘宝网主要使用hibernate/ibatis传统框架:


初始框架


(3)分析我们的架构定位


淘宝数据库团队当时使用映射框架(hibernate/ibatis)作为数据库交互入库,为了不让他们修改代码,那我们只能在ibatis/hibenate这类映射框架之下。


同时jdbc是与底层数据库交互的Java数据库连接驱动程序,是基础能力,我们要使用它,而不是改造它。


结论:我得把TDDL安插于ibatis/jdbc之间,于是有了第一张架构图:


TDDL的定位


3.4 总结,我们能做什么?



结合我们的目标,通用方法,大前提以及架构定位,分析下我们能做和不能做的。


不能做的:



能做的:





四 我们如何做?


4.1 语法优化


为达到语法优化的目的,我们需要具备什么能力?


简单来说:




专业点来说:语义分析能力。




因此:我们需要设计一个sql解析器,sql优化器。


4.1.1 解析器


解析器的核心是词法分析、语法语义分析,也就是说来了一条
select/update/insert/delete语句,你能认识它,而且你知道下一步该怎么处理,同时为后面的优化器打下基础。


核心:将sql解析为一棵语法树。


例:


SELECT id, member_id FROM wp_image WHERE member_id = ‘123’



sql语法树:



4.1.2 优化器


核心:




(1)语法优化



a. id = 1 + 1  => id = 2



1 = 1 and id = 1 => id = 10 = 1 and id = 1 => 空结果



id > 1 or id < 5 => 永真式id > 1 and id = 3 => id = 3



id = ‘1’  => id为数字类型,自动Long.valueof(1)create=‘2015-02-14 12:12:12’ => create为timestamp类型,解析为时间类型


(2)下推优化



select from (A) o where o.id = 1=>select from (A.query(id = 1))


说明:提前条件过滤,提前获取数据,减少后期计算/IO/网络成本。



A join B on A.id = B.id where A.name = 1 and B.title = 2=> A.query(name = 1) join B.query(title = 2) on A.id = B.id


说明:提前过滤,减轻后期join计算成本,达到“小表驱动”的目的。



A join B on A.id = B.id where A.id = 1 => B.id = 1=> A join B.query(B.id=1) on A.id = B.id


说明:同理,提前过滤。


4.1.3 总结








4.2 分表分库


单库单表的问题:


几年前,业务简单,应用的数据比较少,表结构也不复杂。只有一个数据库,数据库中的表是一张完整的表。而到了今天,2007年了,业务复杂起来了,数据量爆增,单表数据破千万甚至上亿条,一条DML语句,死慢死慢的。这种情况下加索引已不再有显著的效果。


这个时候,数据库效率瓶颈不是靠加索引,sql优化能搞定的。


正确出路:分表分库,通过将表拆分,来降低单表数据量,进而提高数据库操作效率。


分表分为:



分库分为:



由于TDDL不参与业务,而垂直分库分表是强业务相关的,因此TDDL暂不参与垂直分库分表,只在水平分库分表方向上努力。


4.2.1 垂直分表


垂直拆分是将一张表垂直拆成多个表。往往是把常用的列独立成一张主表。不常用的列以及特别长的列拆分成另一张拓展表。


简单垂直分表举例

核心要素:





它带来的提升是:




4.2.2 水平分表


水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。


简单水平分表举例


简单点的技巧:按照枚举类型区分。


作用总结:




4.2.3 垂直分库


垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。


垂直分库


作用总结:






4.2.4 水平分库(TDDL 核心)


水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。


水平分库

作用总结:



水平分库核心要解决的问题:






4.2.5 水平分库——问题解决


(1)自动路由算法


sql转发:在水平拆分后,数据被分散到多张表里。原来的一个sql需要拆解,进行转发路由。


例:


select * from tb1 where member_id in ('test1234', 'pavaretti17', 'abcd');=>select * from tb1 where member_id in ('test1234', 'pavaretti17', 'abcd');select * from tb1 where member_id in ('abcd');


拆分表的数据访问——SQL转发


其中拆分和寻找的算法:怎么知道对应哪个表?即自动路由算法。常见的有:固定哈希算法和一致性哈希算法。


a)固定哈希算法



b)一致性哈希算法


一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。


一致性哈希算法的优势:





由于一致性哈希算法的优势,此算法几乎是所有分布式场景下使用的方案,包括mysql的分布式、redis的分布式等。



(2) 结果合并



升华:引入fork-Join,提升操作速度(多线程并发重点场景,代码中也很常用哦)。




(3)全局唯一主键


算法:基于数据库更新+内存分配。在数据库中维护一个ID,获取下一个ID时,会对数据库进行ID=ID+100 WHERE ID=XX,拿到100个ID后,在内存中进行分配。



例:


水平分库分表:一拆三场景。主键分隔值:1000。







这种产生全局唯一id的方式相当有效,保证基本的全局唯一特性和高性能的同时,可以对生成id的数据库分机架分机房部署达到容灾的目的。


4.2.6 分表分库总结


架构师角度:








个人开发角度:



之所以先垂直拆分才水平拆分,是因为垂直拆分后数据业务清晰而且单一,更加方便指定水平的标准。


4.3 分布式化


分布式化是大潮,是大规模服务器最后都要走的一步。


分布式数据库架构演变


4.3.1 读写分离


设计读写分离的数据库,有两大意义:




说明:myisam查询效率高于默认的innodb效率。参考:myisam和innodb的区别。



核心问题:




4.3.2 容灾


主备倒换:提高可靠性 > 应对个别数据库宕机场景,尤其主库宕机。


主备倒换


说明:DB2主库宕机后,自动将主库转为DB3。


核心问题:




4.3.3 数据备份与同步


当只有单机或者一份数据时,一但数据库出问题,那么整体服务将不可用,而且更严重的是会造成数据损害丢失不可逆。


在读写分离与主备倒换的场景下,核心要解决的是多个数据库的数据同步与备份问题。


当前主流的是采用日志备份方式(redis也类似)。


实现原理:binlog日志备份。


数据备份:bin-log同步


说明:





4.3.4 动态扩容


动态扩容的意义在于:随着后期业务量增大,数据库个数可以通过增多的方式来应对,而相对的改造代价很小。


扩容前:



扩容后:



核心内容:








五 架构成型


sql流向


下图介绍sql从流入TDD到流入数据库,期间TDDL各模块对Sql的处理。



架构图



下图介绍了TDDL三层的位置以及作用。



核心能力图


TDDL 核心能力,核心组建示意图,其中标出了各模块核心要解决功能,核心算法等。

举报
打赏
打赏主播是什么意思
打赏主播是指观众(用户)在观看网络直播节目时,自愿通过直播平台提供的支付渠道,将一定数额的金钱或虚拟礼物赠送给主播的行为

0评论2025-03-26870

主打是什么意思
“主打” 这个词常见的有以下几种意思:一、在商业、产品领域主要营销、重点推广当我们说某产品是公司的 “主打产品” 时,是指

0评论2025-03-26636

电台路是什么意思
“电台路” 通常是因与电台相关的因素而得名的道路,以下是一些具体例子:上海电台路:位于宝山区顾村镇,呈南北走向,南起宝安

0评论2025-03-26335

打狙的窍门是什么意思
“打狙的窍门” 通常是指在射击游戏或实际射击场景中,使用狙击步枪时能够提高射击准确性、效率和生存能力等的一些技巧和方法。

0评论2025-03-26647

路上的创作原声是什么意思
“路上的创作原声” 通常是指以 “在路上” 的状态、经历、感悟等为主题或灵感来源而创作的原始声音作品,在不同艺术领域有不同

0评论2025-03-26375

打印照片回执是什么意思
打印照片回执是指在完成照片拍摄并经相关系统审核通过后,将记录照片合格信息以及个人身份等相关内容的电子凭证,通过打印机输出

0评论2025-03-26283

棒打鸳鸯是什么意思
“棒打鸳鸯” 是一个汉语成语,意思是用木棒打散一对鸳鸯,比喻拆散恩爱的夫妻或情侣。该成语的来源和用法如下:来源与出处:出

0评论2025-03-26672

主打三棺是什么意思
“主打三棺” 是一种网络用语,用反语的方式讽刺人们没有正常的思维观念和底线。该梗起源于贴吧网友之间的讽刺话语,具体出自抗

0评论2025-03-26220

常用香料是什么意思
常用香料是指在烹饪、食品加工、香水制作、药品生产等领域中经常使用的具有独特香气和味道的物质。它们可以增添风味、改善气味、

0评论2025-03-26963

潮汕话香芋是什么意思
在潮汕话中,“香芋” 通常指的就是芋头。不过,潮汕方言中芋头的发音是 “麦筲”(mài shāo)。芋头在潮汕地区的饮食文化和民

0评论2025-03-26504

关于我们  |  网站留言
(c)2026 吉日象维修app www.mykuaidi.com