sql雙寫
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>)銆
鏂囨湰闄愬畾絎﹀瓧絎︿覆鏄寮曞彿 (")銆
濡傛灉鏂囨湰鍖呭惈寮曞彿錛屽垯寮曞彿闇瑕佸弻鍐 ("")銆
榪欐槸涓涓姣旇緝綆鍗曞張瀹規槗鎺屾彙鐨勬柟娉曪紝涓嶇煡榪樻湁娌″叾浠栨柟娉曪紵