当前位置:首页 » 编程语言 » sql双写

sql双写

发布时间: 2024-05-12 23:16:13

A. 基于spark sql之上的检索与排序对比性能测试

之前做过一年的spark研发,之前在阿里与腾讯也做了很久的hive,所以对这方面比较了解。

第一:其实快多少除了跟spark与hive本身的技术实现外,也跟机器性能,底层操作系统的参数优化息息相关,不能一概而论。

第二:hive 目前应该还是业界的主流,毕竟快与慢很多时候并非是至关重要的,对于一个生产系统来说,更重要的应该是稳定性,spark毕竟还算是比较新兴的事务,快确实快,但是稳定性上距离hive相差甚远。关于spark我们也修复了很多关于内存泄露的BUG,因为您问的是性能,所以不过多介绍(可以跟我要YDB编程指南,里面有我对这些BUG的修正)

第三:关于性能,我测试的可能不够全面,只能在排序与检索过滤上提供我之前的基于YDB的BLOCK sort测试报告供您参考(网络上贴word太费劲,您可以跟我要 word文档)。

排序可以说是很多日志系统的硬指标(如按照时间逆序排序),如果一个大数据系统不能进行排序,基本上是这个系统属于不可用状态,排序算得上是大数据系统的一个“刚需”,无论大数据采用的是hadoop,还是spark,还是impala,hive,总之排序是必不可少的,排序的性能测试也是必不可少的。
有着计算奥运会之称的Sort Benchmark全球排序每年都会举行一次,每年巨头都会在排序上进行巨大的投入,可见排序速度的高低有多么重要!但是对于大多数企业来说,动辄上亿的硬件投入,实在划不来、甚至远远超出了企业的项目预算。相比大数据领域的暴力排序有没有一种更廉价的实现方式?

在这里,我们为大家介绍一种新的廉价排序方法,我们称为blockSort。

500G的数据300亿条数据,只使用4台 16核,32G内存,千兆网卡的虚拟机即可实现 2~15秒的 排序 (可以全表排序,也可以与任意筛选条件筛选后排序)。

一、基本的思想是这样的,如下图所示:

1.将数据按照大小预先划分好,如划分成 大、中、小三个块(block)。

2.如果想找最大的数据,那么只需要在最大的那个块里去找就可以了。

3.这个快还是有层级结构的,如果每个块内的数据量很多,可以到下面的子快内进行继续查找,可以分多个层进行排序。

4.采用这种方法,一个亿万亿级别的数据(如long类型),最坏最坏的极端情况也就进行2048次文件seek就可以筛选到结果。

五、哪些用户适合使用YDB?


1.传统关系型数据,已经无法容纳更多的数据,查询效率严重受到影响的用户。

2.目前在使用SOLR、ES做全文检索,觉得solr与ES提供的分析功能太少,无法完成复杂的业务逻辑,或者数据量变多后SOLR与ES变得不稳定,在掉片与均衡中不断恶性循环,不能自动恢复服务,运维人员需经常半夜起来重启集群的情况。

3.基于对海量数据的分析,但是苦于现有的离线计算平台的速度和响应时间无满足业务要求的用户。

4.需要对用户画像行为类数据做多维定向分析的用户。

5.需要对大量的UGC(User Generate Content)数据进行检索的用户。

6.当你需要在大数据集上面进行快速的,交互式的查询时。

7.当你需要进行数据分析,而不只是简单的键值对存储时。

8.当你想要分析实时产生的数据时。


ps:说了一大堆,说白了最适合的还是踪迹分析因为数据量大,数据还要求实时,查询还要求快。这才是关键。

B. 如何编写一个分布式数据库

某种程度上看来,数据库作为整个系统的核心,这句话其实并不夸张,数据库的选型关系到上层业务代码实现的方方面面,现在比较流行的架构方案是上层业务逻辑微服务化,并且结合分布式缓存,这套框架已经基本能做到上层业务的弹性扩展,但是最底层的数据存储还是很难去中心化(除非整个技术栈中去除关系型数据库(RDBMS), 全部采用 NoSQL)。所以,经常是 RDBMS 成为整个系统的瓶颈。
在长期的斗争中,大家总结出了很多方式来扩展最底层的关系型数据库:
1. 主从,一主多从,双写,通过队列暂存请求... 这些方案其实并没有解决问题,写入仍然是单点,而且对于 DBA 的挑战比较大,今天我们暂时就不讨论了。
2. 通过中间件 Sharding,常见的开源方案有: Cobar, TDDL, Vitess, Kingshard, MyCat 等,这些方案的思路是拦截 SQL 的请求通过 sharding key 和一定规则,将请求转发/广播到不同的 MySQL 实例上,从而实现水平扩展的效果,这个方案基本解决了单点写入的问题,对于业务来说整体的吞吐也上来了,看上去不错,这个方案是大多数业务遇到性能瓶颈的解决方案,但是缺点也是有的:
1)大多中间件都没有解决动态扩容的问题,多采用了静态的路由策略,扩容一般还处于人工 x2 的状态,对 DBA 要求比较高。
2)从一定程度上来说都放弃了事务,这是由于一条语句有可能会涉及到多个数据库实例,实现分布式 事务是一个比较难的事情,我们后面会详细的介绍。
3)对业务不透明,需要指定 sharding key, 心智负担较大

C. 缁忓吀濂芥枃--濡备綍淇濊瘉缂揿瓨鍜屾暟鎹搴撶殑鍙屽啓涓镊存



闱㈣瘯棰桦备綍淇濊瘉缂揿瓨涓庢暟鎹搴撶殑鍙屽啓涓镊存э纻

闱㈣瘯瀹桦绩鐞嗗垎鏋愪綘鍙瑕佺敤缂揿瓨锛屽氨鍙鑳戒细娑夊强鍒扮紦瀛树笌鏁版嵁搴揿弻瀛桦偍鍙屽啓锛屼綘鍙瑕佹槸鍙屽啓锛屽氨涓瀹氢细链夋暟鎹涓镊存х殑闂棰桡纴闾d箞浣犲备綍瑙e喅涓镊存ч梾棰桡纻

闱㈣瘯棰桦墫鏋愪竴鑸𨱒ヨ达纴濡傛灉鍏佽哥紦瀛桦彲浠ョ◢寰镄勮窡鏁版嵁搴揿伓灏旀湁涓崭竴镊寸殑𨱍呭喌锛屼篃灏辨槸璇村傛灉浣犵殑绯荤粺涓嶆槸涓ユ牸瑕佹眰“缂揿瓨+鏁版嵁搴” 蹇呴’淇濇寔涓镊存х殑璇濓纴链濂戒笉瑕佸仛杩欎釜鏂规堬纴鍗筹细璇昏锋眰鍜屽啓璇锋眰涓茶屽寲锛屼覆鍒颁竴涓鍐呭瓨阒熷垪閲屽幓銆

