技術(shù)小能手2017-11-27 14:01:03瀏覽128評(píng)論0發(fā)表于:數(shù)據(jù)和云
架構(gòu)服務(wù)器mysqlOracleSQL日志線程高可用數(shù)據(jù)庫(kù)互聯(lián)網(wǎng)查詢優(yōu)化磁盤傳統(tǒng)企業(yè)存儲(chǔ)
摘要:身處數(shù)據(jù)驅(qū)動(dòng)快速變革的時(shí)代,數(shù)據(jù)庫(kù)系統(tǒng)的選型和架構(gòu)設(shè)計(jì)對(duì)于整個(gè)IT基礎(chǔ)架構(gòu),甚至企業(yè)的發(fā)展都起到至關(guān)重要的作用。那么今天,如果您的企業(yè)需要搭建一套新的應(yīng)用系統(tǒng),你會(huì)選擇什么數(shù)據(jù)庫(kù)類型?如果當(dāng)前的系統(tǒng)不能滿足業(yè)務(wù)需求,面臨系統(tǒng)遷移,你又會(huì)如何選擇? 在2017年初,我們分享過(guò)一份國(guó)外的報(bào)告“開(kāi)發(fā)人員是如何使用數(shù)據(jù)庫(kù)的?”,并且進(jìn)行了一次調(diào)查『中國(guó)數(shù)據(jù)庫(kù)愛(ài)好者的選擇和背離』,其中的一些數(shù)據(jù)展示了用戶對(duì)于數(shù)據(jù)庫(kù)的選擇,非常具有參考價(jià)值,鏈接可以直接參考分析報(bào)告。
身處數(shù)據(jù)驅(qū)動(dòng)快速變革的時(shí)代,數(shù)據(jù)庫(kù)系統(tǒng)的選型和架構(gòu)設(shè)計(jì)對(duì)于整個(gè)IT基礎(chǔ)架構(gòu),甚至企業(yè)的發(fā)展都起到至關(guān)重要的作用。那么今天,如果您的企業(yè)需要搭建一套新的應(yīng)用系統(tǒng),你會(huì)選擇什么數(shù)據(jù)庫(kù)類型?如果當(dāng)前的系統(tǒng)不能滿足業(yè)務(wù)需求,面臨系統(tǒng)遷移,你又會(huì)如何選擇?
在2017年初,我們分享過(guò)一份國(guó)外的報(bào)告“開(kāi)發(fā)人員是如何使用數(shù)據(jù)庫(kù)的”,并且進(jìn)行了一次調(diào)查『中國(guó)數(shù)據(jù)庫(kù)愛(ài)好者的選擇和背離』,其中的一些數(shù)據(jù)展示了用戶對(duì)于數(shù)據(jù)庫(kù)的選擇,非常具有參考價(jià)值,鏈接可以直接參考分析報(bào)告。
隨著互聯(lián)網(wǎng)+時(shí)代的到來(lái),企業(yè)的業(yè)務(wù)發(fā)展對(duì)IT架構(gòu)提出了更高的要求,傳統(tǒng)的架構(gòu)往往運(yùn)維復(fù)雜、成本高、不易擴(kuò)展,在很大程度上制約了企業(yè)的快速發(fā)展。隨著領(lǐng)先互聯(lián)網(wǎng)企業(yè)的開(kāi)源架構(gòu)嘗試和探索,人們開(kāi)始逐漸接受并嘗試『非IOE』架構(gòu)和組件,尤其是一些勇于創(chuàng)新的傳統(tǒng)行業(yè)企業(yè),如金融、保險(xiǎn)、證券等,他們正在快速跟上極速變革的技術(shù)新時(shí)代。
而在數(shù)據(jù)庫(kù)領(lǐng)域加速這一過(guò)程的,便是以MySQL為代表的開(kāi)源數(shù)據(jù)庫(kù)的應(yīng)用。MySQL在近幾年發(fā)展迅速,以其體積小、速度快、成本低,尤其是開(kāi)放源碼等優(yōu)勢(shì)受到廣大用戶的喜愛(ài)。
同時(shí),在 DB-Engines 的排名上,Oracle 和 MySQL 兩個(gè)產(chǎn)品長(zhǎng)期霸占了前兩名的位置。但根據(jù)近幾年的增長(zhǎng)趨勢(shì),MySQL 在這個(gè)榜單上超越Oracle數(shù)據(jù)庫(kù)是遲早的事,而且這一時(shí)點(diǎn)可能很快到來(lái)。
近期,云和恩墨為某證券公司進(jìn)行了從DB2到MySQL數(shù)據(jù)庫(kù)系統(tǒng)的遷移論證、驗(yàn)證,對(duì)兩類數(shù)據(jù)庫(kù)展開(kāi)全方位多角度的對(duì)比分析,并根據(jù)用戶的業(yè)務(wù)現(xiàn)狀進(jìn)行了相關(guān)架構(gòu)、性能、備份恢復(fù)及高可用驗(yàn)證。
在以下的系列文章中,我們將把來(lái)自于實(shí)踐的分析、論證、驗(yàn)證數(shù)據(jù)分享給大家,從商用到開(kāi)源,從DB2到MySQL,從傳統(tǒng)業(yè)務(wù)到互聯(lián)網(wǎng)架構(gòu),一切正在發(fā)生。
為什么是MySQL不是DB2?
我們知道,IT架構(gòu)通常由業(yè)務(wù)架構(gòu)、數(shù)據(jù)架構(gòu)、IT基礎(chǔ)架構(gòu)和應(yīng)用架構(gòu)構(gòu)成,而數(shù)據(jù)架構(gòu)則是整個(gè)IT架構(gòu)的中心,企業(yè)最核心的資產(chǎn)就是數(shù)據(jù)。
很多傳統(tǒng)的企業(yè)比如金融證券等行業(yè)的IT軟硬件架構(gòu)都是IBM系列產(chǎn)品,比如IBM小型機(jī)/DB2數(shù)據(jù)庫(kù)/DS8000高端存儲(chǔ)等產(chǎn)品,這種IT架構(gòu)被業(yè)界稱為“IOE”架構(gòu),其特點(diǎn)是基于向上擴(kuò)展(Scale Up)技術(shù)的高端設(shè)備以及圍繞它們開(kāi)發(fā)的專有硬件、大型商業(yè)數(shù)據(jù)庫(kù)和中間件組合。
有人說(shuō),DB2在金融證券保險(xiǎn)行業(yè)有絕對(duì)不可替代的優(yōu)勢(shì)!
的確,DB2擁有悠久的歷史并且被很多人認(rèn)為是最早使用SQL的數(shù)據(jù)庫(kù)產(chǎn)品。主要應(yīng)用于大型應(yīng)用系統(tǒng),具有較好的可伸縮性,可支持從大型機(jī)到單用戶環(huán)境,應(yīng)用于所有常見(jiàn)的服務(wù)器操作系統(tǒng)平臺(tái)下。然而隨著時(shí)代的進(jìn)步,開(kāi)源產(chǎn)品和技術(shù)也已經(jīng)被證明具備支撐企業(yè)核心業(yè)務(wù)的能力。
時(shí)代導(dǎo)向
在移動(dòng)互聯(lián)網(wǎng)時(shí)代,各組織都在試圖構(gòu)建面向互聯(lián)網(wǎng)+的安全可控的技術(shù)架構(gòu),在互聯(lián)網(wǎng)轉(zhuǎn)型升級(jí)壓力下,需要對(duì)IT系統(tǒng)重構(gòu)、而數(shù)據(jù)架構(gòu)是IT重構(gòu)的基礎(chǔ)和核心。因此上述傳統(tǒng)的IOE架構(gòu)正在逐漸演化為新一代以X86架構(gòu)、開(kāi)源應(yīng)用平臺(tái)、數(shù)據(jù)平臺(tái)等為技術(shù)基礎(chǔ)的新一代技術(shù)架構(gòu)。
MySQL數(shù)據(jù)庫(kù)作為互聯(lián)網(wǎng)行業(yè)IT架構(gòu)的標(biāo)配,在長(zhǎng)期的實(shí)踐中積累了大量的高可用、分布式架構(gòu)和災(zāi)備經(jīng)驗(yàn)。
因此,潮流的改變IT傳統(tǒng)架構(gòu)的演變。越來(lái)越多的DB2數(shù)據(jù)庫(kù)客戶轉(zhuǎn)向開(kāi)源數(shù)據(jù)庫(kù),而 MySQL 作為當(dāng)前最火的開(kāi)源數(shù)據(jù)庫(kù),也常常是受到老DB2用戶關(guān)注最多的。
政策驅(qū)動(dòng)
將DB2遷移到MySQL并不是一件容易的事,更不可能受單一的時(shí)代潮流影響而一蹴而就,對(duì)于傳統(tǒng)企業(yè)來(lái)說(shuō)是一個(gè)逐步試水嘗試的過(guò)程;數(shù)據(jù)是企業(yè)IT架構(gòu)的核心資產(chǎn),數(shù)據(jù)的任何丟失都是難以接受的。而受國(guó)家信息安全“自主可控”政策的號(hào)召,更加堅(jiān)定了傳統(tǒng)企業(yè)作將DB2遷移到MySQL的嘗試。比如著名的銀監(jiān)會(huì)39號(hào)文要求各銀行業(yè)金融機(jī)構(gòu)對(duì)安全可控信息技術(shù)的應(yīng)用以不低于15%的比例逐年增加,直至2019年達(dá)到不低于75%的總體占比。
成本驅(qū)動(dòng)
為了穩(wěn)定運(yùn)行,很多客戶的 DB2 數(shù)據(jù)庫(kù)都是運(yùn)行在全套 IBM 平臺(tái)中,成本高昂;那么將DB2遷移到以X86架構(gòu)為主的MySQL數(shù)據(jù)庫(kù)當(dāng)中,數(shù)據(jù)庫(kù)運(yùn)行的底層基礎(chǔ)架構(gòu)的要求大大降低,每年需要給原廠商的商業(yè) License 費(fèi)用也會(huì)隨之減少。
隨著大數(shù)據(jù)和云時(shí)代的到來(lái),企業(yè)的新業(yè)務(wù)和應(yīng)用變更非常快,此時(shí),以低成本的方式進(jìn)行系統(tǒng)擴(kuò)展和維護(hù)便是首要考慮的問(wèn)題。
自主可控
由于互聯(lián)網(wǎng)行業(yè)的薪資和職業(yè)前景吸引了大量技術(shù)人才涌入互聯(lián)網(wǎng)公司從事開(kāi)發(fā)運(yùn)維等工作,使得原廠技術(shù)支持團(tuán)隊(duì)人才流失嚴(yán)重,而且服務(wù)體制僵化,服務(wù)響應(yīng)流程慢等弊端,導(dǎo)致了服務(wù)質(zhì)量的下降,從而拉低了客戶滿意度。
將DB2數(shù)據(jù)庫(kù)遷移到MySQL,那么可以很大程度降低對(duì)原廠服務(wù)的依賴性;轉(zhuǎn)而使用“最受歡迎的開(kāi)源數(shù)據(jù)庫(kù)”——MySQL,首先一點(diǎn)是國(guó)內(nèi)MySQL從業(yè)人員多,而且深入代碼研究的MySQL DBA也不少,第三方服務(wù)運(yùn)維水平也比較高,是現(xiàn)在傳統(tǒng)企業(yè)擁抱互聯(lián)網(wǎng)時(shí)備受青睞的選擇。
社區(qū)生態(tài)
整個(gè)行業(yè)DB2技術(shù)從業(yè)人員相對(duì)較少,圈子也在不斷縮小,存在人才斷崖風(fēng)險(xiǎn)。一方面很多10多年前培養(yǎng)起來(lái)的經(jīng)驗(yàn)豐富的DB2 DBA,或者去了大型甲方單位像大型銀行、券商等IT建設(shè)投入相對(duì)比較大的企業(yè),另一方面很多人才轉(zhuǎn)行到開(kāi)源領(lǐng)域,或者轉(zhuǎn)行到大數(shù)據(jù)云計(jì)算等行業(yè),社區(qū)生態(tài)持續(xù)收縮。
因此,由于DB2數(shù)據(jù)庫(kù)技術(shù)人才儲(chǔ)備的嚴(yán)重不足以及業(yè)內(nèi)人才梯隊(duì)斷層,導(dǎo)致很多企業(yè)招人難,特別是很多中小型企業(yè),社區(qū)和產(chǎn)品是相互促進(jìn)、相互推動(dòng),人才必然影響到產(chǎn)品的應(yīng)用。
推薦使用MySQL的原因
在社區(qū)成熟度上,MySQL數(shù)據(jù)庫(kù)在開(kāi)源業(yè)界可以說(shuō)“炙手可熱”,便捷靈活,已經(jīng)廣泛被業(yè)內(nèi)看好,而且被Oracle公司接管后,其開(kāi)發(fā)不再像以前典型的開(kāi)源項(xiàng)目那樣開(kāi)發(fā)人員散落世界各地,而是由Oracle公司專門組建了一個(gè)MySQL開(kāi)發(fā)團(tuán)隊(duì),團(tuán)隊(duì)中有的小組在做集群化軟件,有的在做數(shù)據(jù)庫(kù)算法,有的在做備份功能,整體上提供了更加成熟的工程模式,未來(lái)提升的空間巨大。
從市場(chǎng)占有率看,MySQL排名今年連續(xù)攀升,大有趕超數(shù)據(jù)庫(kù)龍頭“Oracle”的趨勢(shì)。從如數(shù)據(jù)庫(kù)下排名可以看出,市場(chǎng)還是比較青睞MySQL開(kāi)源數(shù)據(jù)庫(kù)的。
全球數(shù)據(jù)庫(kù)熱度排名中,MySQL穩(wěn)居第二名直逼第一名。參考鏈接:https://db-engines.com/en/ranking
在性能上,從我們與PG等其他數(shù)據(jù)庫(kù)的benchmark測(cè)試結(jié)果看,MySQL數(shù)據(jù)庫(kù)相對(duì)OLTP性能高、簡(jiǎn)易又靈活、易用性好,比較適用于響應(yīng)時(shí)間靈敏的業(yè)務(wù)場(chǎng)景。
要注意的事項(xiàng)
當(dāng)然,在考慮將DB2遷移到MySQL之前,也應(yīng)該充分認(rèn)識(shí)到MySQL在功能上的一些缺陷。
比如在多表查詢方面,MySQL只支持NL JOIN,不支持表的全外連接,也不支持HS JOIN和MG JOIN;MySQL的存儲(chǔ)過(guò)程和觸發(fā)器的功能比較弱,甚至不建議在MySQL數(shù)據(jù)庫(kù)中對(duì)存儲(chǔ)過(guò)程的使用等。
總之,從功能上,MySQL適合拿來(lái)存放數(shù)據(jù)、不適合做運(yùn)算場(chǎng)景,實(shí)際中大部分互聯(lián)網(wǎng)公司也只是把它當(dāng)做數(shù)據(jù)存儲(chǔ)器來(lái)使用,把需要的數(shù)據(jù)取出來(lái)然后在應(yīng)用程序中進(jìn)行運(yùn)算,這一點(diǎn)和DB2/Oracle那種商業(yè)數(shù)據(jù)庫(kù)盡量什么都放到數(shù)據(jù)庫(kù)里面的使用風(fēng)格很不一樣。
因此,將DB2遷移到MySQL的話,需要認(rèn)清MySQL適用于OLTP場(chǎng)景,不建議在OLAP場(chǎng)景中運(yùn)用;而且必須考慮將原先放在DB2中的某些業(yè)務(wù)邏輯在遷移到MySQL后,從數(shù)據(jù)庫(kù)中剝離出來(lái)放到應(yīng)用中去實(shí)現(xiàn);需要加強(qiáng)對(duì)應(yīng)用架構(gòu)的管控。
如何實(shí)現(xiàn)DB2遷移至MySQL的最佳實(shí)踐
基于上述的遷移驅(qū)動(dòng)力,你是不是也決定要把你的DB2系統(tǒng)遷移至MySQL了呢?那么如何才能規(guī)避遷移中的系列問(wèn)題呢?這需要我們完全把握兩個(gè)數(shù)據(jù)庫(kù)的特點(diǎn),各自的優(yōu)勢(shì)和不足,在遷移中做合理規(guī)劃設(shè)計(jì)。
為此,本系列接下來(lái)會(huì)包含(但不限于)以下內(nèi)容,帶領(lǐng)大家全面認(rèn)識(shí)DB2遷移至MySQL的實(shí)踐。
遷移準(zhǔn)備
1、DB2與MySQL數(shù)據(jù)庫(kù)對(duì)比分析。包含:數(shù)據(jù)庫(kù)架構(gòu)對(duì)比,數(shù)據(jù)類型對(duì)比,數(shù)據(jù)庫(kù)對(duì)象對(duì)比,SQL對(duì)比等。
2、測(cè)試。包含DB2與MySQL兼容性測(cè)試,MySQL性能測(cè)試,MySQL基于OLPT的測(cè)試等等。
遷移過(guò)程
1、應(yīng)用設(shè)計(jì)與改造。
2、MySQL高可用設(shè)計(jì)與部署
3、MySQL備份與恢復(fù)設(shè)計(jì)
4、遷移中的重點(diǎn)問(wèn)題和注意事項(xiàng)
遷移優(yōu)化
1、性能測(cè)試
2、系統(tǒng)優(yōu)化
一場(chǎng)從DB2遷移至MySQL的數(shù)據(jù)庫(kù)風(fēng)暴即將襲來(lái),你準(zhǔn)備好了嗎?
MySQL vs DB2 ?Part 1: 體系架構(gòu)
我們來(lái)對(duì)比一下DB2與MySQL體系架構(gòu)有什么不同。
MySQL體系架構(gòu)
首先我們對(duì)圖中的組件進(jìn)行說(shuō)明。
由連接池組件、管理服務(wù)和?工具組件、SQL接口組件、查詢分析器組件、優(yōu)化器組件、緩沖組件、插件式存儲(chǔ)引擎、物理?文件組成。MySQL是獨(dú)有的插件式體系結(jié)構(gòu),各個(gè)存儲(chǔ)引擎有自己的特點(diǎn)。
1、Connectors:指的是不同語(yǔ)言中與SQL的交互
2、ManagementServeices & Utilities: 系統(tǒng)管理和控制工具
3、Connection Pool:連接池:管理緩沖用戶連接,線程處理等需要緩存的需求
4、SQL Interface:SQL接口:接受用戶的SQL命令,并且返回用戶需要查詢的結(jié)果。比如select from就是調(diào)用SQL Interface
5、Parser: 解析器:SQL命令傳遞到解析器的時(shí)候會(huì)被解析器驗(yàn)證和解析。解析器是由Lex和YACC實(shí)現(xiàn)的,是一個(gè)很長(zhǎng)的腳本。
主要功能
a . 將SQL語(yǔ)句分解成數(shù)據(jù)結(jié)構(gòu),并將這個(gè)結(jié)構(gòu)傳遞到后續(xù)步驟,以后SQL語(yǔ)句的傳遞和處理就是基于這個(gè)結(jié)構(gòu)的
b.? 如果在分解構(gòu)成中遇到錯(cuò)誤,那么就說(shuō)明這個(gè)sql語(yǔ)句是不合理的。
6、Optimizer: 查詢優(yōu)化器:SQL語(yǔ)句在查詢之前會(huì)使用查詢優(yōu)化器對(duì)查詢進(jìn)行優(yōu)化。他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢。
舉例: selectuid,name from user where gender = 1;
這個(gè)select 查詢先根據(jù)where 語(yǔ)句進(jìn)行選取,而不是先將表全部查詢出來(lái)以后再進(jìn)行g(shù)ender過(guò)濾,這個(gè)select查詢先根據(jù)uid和name進(jìn)行屬性投影,而不是將屬性全部取出以后再進(jìn)行過(guò)濾將這兩個(gè)查詢條件聯(lián)接起來(lái)生成最終查詢結(jié)果
7、Cache和Buffer: 查詢緩存。
如果查詢緩存有命中的查詢結(jié)果,查詢語(yǔ)句就可以直接去查詢緩存中取數(shù)據(jù)。
這個(gè)緩存機(jī)制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權(quán)限緩存等
8、Engine :存儲(chǔ)引擎。存儲(chǔ)引擎是MySql中具體的與文件打交道的子系統(tǒng)。也是Mysql最具有特色的一個(gè)地方。
Mysql的存儲(chǔ)引擎是插件式的。它根據(jù)MySql AB公司提供的文件訪問(wèn)層的一個(gè)抽象接口來(lái)定制一種文件訪問(wèn)機(jī)制(這種訪問(wèn)機(jī)制就叫存儲(chǔ)引擎)
現(xiàn)在有很多種存儲(chǔ)引擎,各個(gè)存儲(chǔ)引擎的優(yōu)勢(shì)各不一樣,最常用的MyISAM,InnoDB,BDB
默認(rèn)下MySql是使用MyISAM引擎,它查詢速度快,有較好的索引優(yōu)化和數(shù)據(jù)壓縮技術(shù)。但是它不支持事務(wù)。
InnoDB支持事務(wù),并且提供行級(jí)的鎖定,應(yīng)用也相當(dāng)廣泛。
Mysql也支持自己定制存儲(chǔ)引擎,甚至一個(gè)庫(kù)中不同的表使用不同的存儲(chǔ)引擎,這些都是允許的。
MySQL不是通過(guò)多進(jìn)程來(lái)完成其功能的,MySQL只有一個(gè)進(jìn)程,進(jìn)程里有多個(gè)線程。
MySQL的體系架構(gòu)可劃分為以下三個(gè)邏輯層:
應(yīng)用層(Application Layer)
邏輯層(Logical Layer)
物理層(Physical Layer)
(1)應(yīng)用層(ApplicationLayer)
MySQL管理工具和應(yīng)用實(shí)例(Administrator&Utilities)
主要是連接到MySQL服務(wù)器檢索、修改或增加數(shù)據(jù),有以下常見(jiàn)MySQL管理工具或?qū)嵱贸绦颉?/p>
本地查詢接口(Query Interface)
MySQL查詢接口主要指mysql腳本,使用mysql工具可以直接與MySQL服務(wù)器交互,是日常與MySQL服務(wù)器打交道最頻繁的工具。
客戶端應(yīng)用接口(Client API)
客戶端應(yīng)用接口主要是使用MySQL服務(wù)器對(duì)外公布的一些API調(diào)用訪問(wèn)數(shù)據(jù)庫(kù),主要有CAPI、PythonAPI以及JavaAPI。
(2)邏輯層(LogicalLayer)
MySQL邏輯層主要是包括以下幾個(gè)功能:
SQL引擎編譯SQL語(yǔ)句
將客戶端發(fā)送的SQL語(yǔ)句請(qǐng)求通過(guò)SQL引擎將SQL語(yǔ)句編譯成MySQL服務(wù)器內(nèi)部存取數(shù)據(jù)的指令的過(guò)程,編譯過(guò)程包括查詢解析(QueryParser)、查詢檢查(Query check),查詢優(yōu)化(QueryOptimizer)以及查詢執(zhí)行(Query Excution)四個(gè)階段。
事務(wù)控制
事務(wù)(Transaction)是由一組SQL語(yǔ)句組成的邏輯處理單元,這個(gè)邏輯處理單元被原子性地處理,即要么其中的所有SQL語(yǔ)句全部執(zhí)行成功,要么全部失敗,沒(méi)有第三種可能。那么MySQL是怎么保證事務(wù)被原子性地處理呢?這就是Transactionmanagement組件的功能了。當(dāng)事務(wù)全部處理完畢時(shí),通過(guò)該組件完成決定commit還是rollback操作。
日志管理
數(shù)據(jù)庫(kù)需要將所有對(duì)數(shù)據(jù)變更的操作記錄下來(lái),以便當(dāng)數(shù)據(jù)庫(kù)發(fā)生crash時(shí)做Redo或Undo操作,或者在分布式結(jié)構(gòu)中將操作通過(guò)從一個(gè)計(jì)算節(jié)點(diǎn)共享到其他計(jì)算節(jié)點(diǎn),這些功能都是通過(guò)事務(wù)日志來(lái)控制的。
MySQL的事務(wù)日志管理系統(tǒng)是Recoverymanagement組件,主要功能是持久化事務(wù)日志以及當(dāng)數(shù)據(jù)庫(kù)crash時(shí)將數(shù)據(jù)庫(kù)恢復(fù)到crash之前的一致性狀態(tài)。
存儲(chǔ)管理
數(shù)據(jù)庫(kù)中操作數(shù)據(jù)的主要場(chǎng)所是bufferpools,怎么控制數(shù)據(jù)頁(yè)和索引頁(yè)在bufferpool中的狀態(tài)就是通過(guò)storagemanagement完成的,該組件主要還是對(duì)Page層面的管理,包括將頁(yè)讀入內(nèi)存、頁(yè)的清理等。
值得一提的是,MySQL的邏輯層的上述幾個(gè)組件功能并不是MySQL特有的,而是普遍適用于DB2/Oracle等常見(jiàn)關(guān)系型數(shù)據(jù)庫(kù)。
(3)物理層
數(shù)據(jù)庫(kù)的物理層主要關(guān)注的是數(shù)據(jù)怎么落地存儲(chǔ)以及被有效訪問(wèn)的問(wèn)題,MySQL的物理層設(shè)計(jì)比較特殊,MySQL提供了多種存儲(chǔ)引擎供用戶選擇,而且這些存儲(chǔ)引擎是可插拔的(Pluggable),這是區(qū)別于業(yè)內(nèi)其他關(guān)系型數(shù)據(jù)庫(kù)的一個(gè)很重要的特征。MySQL數(shù)據(jù)庫(kù)為用戶提供了20多種可插拔的存儲(chǔ)引擎,比較常見(jiàn)的有如下列表所示幾種:
如上圖的存儲(chǔ)引擎中,從功能上比較接近商業(yè)數(shù)據(jù)庫(kù)功能的是InnoDB存儲(chǔ)引擎。從MySQL5.5開(kāi)始,InnoDB成為MySQL服務(wù)器的默認(rèn)存儲(chǔ)引擎;而早在SunMicroSystem被Oracle收購(gòu)之前的2005年,InnoDB存儲(chǔ)引擎就被Oracle收購(gòu)。
相比較于其他MySQL存儲(chǔ)引擎,MySQLInnoDB存儲(chǔ)引擎支持以下關(guān)鍵特性:
多版本并發(fā)控制(MVCC)
行級(jí)鎖(Row-level Locking)
外鍵支持(Foreign key support)
群集索引(Cluster Indexing)
可自由分配的bufferpools
在線數(shù)據(jù)庫(kù)備份
以下以InnoDB內(nèi)部是怎么和磁盤文件交互的詳細(xì)架構(gòu)示意圖。
如下圖是支持訪問(wèn)MySQL數(shù)據(jù)庫(kù)服務(wù)器的API接口類型,可以通過(guò)編寫程序調(diào)用四種API接口訪問(wèn)MySQL數(shù)據(jù)庫(kù):
JDBC with Connector/J
通過(guò)Java程序訪問(wèn)MySQL服務(wù)器
.NET with Connector/NET
使用.NET程序訪問(wèn)MySQL服務(wù)器
ODBC with Connector/ODBC
Other APIs with C Library
使用基于C語(yǔ)言庫(kù)的編程語(yǔ)言,比如C/C++語(yǔ)言、Python/PHP/Perl/Ruby語(yǔ)言等訪問(wèn)MySQL數(shù)據(jù)庫(kù)。總之,MYSQL支持通過(guò)當(dāng)前最流行的幾種主流語(yǔ)言訪問(wèn)。
DB2體系架構(gòu)
DB2 for LUW進(jìn)程模型在DB2v9.5之前都是多進(jìn)程模型,DB2v9.5之后體系架構(gòu)變更為單進(jìn)程多線程模型。
DB2是一個(gè)C/S結(jié)構(gòu),客戶端可以通過(guò)TCP/IP或IPC協(xié)議與服務(wù)器通信,每當(dāng)客戶端與服務(wù)器建立連接之后,會(huì)在服務(wù)器端產(chǎn)生一個(gè)代理線程(db2agent)負(fù)責(zé)處理來(lái)自客戶端的所有請(qǐng)求,但是當(dāng)某一時(shí)刻并發(fā)請(qǐng)求很多或者連接斷開(kāi)時(shí),重復(fù)地產(chǎn)生與銷毀代理線程會(huì)產(chǎn)生很大的系統(tǒng)開(kāi)銷,所以DB2服務(wù)器在啟動(dòng)時(shí)創(chuàng)建一個(gè)常連接池來(lái)避免重復(fù)地創(chuàng)建/銷毀代理線程,但是如果某一個(gè)處理的請(qǐng)求非常大時(shí),如果單個(gè)線程去處理效率比較低下,為了提高單個(gè)請(qǐng)求的處理能力,與客戶端通信的那個(gè)代理線程(db2agent)可以從線程池中額外召集幾個(gè)線程(db2agentp)來(lái)共同處理某個(gè)請(qǐng)求。
DB2的線程主要分為以下幾大類:
常連接池內(nèi)的線程db2agent和db2agentp:處理客戶端請(qǐng)求,比如從bufferpool中取請(qǐng)求的數(shù)據(jù),或者將請(qǐng)求拆解放到預(yù)?。╬refetch)隊(duì)列中供預(yù)取進(jìn)程(prefetcher)從磁盤取數(shù)據(jù)使用、或者將一些DML操作記錄到日志緩沖區(qū)(logbuffer)中等。
通信管理線程db2tcpcm和db2ipccm:負(fù)責(zé)對(duì)來(lái)自客戶端的連接請(qǐng)求進(jìn)行安全驗(yàn)證和檢查,并與客戶端實(shí)現(xiàn)三次握手連接。
數(shù)據(jù)頁(yè)預(yù)取進(jìn)程db2pfchr/頁(yè)面清理進(jìn)程db2pclnr:當(dāng)請(qǐng)求的數(shù)據(jù)不在bufferpool中時(shí),需要預(yù)取進(jìn)程db2pfchr通過(guò)異步讀數(shù)據(jù)的方式將將所需數(shù)據(jù)從磁盤讀入bufferpool中。
DB2對(duì)數(shù)據(jù)的操縱主要在bufferpool中進(jìn)行,當(dāng)插入某些數(shù)據(jù)或?qū)δ承?shù)據(jù)做了變更后形成臟頁(yè)(dirtypage)后,需要使用線程db2pclnr根據(jù)一定的機(jī)制定期清理bufferpool中的臟頁(yè),一方面持久化數(shù)據(jù),另一方面給bufferpool騰出更多可置換空間供使用。
日志頁(yè)讀寫進(jìn)程db2loggr/db2loggw:DB2采用的是讀日志優(yōu)先(Read logahead)的策略來(lái)持久化數(shù)據(jù),即在將insert/delete/update的數(shù)據(jù)寫入磁盤前,必須先將對(duì)這些操作的日志從日志緩沖區(qū)持久化到磁盤當(dāng)中,這個(gè)操作由db2loggw線程完成。
當(dāng)需要使用持久化到磁盤的日志恢復(fù)或撤銷某些操作時(shí),需要從磁盤中將對(duì)應(yīng)的日志讀入到日志緩沖區(qū)中,此時(shí)有db2loggr線程完成。
全局死鎖檢測(cè)線程db2dlock:該線程主要是檢測(cè)系統(tǒng)死鎖防止因?yàn)樗梨i造成的應(yīng)用不可用。
以下為部分常見(jiàn)DB2管理工具和實(shí)例:
該線程主要是檢測(cè)系統(tǒng)死鎖防止因?yàn)樗梨i造成的應(yīng)用不可用。
以下為部分常見(jiàn)DB2管理工具和實(shí)例:
DB2實(shí)例命令
原文發(fā)布時(shí)間為:2017-11-27
本文作者:enmotech
本文來(lái)自云棲社區(qū)合作伙伴“數(shù)據(jù)和云”,了解相關(guān)信息可以關(guān)注“數(shù)據(jù)和云”微信公眾號(hào)
如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:yqgroup@service.aliyun.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。