涓茶屽寲鍙浠ヤ缭璇佷竴瀹氢笉浼氩嚭鐜颁笉涓镊寸殑𨱍呭喌锛屼絾鏄瀹冧篃浼氩艰嚧绯荤粺镄勫闷钖愰噺澶у箙搴﹂檷浣庯纴鐢ㄦ瘆姝e父𨱍呭喌涓嫔氩嚑鍊岖殑链哄櫒铡绘敮鎾戠嚎涓婄殑涓涓璇锋眰銆

Cache Aside Pattern链缁忓吀镄勭紦瀛+鏁版嵁搴撹诲啓镄勬ā寮忥纴灏辨槸 Cache Aside Pattern銆

璇荤殑镞跺欙纴鍏堣荤紦瀛桡纴缂揿瓨娌℃湁镄勮瘽锛屽氨璇绘暟鎹搴掳纴铹跺悗鍙栧嚭鏁版嵁钖庢斁鍏ョ紦瀛桡纴钖屾椂杩斿洖鍝嶅簲銆傛洿鏂扮殑镞跺欙纴鍏堟洿鏂版暟鎹搴掳纴铹跺悗鍐嶅垹闄ょ紦瀛樸备负浠涔堟槸鍒犻櫎缂揿瓨锛岃屼笉鏄镟存柊缂揿瓨锛

铡熷洜寰堢亩鍗曪纴寰埚氭椂鍊欙纴鍦ㄥ嶆潅镣圭殑缂揿瓨鍦烘櫙锛岀紦瀛树笉鍗曞崟鏄鏁版嵁搴扑腑鐩存帴鍙栧嚭𨱒ョ殑鍊笺

姣斿傚彲鑳芥洿鏂颁简镆愪釜琛ㄧ殑涓涓瀛楁碉纴铹跺悗鍏跺瑰簲镄勭紦瀛桡纴鏄闇瑕佹煡璇㈠彟澶栦袱涓琛ㄧ殑鏁版嵁骞惰繘琛岃繍绠楋纴镓嶈兘璁$畻鍑虹紦瀛樻渶鏂扮殑鍊肩殑銆

鍙﹀栨洿鏂扮紦瀛樼殑浠d环链夋椂鍊欐槸寰堥珮镄勚傛槸涓嶆槸璇达纴姣忔′慨鏀规暟鎹搴撶殑镞跺欙纴閮戒竴瀹氲佸皢鍏跺瑰簲镄勭紦瀛樻洿鏂颁竴浠斤纻涔熻告湁镄勫満鏅鏄杩欐牱锛屼絾鏄瀵逛簬姣旇缉澶嶆潅镄勭紦瀛樻暟鎹璁$畻镄勫満鏅锛屽氨涓嶆槸杩欐牱浜嗐傚傛灉浣犻戠箒淇鏀逛竴涓缂揿瓨娑夊强镄勫氢釜琛锛岀紦瀛树篃棰戠箒镟存柊銆备絾鏄闂棰桦湪浜庯纴杩欎釜缂揿瓨鍒板簳浼氢笉浼氲棰戠箒璁块梾鍒帮纻

涓句釜镙楀瓙锛屼竴涓缂揿瓨娑夊强镄勮〃镄勫瓧娈碉纴鍦 1 鍒嗛挓鍐呭氨淇鏀逛简 20 娆★纴鎴栬呮槸 100 娆★纴闾d箞缂揿瓨镟存柊 20 娆°100 娆★绂浣嗘槸杩欎釜缂揿瓨鍦 1 鍒嗛挓鍐呭彧琚璇诲彇浜 1 娆★纴链夊ぇ閲忕殑鍐锋暟鎹銆傚疄闄呬笂锛屽傛灉浣犲彧鏄鍒犻櫎缂揿瓨镄勮瘽锛岄偅涔埚湪 1 鍒嗛挓鍐咃纴杩欎釜缂揿瓨涓嶈繃灏遍吨鏂拌$畻涓娆¤屽凡锛屽紑阌澶у箙搴﹂檷浣庛傜敤鍒扮紦瀛樻墠铡荤畻缂揿瓨銆

鍏跺疄鍒犻櫎缂揿瓨锛岃屼笉鏄镟存柊缂揿瓨锛屽氨鏄涓涓 lazy 璁$畻镄勬濇兂锛屼笉瑕佹疮娆¢兘閲嶆柊锅氩嶆潅镄勮$畻锛屼笉绠″畠浼氢笉浼氱敤鍒帮纴钥屾槸璁╁畠鍒伴渶瑕佽浣跨敤镄勬椂鍊椤啀閲嶆柊璁$畻銆傚儚 mybatis锛宧ibernate锛岄兘链夋噿锷犺浇镐濇兂銆傛煡璇涓涓閮ㄩ棬锛岄儴闂ㄥ甫浜嗕竴涓锻桦伐镄 list锛屾病链夊繀瑕佽存疮娆℃煡璇㈤儴闂锛岄兘閲岄溃镄 1000 涓锻桦伐镄勬暟鎹涔熷悓镞舵煡鍑烘潵鍟娿80% 镄勬儏鍐碉纴镆ヨ繖涓閮ㄩ棬锛屽氨鍙鏄瑕佽块梾杩欎釜閮ㄩ棬镄勪俊鎭灏卞彲浠ヤ简銆傚厛镆ラ儴闂锛屽悓镞惰佽块梾閲岄溃镄勫憳宸ワ纴闾d箞杩欎釜镞跺椤彧链夊湪浣犺佽块梾閲岄溃镄勫憳宸ョ殑镞跺欙纴镓崭细铡绘暟鎹搴挞噷闱㈡煡璇 1000 涓锻桦伐銆

链鍒濈骇镄勭紦瀛树笉涓镊撮梾棰桦强瑙e喅鏂规堥梾棰桡细鍏堜慨鏀规暟鎹搴掳纴鍐嶅垹闄ょ紦瀛樸傚傛灉鍒犻櫎缂揿瓨澶辫触浜嗭纴闾d箞浼氩艰嚧鏁版嵁搴扑腑鏄鏂版暟鎹锛岀紦瀛树腑鏄镞ф暟鎹锛屾暟鎹灏卞嚭鐜颁简涓崭竴镊淬



瑙e喅镐濊矾锛氩厛鍒犻櫎缂揿瓨锛屽啀淇鏀规暟鎹搴撱傚傛灉鏁版嵁搴扑慨鏀瑰け璐ヤ简锛岄偅涔堟暟鎹搴扑腑鏄镞ф暟鎹锛岀紦瀛树腑鏄绌虹殑锛岄偅涔堟暟鎹涓崭细涓崭竴镊淬傚洜涓鸿荤殑镞跺欑紦瀛樻病链夛纴鍒栾绘暟鎹搴扑腑镞ф暟鎹锛岀劧钖庢洿鏂板埌缂揿瓨涓銆

姣旇缉澶嶆潅镄勬暟鎹涓崭竴镊撮梾棰桦垎鏋愭暟鎹鍙戠敓浜嗗彉镟达纴鍏埚垹闄や简缂揿瓨锛岀劧钖庤佸幓淇鏀规暟鎹搴掳纴姝ゆ椂杩樻病淇鏀广备竴涓璇锋眰杩囨潵锛屽幓璇荤紦瀛桡纴鍙戠幇缂揿瓨绌轰简锛屽幓镆ヨ㈡暟鎹搴掳纴镆ュ埌浜嗕慨鏀瑰墠镄勬棫鏁版嵁锛屾斁鍒颁简缂揿瓨涓銆傞殢钖庢暟鎹鍙樻洿镄勭▼搴忓畬鎴愪简鏁版嵁搴撶殑淇鏀广傚畬浜嗭纴鏁版嵁搴揿拰缂揿瓨涓镄勬暟鎹涓崭竴镙蜂简...

涓轰粈涔堜笂浜挎祦閲忛珮骞跺彂鍦烘櫙涓嬶纴缂揿瓨浼氩嚭鐜拌繖涓闂棰桡纻

鍙链夊湪瀵逛竴涓鏁版嵁鍦ㄥ苟鍙戠殑杩涜岃诲啓镄勬椂鍊欙纴镓嶅彲鑳戒细鍑虹幇杩欑嶉梾棰樸傚叾瀹炲傛灉璇翠綘镄勫苟鍙戦噺寰堜绠镄勮瘽锛岀壒鍒鏄璇诲苟鍙戝緢浣庯纴姣忓ぉ璁块梾閲忓氨 1 涓囨★纴闾d箞寰埚皯镄勬儏鍐典笅锛屼细鍑虹幇鍒氭墠鎻忚堪镄勯偅绉崭笉涓镊寸殑鍦烘櫙銆备絾鏄闂棰樻槸锛屽傛灉姣忓ぉ镄勬槸涓娄嚎镄勬祦閲忥纴姣忕掑苟鍙戣绘槸鍑犱竾锛屾疮绉掑彧瑕佹湁鏁版嵁镟存柊镄勮锋眰锛屽氨鍙鑳戒细鍑虹幇涓婅堪镄勬暟鎹搴+缂揿瓨涓崭竴镊寸殑𨱍呭喌銆

瑙e喅鏂规埚备笅锛

镟存柊鏁版嵁镄勬椂鍊欙纴镙规嵁鏁版嵁镄勫敮涓镙囱瘑锛屽皢镎崭綔璺鐢变箣钖庯纴鍙戦佸埌涓涓 jvm 鍐呴儴阒熷垪涓銆傝诲彇鏁版嵁镄勬椂鍊欙纴濡傛灉鍙戠幇鏁版嵁涓嶅湪缂揿瓨涓锛岄偅涔埚皢閲嶆柊璇诲彇鏁版嵁+镟存柊缂揿瓨镄勬搷浣滐纴镙规嵁鍞涓镙囱瘑璺鐢变箣钖庯纴涔熷彂阃佸悓涓涓 jvm 鍐呴儴阒熷垪涓銆

涓涓阒熷垪瀵瑰簲涓涓宸ヤ綔绾跨▼锛屾疮涓宸ヤ綔绾跨▼涓茶屾嬁鍒板瑰簲镄勬搷浣滐纴铹跺悗涓𨱒′竴𨱒$殑镓ц屻傝繖镙风殑璇濓纴涓涓鏁版嵁鍙樻洿镄勬搷浣滐纴鍏埚垹闄ょ紦瀛桡纴铹跺悗鍐嶅幓镟存柊鏁版嵁搴掳纴浣嗘槸杩樻病瀹屾垚镟存柊銆傛ゆ椂濡傛灉涓涓璇昏锋眰杩囨潵锛岃诲埌浜嗙┖镄勭紦瀛桡纴闾d箞鍙浠ュ厛灏嗙紦瀛樻洿鏂扮殑璇锋眰鍙戦佸埌阒熷垪涓锛屾ゆ椂浼氩湪阒熷垪涓绉铡嬶纴铹跺悗钖屾ョ瓑寰呯紦瀛樻洿鏂板畬鎴愩

杩欓噷链変竴涓浼桦寲镣癸纴涓涓阒熷垪涓锛屽叾瀹炲氢釜镟存柊缂揿瓨璇锋眰涓插湪涓璧锋槸娌℃剰涔夌殑锛屽洜姝ゅ彲浠ュ仛杩囨护锛屽傛灉鍙戠幇阒熷垪涓宸茬粡链変竴涓镟存柊缂揿瓨镄勮锋眰浜嗭纴闾d箞灏变笉鐢ㄥ啀鏀句釜镟存柊璇锋眰镎崭綔杩涘幓浜嗭纴鐩存帴绛夊緟鍓嶉溃镄勬洿鏂版搷浣滆锋眰瀹屾垚鍗冲彲銆

寰呴偅涓阒熷垪瀵瑰簲镄勫伐浣灭嚎绋嫔畬鎴愪简涓娄竴涓镎崭綔镄勬暟鎹搴撶殑淇鏀逛箣钖庯纴镓崭细铡绘墽琛屼笅涓涓镎崭綔锛屼篃灏辨槸缂揿瓨镟存柊镄勬搷浣滐纴姝ゆ椂浼氢粠鏁版嵁搴扑腑璇诲彇链鏂扮殑鍊硷纴铹跺悗鍐椤叆缂揿瓨涓銆

濡傛灉璇锋眰杩桦湪绛夊緟镞堕棿锣冨洿鍐咃纴涓嶆柇杞璇㈠彂鐜板彲浠ュ彇鍒板间简锛岄偅涔埚氨鐩存帴杩斿洖锛涘傛灉璇锋眰绛夊緟镄勬椂闂磋秴杩囦竴瀹氭椂闀匡纴闾d箞杩欎竴娆$洿鎺ヤ粠鏁版嵁搴扑腑璇诲彇褰揿墠镄勬棫鍊笺

楂桦苟鍙戠殑鍦烘櫙涓嬶纴璇ヨВ鍐虫柟妗堣佹敞镒忕殑闂棰桡细

璇昏锋眰闀挎椂阒诲炵敱浜庤昏锋眰杩涜屼简闱炲父杞诲害镄勫纾姝ュ寲锛屾墍浠ヤ竴瀹氲佹敞镒忚昏秴镞剁殑闂棰桡纴姣忎釜璇昏锋眰蹇呴’鍦ㄨ秴镞舵椂闂磋寖锲村唴杩斿洖銆

璇ヨВ鍐虫柟妗堬纴链澶х殑椋庨橹镣瑰湪浜庤达纴鍙鑳芥暟鎹镟存柊寰堥戠箒锛屽艰嚧阒熷垪涓绉铡嬩简澶ч噺镟存柊镎崭綔鍦ㄩ噷闱锛岀劧钖庤昏锋眰浼氩彂鐢熷ぇ閲忕殑瓒呮椂锛屾渶钖庡艰嚧澶ч噺镄勮锋眰鐩存帴璧版暟鎹搴撱傚姟蹇呴氲繃涓浜涙ā𨰾熺湡瀹炵殑娴嬭瘯锛岀湅鐪嬫洿鏂版暟鎹镄勯戠巼鏄镐庢牱镄勚

鍙﹀栦竴镣癸纴锲犱负涓涓阒熷垪涓锛屽彲鑳戒细绉铡嬮拡瀵瑰氢釜鏁版嵁椤圭殑镟存柊镎崭綔锛屽洜姝ら渶瑕佹牴鎹镊宸辩殑涓氩姟𨱍呭喌杩涜屾祴璇曪纴鍙鑳介渶瑕侀儴缃插氢釜链嶅姟锛屾疮涓链嶅姟鍒嗘憡涓浜涙暟鎹镄勬洿鏂版搷浣溿傚傛灉涓涓鍐呭瓨阒熷垪閲屽眳铹朵细鎸ゅ帇 100 涓鍟嗗搧镄勫簱瀛树慨鏀规搷浣滐纴姣忛殧搴揿瓨淇鏀规搷浣滆佽楄垂 10ms 铡诲畬鎴愶纴闾d箞链钖庝竴涓鍟嗗搧镄勮昏锋眰锛屽彲鑳界瓑寰 10 * 100 = 1000ms = 1s 钖庯纴镓嶈兘寰楀埌鏁版嵁锛岃繖涓镞跺椤氨瀵艰嚧璇昏锋眰镄勯暱镞堕樆濉炪

涓瀹氲佸仛镙规嵁瀹为檯涓氩姟绯荤粺镄勮繍琛屾儏鍐碉纴铡昏繘琛屼竴浜涘帇锷涙祴璇曪纴鍜屾ā𨰾熺嚎涓婄幆澧冿纴铡荤湅鐪嬫渶绻佸繖镄勬椂鍊欙纴鍐呭瓨阒熷垪鍙鑳戒细鎸ゅ帇澶氩皯镟存柊镎崭綔锛屽彲鑳戒细瀵艰嚧链钖庝竴涓镟存柊镎崭綔瀵瑰簲镄勮昏锋眰锛屼细 hang 澶氩皯镞堕棿锛屽傛灉璇昏锋眰鍦 200ms 杩斿洖锛屽傛灉浣犺$畻杩囧悗锛屽摢镐曟槸链绻佸繖镄勬椂鍊欙纴绉铡 10 涓镟存柊镎崭綔锛屾渶澶氱瓑寰 200ms锛岄偅杩桦彲浠ョ殑銆

濡傛灉涓涓鍐呭瓨阒熷垪涓鍙鑳界Н铡嬬殑镟存柊镎崭綔鐗瑰埆澶氾纴闾d箞浣犲氨瑕佸姞链哄櫒锛岃╂疮涓链哄櫒涓婇儴缃茬殑链嶅姟瀹炰緥澶勭悊镟村皯镄勬暟鎹锛岄偅涔堟疮涓鍐呭瓨阒熷垪涓绉铡嬬殑镟存柊镎崭綔灏变细瓒婂皯銆

鍏跺疄镙规嵁涔嫔墠镄勯”鐩缁忛獙锛屼竴鑸𨱒ヨ达纴鏁版嵁镄勫啓棰戠巼鏄寰堜绠镄勶纴锲犳ゅ疄闄呬笂姝e父𨱒ヨ达纴鍦ㄩ槦鍒椾腑绉铡嬬殑镟存柊镎崭綔搴旇ユ槸寰埚皯镄勚傚儚杩欑嶉拡瀵硅婚珮骞跺彂銆佽荤紦瀛樻灦鏋勭殑椤圭洰锛屼竴鑸𨱒ヨ村啓璇锋眰鏄闱炲父灏戠殑锛屾疮绉掔殑 QPS 鑳藉埌鍑犵栌灏变笉阌欎简銆

鎴戜滑𨱒ュ疄闄呯矖鐣ユ祴绠椾竴涓嬨

濡傛灉涓绉掓湁 500 镄勫啓镎崭綔锛屽傛灉鍒嗘垚 5 涓镞堕棿鐗囷纴姣 200ms 灏 100 涓鍐欐搷浣滐纴鏀惧埌 20 涓鍐呭瓨阒熷垪涓锛屾疮涓鍐呭瓨阒熷垪锛屽彲鑳藉氨绉铡 5 涓鍐欐搷浣溿傛疮涓鍐欐搷浣沧ц兘娴嬭瘯钖庯纴涓鑸鏄鍦 20ms 宸﹀彸灏卞畬鎴愶纴闾d箞阍埚规疮涓鍐呭瓨阒熷垪镄勬暟鎹镄勮昏锋眰锛屼篃灏辨渶澶 hang 涓浼氩効锛200ms 浠ュ唴镶瀹氲兘杩斿洖浜嗐

缁忚繃鍒氭墠绠鍗旷殑娴嬬畻锛屾垜浠鐭ラ亾锛屽崟链烘敮鎾戠殑鍐 QPS 鍦ㄥ嚑锏炬槸娌¢梾棰樼殑锛屽傛灉鍐 QPS 镓╁ぇ浜 10 鍊嶏纴闾d箞灏辨墿瀹规満鍣锛屾墿瀹 10 鍊岖殑链哄櫒锛屾疮涓链哄櫒 20 涓阒熷垪銆

璇昏锋眰骞跺彂閲忚繃楂樿繖閲岃缮蹇呴’锅氩ソ铡嫔姏娴嬭瘯锛岀‘淇濇伆宸х颁笂涓婅堪𨱍呭喌镄勬椂鍊欙纴杩樻湁涓涓椋庨橹锛屽氨鏄绐佺劧闂村ぇ閲忚昏锋眰浼氩湪鍑犲崄姣绉掔殑寤舵椂 hang 鍦ㄦ湇锷′笂锛岀湅链嶅姟鑳戒笉鑳芥墰镄勪綇锛岄渶瑕佸氩皯链哄櫒镓嶈兘镓涗綇链澶х殑鏋侀檺𨱍呭喌镄勫嘲鍊笺

浣嗘槸锲犱负骞朵笉鏄镓链夌殑鏁版嵁閮藉湪钖屼竴镞堕棿镟存柊锛岀紦瀛树篃涓崭细钖屼竴镞堕棿澶辨晥锛屾墍浠ユ疮娆″彲鑳戒篃灏辨槸灏戞暟鏁版嵁镄勭紦瀛桦け鏁堜简锛岀劧钖庨偅浜涙暟鎹瀵瑰簲镄勮昏锋眰杩囨潵锛屽苟鍙戦噺搴旇ヤ篃涓崭细鐗瑰埆澶с

澶氭湇锷″疄渚嬮儴缃茬殑璇锋眰璺鐢卞彲鑳借繖涓链嶅姟閮ㄧ讲浜嗗氢釜瀹炰緥锛岄偅涔埚繀椤讳缭璇佽达纴镓ц屾暟鎹镟存柊镎崭綔锛屼互鍙婃墽琛岀紦瀛樻洿鏂版搷浣灭殑璇锋眰锛岄兘阃氲繃 Nginx 链嶅姟鍣ㄨ矾鐢卞埌鐩稿悓镄勬湇锷″疄渚嬩笂銆

姣斿傝达纴瀵瑰悓涓涓鍟嗗搧镄勮诲啓璇锋眰锛屽叏閮ㄨ矾鐢卞埌钖屼竴鍙版満鍣ㄤ笂銆傚彲浠ヨ嚜宸卞幓锅氭湇锷¢棿镄勬寜镦ф煇涓璇锋眰鍙傛暟镄 hash 璺鐢憋纴涔熷彲浠ョ敤 Nginx 镄 hash 璺鐢卞姛鑳界瓑绛夈

鐑镣瑰晢鍝佺殑璺鐢遍梾棰桡纴瀵艰嚧璇锋眰镄勫炬枩涓囦竴镆愪釜鍟嗗搧镄勮诲啓璇锋眰鐗瑰埆楂桡纴鍏ㄩ儴镓揿埌鐩稿悓镄勬満鍣ㄧ殑鐩稿悓镄勯槦鍒楅噷闱㈠幓浜嗭纴鍙鑳戒细阃犳垚镆愬彴链哄櫒镄勫帇锷涜繃澶с傚氨鏄璇达纴锲犱负鍙链夊湪鍟嗗搧鏁版嵁镟存柊镄勬椂鍊欐墠浼氭竻绌虹紦瀛桡纴铹跺悗镓崭细瀵艰嚧璇诲啓骞跺彂锛屾墍浠ュ叾瀹炶佹牴鎹涓氩姟绯荤粺铡荤湅锛屽傛灉镟存柊棰戠巼涓嶆槸澶楂樼殑璇濓纴杩欎釜闂棰樼殑褰卞搷骞朵笉鏄鐗瑰埆澶э纴浣嗘槸镄勭‘鍙鑳芥煇浜涙満鍣ㄧ殑璐熻浇浼氶珮涓浜涖--------------------- 浣滆咃细浣犳槸鎴戠殑娴峰暩 𨱒ユ簮锛欳SDN 铡熸枃锛歨ttps://blog.csdn.net/chang384915878/article/details/86756463 鐗堟潈澹版槑锛氭湰鏂囦负鍗氢富铡熷垱鏂囩珷锛岃浆杞借烽梼涓婂崥鏂囬摼鎺ワ紒
缁忓吀濂芥枃--濡备綍淇濊瘉缂揿瓨鍜屾暟鎹搴撶殑鍙屽啓涓镊存
镙囩撅细鍗曟満涓鏁版瘆杈冭疆璇ash镎崭綔csdn璇曢樿$畻

D. 銆愯浆杞姐戞暟鎹搴撹蒋浠舵灦鏋勮捐′簺浠涔



缂樿捣锛氩弹@钀х敯锲 钀ф婚个璇凤纴涓婂懆浜旀櫄涓婂湪钬滈珮鏁堣繍缁1鍙风兢钬濆唴鍒嗕韩浜嗐58钖屽煄鏁版嵁搴撹蒋浠舵灦鏋勮捐′笌瀹炶返銆嬶纸杩欎釜topic浠婂勾鍦ㄦ暟鎹搴揿ぇ浼氢笂鍒嗕韩杩囷级锛屽簲缁勭粐鏂硅佹眰锛屽彂鍑虹邯瑕併
涓銆佸熀链姒傚康
浜屻佹暟鎹搴撴灦鏋勮捐℃濊矾
锛1锛夊彲鐢ㄦ
锛2锛夎绘ц兘
锛3锛変竴镊存
锛4锛夋墿灞曟
涓銆佸熀链姒傚康
姒傚康涓钬滃崟搴撯

姒傚康浜屸滃垎鐗団

鍒嗙墖瑙e喅镄勬槸钬沧暟鎹閲忓お澶р濈殑闂棰桡纴涔熷氨鏄阃氩父璇寸殑钬沧按骞冲垏鍒嗏濄
涓镞﹀紩鍏ュ垎鐗囷纴锷垮繀链夆沧暟鎹璺鐢扁濈殑姒傚康锛屽摢涓鏁版嵁璁块梾鍝涓搴撱
璺鐢辫勫垯阃氩父链3绉嶆柟娉曪细
锛1锛夎寖锲达细range
浼樼偣锛氱亩鍗曪纴瀹规槗镓╁𪾢
缂虹偣锛氩悇搴揿帇锷涗笉鍧囷纸鏂板彿娈垫洿娲昏穬锛
锛2锛夊搱甯岋细hash
浼樼偣锛氱亩鍗曪纴鏁版嵁鍧囱锛岃礋杞藉潎鍖
缂虹偣锛氲縼绉婚夯鐑︼纸2搴撴墿3搴撴暟鎹瑕佽縼绉伙级
锛3锛夎矾鐢辨湇锷★细router-config-server
浼樼偣锛氱伒娲绘у己锛屼笟锷′笌璺鐢辩畻娉曡В钥
缂虹偣锛氭疮娆¤块梾鏁版嵁搴揿墠澶氢竴娆℃煡璇
澶ч儴鍒嗕簰镵旂绣鍏鍙搁噰鐢ㄧ殑鏂规堜簩锛氩搱甯屽垎搴掳纴鍝埚笇璺鐢
姒傚康涓夆滃垎缁勨

鍒嗙粍瑙e喅钬滃彲鐢ㄦр濋梾棰桡纴鍒嗙粍阃氩父阃氲繃涓讳粠澶嶅埗镄勬柟寮忓疄鐜般
浜掕仈缃戝叕鍙告暟鎹搴揿疄闄呰蒋浠舵灦鏋勬槸锛氩张鍒嗙墖锛屽张鍒嗙粍锛埚备笅锲撅级

浜屻佹暟鎹搴撴灦鏋勮捐℃濊矾
鏁版嵁搴撹蒋浠舵灦鏋勫笀骞虫椂璁捐′簺浠涔堜笢瑗垮憿锛熻呖灏戣佽冭槛浠ヤ笅锲涚偣锛
锛1锛夊备綍淇濊瘉鏁版嵁鍙鐢ㄦ
锛2锛夊备綍鎻愰珮鏁版嵁搴撹绘ц兘锛埚ぇ閮ㄥ垎搴旂敤璇诲氩啓灏戯纴璇讳细鍏堟垚涓虹摱棰堬级
锛3锛夊备綍淇濊瘉涓镊存
锛4锛夊备綍鎻愰珮镓╁𪾢镐
2.1濡备綍淇濊瘉鏁版嵁镄勫彲鐢ㄦэ纻
瑙e喅鍙鐢ㄦч梾棰樼殑镐濊矾鏄=>鍐椾綑
濡备綍淇濊瘉绔欑偣镄勫彲鐢ㄦэ纻澶嶅埗绔欑偣锛屽啑浣欑珯镣
濡备綍淇濊瘉链嶅姟镄勫彲鐢ㄦэ纻澶嶅埗链嶅姟锛屽啑浣欐湇锷
濡备綍淇濊瘉鏁版嵁镄勫彲鐢ㄦэ纻澶嶅埗鏁版嵁锛屽啑浣欐暟鎹
鏁版嵁镄勫啑浣欙纴浼氩甫𨱒ヤ竴涓鍓浣灭敤=>寮曞彂涓镊存ч梾棰桡纸鍏堜笉璇翠竴镊存ч梾棰桡纴鍏堣村彲鐢ㄦэ级
濡备綍淇濊瘉鏁版嵁搴撯滆烩濋珮鍙鐢锛
鍐椾綑璇诲簱

鍐椾綑璇诲簱甯︽潵镄勫坛浣灭敤锛熻诲啓链夊欢镞讹纴鍙鑳戒笉涓镊
涓婇溃杩欎釜锲炬槸寰埚氢簰镵旂绣鍏鍙竚ysql镄勬灦鏋勶纴鍐欎粛铹舵槸鍗旷偣锛屼笉鑳戒缭璇佸啓楂桦彲鐢ㄣ
濡备綍淇濊瘉鏁版嵁搴撯滃啓钬濋珮鍙鐢锛
鍐椾綑鍐椤簱

閲囩敤鍙屼富浜掑囩殑鏂瑰纺锛屽彲浠ュ啑浣椤啓搴
甯︽潵镄勫坛浣灭敤锛熷弻鍐椤悓姝ワ纴鏁版嵁鍙鑳藉啿绐侊纸渚嫔傗滆嚜澧瀒d钬濆悓姝ュ啿绐侊级,濡备綍瑙e喅钖屾ュ啿绐侊纴链変袱绉嶅父瑙佽В鍐虫柟妗堬细
锛1锛変袱涓鍐椤簱浣跨敤涓嶅悓镄勫埯濮嫔硷纴鐩稿悓镄勬ラ暱𨱒ュ炲姞id锛1鍐椤簱镄刬d涓0,2,4,6...锛2鍐椤簱镄刬d涓1,3,5,7?
锛2锛変笉浣跨敤鏁版嵁镄刬d锛屼笟锷″眰镊宸辩敓鎴愬敮涓镄刬d锛屼缭璇佹暟鎹涓嶅啿绐
58钖屽煄娌℃湁浣跨敤涓婅堪涓ょ嶆灦鏋勬潵锅氲诲啓镄勨滈珮鍙鐢ㄢ濓纴58钖屽煄閲囩敤镄勬槸钬滃弻涓诲綋涓讳粠鐢ㄢ濈殑鏂瑰纺锛

浠嶆槸鍙屼富锛屼絾鍙链変竴涓涓绘彁渚涙湇锷★纸璇+鍐欙级锛屽彟涓涓涓绘槸钬渟hadow-master钬濓纴鍙鐢ㄦ潵淇濊瘉楂桦彲鐢锛屽钩镞朵笉鎻愪緵链嶅姟銆
master鎸备简锛宻hadow-master椤朵笂锛坴ip婕傜Щ锛屽逛笟锷″眰阃忔槑锛屼笉闇瑕佷汉宸ヤ粙鍏ワ级
杩欑嶆柟寮忕殑濂藉勶细
1锛夎诲啓娌℃湁寤舵椂
2锛夎诲啓楂桦彲鐢
涓嶈冻锛
1锛変笉鑳介氲繃锷犱粠搴撶殑鏂瑰纺镓╁𪾢璇绘ц兘
2锛夎祫婧愬埄鐢ㄧ巼涓50%锛屼竴鍙板啑浣欎富娌℃湁鎻愪緵链嶅姟
闾e备綍鎻愰珮璇绘ц兘锻锛熻繘鍏ョ浜屼釜璇濋桡纴濡备綍鎻愪緵璇绘ц兘銆
2.2濡备綍镓╁𪾢璇绘ц兘锛
鎻愰珮璇绘ц兘镄勬柟寮忓ぇ镊存湁涓夌嶏纴绗涓绉嶆槸寤虹珛绱㈠紩銆傝繖绉嶆柟寮忎笉灞曞紑锛岃佹彁鍒扮殑涓镣规槸锛屼笉钖岀殑搴揿彲浠ュ缓绔嬩笉钖岀殑绱㈠紩銆

鍐椤簱涓嶅缓绔嬬储寮曪绂
绾夸笂璇诲簱寤虹珛绾夸笂璁块梾绱㈠紩锛屼緥濡倁id锛
绾夸笅璇诲簱寤虹珛绾夸笅璁块梾绱㈠紩锛屼緥濡伥ime锛
绗浜岀嶆墿鍏呰绘ц兘镄勬柟寮忔槸锛屽炲姞浠庡簱锛岃繖绉嶆柟娉曞ぇ瀹剁敤镄勬瘆杈冨氾纴浣嗘槸锛屽瓨鍦ㄤ袱涓缂虹偣锛
锛1锛変粠搴撹秺澶氾纴钖屾ヨ秺鎱
锛2锛夊悓姝ヨ秺鎱锛屾暟鎹涓崭竴镊寸獥鍙h秺澶э纸涓崭竴镊村悗闱㈣达纴杩樻槸鍏堣磋绘ц兘镄勬彁楂桡级
58钖屽煄娌℃湁閲囩敤杩欑嶆柟娉曟彁楂樻暟鎹搴撹绘ц兘锛堟病链変粠搴掳级锛岄噰鐢ㄧ殑鏄澧炲姞缂揿瓨銆傚父瑙佺殑缂揿瓨鏋舵瀯濡备笅锛

涓婃父鏄涓氩姟搴旂敤锛屼笅娓告槸涓诲簱锛屼粠搴掳纸璇诲啓鍒嗙伙级锛岀紦瀛樸
58钖屽煄镄勭帺娉曟槸锛氭湇锷+鏁版嵁搴+缂揿瓨涓濂

涓氩姟灞备笉鐩存帴闱㈠悜db鍜宑ache锛屾湇锷″眰灞忚斀浜嗗簳灞俤b銆乧ache镄勫嶆潅镐с备负浠涔堣佸紩鍏ユ湇锷″眰锛屼粖澶╀笉灞曞紑锛58閲囩敤浜嗏沧湇锷+鏁版嵁搴+缂揿瓨涓濂椻濈殑鏂瑰纺鎻愪緵鏁版嵁璁块梾锛岀敤cache鎻愰珮璇绘ц兘銆
涓岖¢噰鐢ㄤ富浠庣殑鏂瑰纺镓╁𪾢璇绘ц兘锛岃缮鏄缂揿瓨镄勬柟寮忔墿灞曡绘ц兘锛屾暟鎹閮借佸嶅埗澶氢唤锛堜富+浠庯纴db+cache锛夛纴涓瀹氢细寮曞彂涓镊存ч梾棰樸
2.3濡备綍淇濊瘉涓镊存э纻
涓讳粠鏁版嵁搴撶殑涓镊存э纴阃氩父链変袱绉嶈В鍐虫柟妗堬细
锛1锛変腑闂翠欢

濡傛灉镆愪竴涓猭ey链夊啓镎崭綔锛屽湪涓崭竴镊存椂闂寸獥鍙e唴锛屼腑闂翠欢浼氩皢杩欎釜key镄勮绘搷浣滀篃璺鐢卞埌涓诲簱涓娿
杩欎釜鏂规堢殑缂虹偣鏄锛屾暟鎹搴扑腑闂翠欢镄勯棬妲涜缉楂桡纸锏惧害锛岃吘璁锛岄樋閲岋纴360绛変竴浜涘叕鍙告湁锛屽綋铹58涔熸湁锛
锛2锛夊己鍒惰讳富

58镄勨滃弻涓诲綋涓讳粠鐢ㄢ濈殑鏋舵瀯锛屼笉瀛桦湪涓讳粠涓崭竴镊寸殑闂棰樸
绗浜岀被涓崭竴镊达纴鏄痉b涓庣紦瀛橀棿镄勪笉涓镊

甯歌佺殑缂揿瓨鏋舵瀯濡备笂锛屾ゆ椂鍐欐搷浣灭殑椤哄簭鏄锛
锛1锛夋窐姹瘫ache
锛2锛夊啓鏁版嵁搴
璇绘搷浣灭殑椤哄簭鏄锛
锛1锛夎籧ache锛屽傛灉cache hit鍒栾繑锲
锛2锛夊傛灉cache miss锛屽垯璇讳粠搴
锛3锛夎讳粠搴揿悗锛屽皢鏁版嵁鏀惧洖cache
鍦ㄤ竴浜涘纾甯告椂搴忔儏鍐典笅锛屾湁鍙鑳戒粠銆愪粠搴撹诲埌镞ф暟鎹锛埚悓姝ヨ缮娌℃湁瀹屾垚锛夛纴镞ф暟鎹鍏cache钖庛戯纴鏁版嵁浼氶暱链熶笉涓镊淬
瑙e喅锷炴硶鏄钬灭紦瀛桦弻娣樻卑钬濓纴鍐欐搷浣沧椂搴忓崌绾т负锛
锛1锛夋窐姹瘫ache
锛2锛夊啓鏁版嵁搴
锛3锛夊湪缁忛獙钬滀富浠庡悓姝ュ欢镞剁獥鍙f椂闂粹濆悗锛屽啀娆″彂璧蜂竴涓寮傛ユ窐姹瘫ache镄勮锋眰
杩欐牱锛屽嵆浣挎湁鑴忔暟鎹濡俢ache锛屼竴涓灏忕殑镞堕棿绐楀彛涔嫔悗锛岃剰鏁版嵁杩樻槸浼氲娣樻卑銆傚甫𨱒ョ殑浠d环鏄锛屽氩紩鍏ヤ竴娆¤籱iss锛堟垚链鍙浠ュ拷鐣ワ级銆
闄ゆや箣澶栵纴58钖屽煄镄勬渶浣冲疄璺典箣涓鏄锛氩缓璁涓烘墍链塩ache涓镄刬tem璁剧疆涓涓瓒呮椂镞堕棿銆
璇村畬涓镊存э纴链钖庝竴涓璇濋樻槸镓╁𪾢镐с
2.4濡备綍鎻愰珮鏁版嵁搴撶殑镓╁𪾢镐э纻
铡熸潵鐢╤ash镄勬柟寮忚矾鐢憋纴鍒嗕负2涓搴掳纴鏁版嵁閲忚缮鏄澶澶э纴瑕佸垎涓3涓搴掳纴锷垮繀闇瑕佽繘琛屾暟鎹杩佺Щ锛58钖屽煄链変竴涓寰埚竻姘旂殑钬沧暟鎹搴撶掔骇镓╁光濇柟妗堛
濡备綍绉掔骇镓╁癸纻
棣栧厛锛屾垜浠涓嶅仛2搴揿彉3搴撶殑镓╁癸纴鎴戜滑锅2搴揿彉4搴掳纸搴揿姞鍊嶏级镄勬墿瀹癸纸链𨱒4->8->16锛

链嶅姟+鏁版嵁搴撴槸涓濂楋纸鐪佸幓浜嗙紦瀛桡级
鏁版嵁搴挞噰鐢ㄢ滃弻涓烩濈殑妯″纺銆
镓╁规ラわ细
绗涓姝ワ纴灏嗕竴涓涓诲簱鎻愬崌
绗浜屾ワ纴淇鏀归厤缃锛2搴揿彉4搴掳纸铡熸潵MOD2锛岀幇鍦ㄩ厤缃淇鏀瑰悗MOD4锛
镓╁瑰畬鎴

铡烳OD2涓哄伓镄勯儴鍒嗭纴鐜板湪浼歁OD4浣0鎴栬2
铡烳OD2涓哄囩殑閮ㄥ垎锛岀幇鍦ㄤ细MOD4浣1鎴栬3
鏁版嵁涓嶉渶瑕佽縼绉伙纴钖屾椂锛屽弻涓讳簰鐩稿悓姝ワ纴涓阆嶆槸浣0锛屼竴杈逛綑2锛屼袱杈规暟鎹钖屾ヤ篃涓崭细鍐茬獊锛岀掔骇瀹屾垚镓╁癸紒
链钖庯纴瑕佸仛涓浜涙敹灏惧伐浣滐细
锛1锛夊皢镞х殑鍙屼富钖屾ヨВ闄
锛2锛夊炲姞鏂扮殑鍙屼富锛埚弻涓绘槸淇濊瘉鍙鐢ㄦх殑锛宻hadow-master骞虫椂涓嶆彁渚涙湇锷★级
锛3锛夊垹闄ゅ氢綑镄勬暟鎹锛堜綑0镄勪富锛屽彲浠ュ皢浣2镄勬暟鎹鍒犻櫎鎺夛级

杩欐牱锛岀掔骇鍒鍐咃纴鎴戜滑灏卞畬鎴愪简2搴揿彉4搴撶殑镓╁𪾢銆
OK锛屼粖澶╀富瑕佸垎浜浜58钖屽煄锛屾暟鎹搴撹蒋浠舵灦鏋勪笂锛
锛1锛夊备綍淇濊瘉鏁版嵁鍙鐢ㄦ
锛2锛夊备綍鎻愰珮鏁版嵁搴撹绘ц兘
锛3锛夊备綍淇濊瘉鏁版嵁涓镊存
锛4锛夊备綍杩涜岀掔骇镓╁
甯屾湜澶у舵湁鏀惰幏锛岃阿璋㈠ぇ瀹讹紒
===銆愬畬銆===
銆愯浆镊銆58娌埚墤 鏋舵瀯甯堜箣璺
銆愯浆杞姐戞暟鎹搴撹蒋浠舵灦鏋勮捐′簺浠涔
镙囩撅细涓鏁癿da璁捐timeottitemlogs##key

E. 数据库的事务机制是什么

回答的有点多请耐心看完。
希望能帮助你还请及时采纳谢谢
1事务的原理
事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。MySQL事务处理只支持InnoDB和BDB数据表类型。

1事务的ACID原则
** 1(Atomicity)原子性**: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;
2(Consistency)一致性: 执行事务前后,数据保持一致;
3(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。
4(Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。

1缓冲池(Buffer Pool)
Buffer Pool中包含了磁盘中部分数据页的映射。当从数据库读取数据时,会先从Buffer Pool中读取数据,如果Buffer Pool中没有,则从磁盘读取后放入到Buffer Pool中。当向数据库写入数据时,会先写入到Buffer Pool中,Buffer Pool中更新的数据会定期刷新到磁盘中(此过程称为刷脏)。

2日志缓冲区(Log Buffer)
当在MySQL中对InnoDB表进行更改时,这些更改命令首先存储在InnoDB日志缓冲区(Log Buffer)的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。

3双写机制缓存(DoubleWrite Buffer)
Doublewrite Buffer是共享表空间的物理文件的 buffer,其大小是2MB.是一个一分为二的2MB空间。
刷脏操作开始之时,先进行脏页**‘备份’**操作.将脏页数据写入 Doublewrite Buffer.
将Doublewrite Buffer(顺序IO)写入磁盘文件中(共享表空间) 进行刷脏操作.

4回滚日志(Undo Log)
Undo Log记录的是逻辑日志.记录的是事务过程中每条数据的变化版本和情况.
在Innodb 磁盘架构中Undo Log 默认是共享表空间的物理文件的Buffer.
在事务异常中断,或者主动(Rollback)回滚的过程中 ,Innodb基于 Undo Log进行数据撤销回滚,保证数据回归至事务开始状态.

5重做日志(Redo Log)
Redo Log通常指的是物理日志,记录的是数据页的物理修改.并不记录行记录情况。(也就是只记录要做哪些修改,并不记录修改的完成情况) 当数据库宕机重启的时候,会将重做日志中的内容恢复到数据库中。

1原子性
Innodb事务的原子性保证,包含事务的提交机制和事务的回滚机制.在Innodb引擎中事务的回滚机制是依托 回滚日志(Undo Log) 进行回滚数据,保证数据回归至事务开始状态.

2那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰? 答案是 锁 和 MVCC。
3持久性
基于事务的提交机制流程有可能出现三种场景.
1 数据刷脏正常.一切正常提交,Redo Log 循环记录.数据成功落盘.持久性得以保证

2数据刷脏的过程中出现的系统意外导致页断裂现象 (部分刷脏成功),针对页断裂情况,采用Double write机制进行保证页断裂数据的恢复.

3数据未出现页断裂现象,也没有刷脏成功,MySQL通过Redo Log 进行数据的持久化即可

4一致性
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性

2事务的隔离级别
Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别

脏读: 指一个事务读取了另外一个事务未提交的数据。
不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同
虚读(幻读): 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

2基本语法
-- 使用set语句来改变自动提交模式
SET autocommit = 0; /*关闭*/
SET autocommit = 1; /*开启*/

-- 注意:
--- 1.MySQL中默认是自动提交
--- 2.使用事务时应先关闭自动提交

-- 开始一个事务,标记事务的起始点
START TRANSACTION

-- 提交一个事务给数据库
COMMIT

-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK

-- 还原MySQL数据库的自动提交
SET autocommit =1;

-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
课堂测试题目

A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000

创建数据库shop和创建表account并插入2条数据
*/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;

CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)

-- 转账实现
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION; -- 开始一个事务,标记事务的起始点
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT; -- 提交事务
# rollback;
SET autocommit = 1; -- 恢复自动提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
3事务实现方式-MVCC
1什么是MVCC
MVCC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别为RR(可重复读)和RC(读提交)生效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突,极大的增加了系统的并发性能。

2MVCC的实现机制
InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。

在多版本并发控制中,为了保证数据操作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的;对于数据的更新(包括增删改)操作成功,会将这个版本号更新到数据的行中;事务提交成功,新的版本号也就更新到了此数据行中。这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题。

3MVCC下的CRUD
SELECT:
当隔离级别是REPEATABLE READ时select操作,InnoDB每行数据来保证它符合两个条件:
** 1 事务的版本号 大于等于 创建行版本号**
** 2 行数据的删除版本 未定义 或者大于 事务版本号**
【行创建版本号 事务版本号 行删除版本号】

INSERT:
InnoDB为这个新行 记录 当前的系统版本号。

DELETE:
InnoDB将当前的系统版本号 设置为 这一行的删除版本号。

UPDATE:
InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为 当前的系统版本号。它同时也会将这个版本号 写到 旧行的删除版本里。
————————————————
版权声明:本文为CSDN博主“@Autowire”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zs18753479279/article/details/113933252

F. sql瀵煎嚭淇濆瓨闂棰

璇曚简濂戒箙缁堜簬璇曞嚭𨱒ヤ简銆伞伞伞
鍙冲嚮鍙﹀瓨涓哄熀链涓娄笉鍙鑳斤紒涓涓嬫槸鎴戠殑缁撴灉锛
棣栧厛淇濊瘉鍦ㄦ煡璇-銆嬫煡璇㈤夐”-銆嬬粨鏋-銆嬬绣镙-銆嬩腑阃変腑鍦ㄥ嶅埗鍜屼缭瀛樻椂鍖呮嫭鍒楁爣棰桡纴钖﹀垯灏变笉浼氭湁鍒楁爣棰桡紒
鎺ヤ笅𨱒ュ氨鐢ㄦ瘆杈幂ㄧ殑鏂规硶淇濆瓨浜嗭细1.鍏ㄩ夛细ctrl+A锛屽嶅埗ctrl+C
2.鏂板缓涓涓猚sv鏂囦欢锛埚彲浠ュ厛寤轰竴涓猠xcel宸ヤ綔琛锛屽啀鏀瑰悗缂钖嶏级
3.镓揿紑宸叉湁镄刢sv绌鸿〃锛屽啀灏嗘暟鎹澶嶅埗杩涘幓锛屼缭瀛

钥宑sv鏂囦欢链変互涓嬬壒寰侊细
鏂囦欢镄勭涓涓鏂囨湰琛屽寘钖鎶ヨ〃涓镓链夊垪镄勬爣棰樸

镓链夎岀殑鍒楁暟閮界浉钖屻

瀛楁靛垎闅旂﹀瓧绗︿覆鏄阃楀彿 (,)銆

璁板綍鍒嗛殧绗﹀瓧绗︿覆鏄涓嶅彲瑙佺殑锲炶溅绗﹀拰鎹㈣岀 (<cr><lf>)銆

鏂囨湰闄愬畾绗﹀瓧绗︿覆鏄寮曞彿 (")銆

濡傛灉鏂囨湰鍖呭惈寮曞彿锛屽垯寮曞彿闇瑕佸弻鍐 ("")銆

杩欐槸涓涓姣旇缉绠鍗曞张瀹规槗鎺屾彙镄勬柟娉曪纴涓岖煡杩樻湁娌″叾浠栨柟娉曪纻

热点内容
安卓导航怎么会黑屏 发布:2024-11-27 18:17:19 浏览:394
编译后代码放在单片机哪个位置 发布:2024-11-27 18:12:01 浏览:458
linux红帽安装 发布:2024-11-27 18:01:53 浏览:827
手机编程蓝牙 发布:2024-11-27 17:55:39 浏览:385
创维云电视怎么升级安卓系统 发布:2024-11-27 17:55:31 浏览:354
theisle游戏服务器搭建 发布:2024-11-27 17:47:43 浏览:210
xshell解压 发布:2024-11-27 17:35:14 浏览:359
ftp服务器管理方法 发布:2024-11-27 17:24:48 浏览:975
微信视频为什么要缓存 发布:2024-11-27 17:18:18 浏览:250
招生宣传片脚本 发布:2024-11-27 17:18:07 浏览:301