程序員必知的企業(yè)系統(tǒng)性能與擴(kuò)展
53 2017-04-19
前言
企業(yè)應(yīng)用需要以盡可能快的速度來存儲并檢索盡可能多的數(shù)據(jù),在應(yīng)用的性能管理中有兩個(gè)重要的指標(biāo),它們分別是響應(yīng)時(shí)間與吞吐量。
其中響應(yīng)時(shí)間越短,應(yīng)用的響應(yīng)度就越高,因此響應(yīng)時(shí)間是衡量性能的指標(biāo);而擴(kuò)展則指的是在保持響應(yīng)時(shí)間較短的同時(shí),提升系統(tǒng)的負(fù)載能力,因此吞吐量是可擴(kuò)展性的衡量指標(biāo)。
響應(yīng)時(shí)間與吞吐量
“事務(wù)響應(yīng)時(shí)間”是根據(jù)系統(tǒng)完成一個(gè)事務(wù)所花費(fèi)的時(shí)間來計(jì)算的,因此包含下面這些種類的分段時(shí)間:
獲取數(shù)據(jù)庫連接的時(shí)間;
將所有數(shù)據(jù)庫語句通過無線發(fā)送完畢的時(shí)間;
執(zhí)行所有輸入語句的時(shí)間;
將結(jié)果發(fā)回?cái)?shù)據(jù)庫客戶端所花費(fèi)的時(shí)間;
在釋放數(shù)據(jù)庫連接前,由于執(zhí)行應(yīng)用級計(jì)算而導(dǎo)致事務(wù)呈空閑狀態(tài)的時(shí)間。
吞吐率是根據(jù)輸入工作的完成速率來定義的。在數(shù)據(jù)庫概念中,吞吐量可以根據(jù)指定時(shí)間間隔內(nèi)所執(zhí)行的事務(wù)數(shù)量來計(jì)算。
從這個(gè)定義我們能夠推斷出:只要減少事務(wù)在執(zhí)行時(shí)所花費(fèi)的時(shí)間,系統(tǒng)就能處理更多的請求。
減少響應(yīng)時(shí)間會讓釋放數(shù)據(jù)庫連接的速度變得更快,因此每秒能處理的事務(wù)就越多。但在高并發(fā)環(huán)境中,只減少響應(yīng)時(shí)間是不夠的。為了保持響應(yīng)時(shí)間有一個(gè)固定的最大值,必須根據(jù)輸入請求的吞吐量相應(yīng)地增加系統(tǒng)的容量。增加更多的資源可以在一定程度內(nèi)提升可擴(kuò)展性,直到容量增益開始下降為止。
容量規(guī)劃使用了反饋驅(qū)動機(jī)制,需要持續(xù)對應(yīng)用進(jìn)行監(jiān)控,因此任何優(yōu)化都必須通過應(yīng)用的性能指標(biāo)來執(zhí)行。
向上擴(kuò)展與橫向擴(kuò)展
擴(kuò)展就是通過增加更多資源以提高容量。垂直擴(kuò)展(即向上擴(kuò)展)指的是在單臺機(jī)器上增加更多資源,而水平擴(kuò)展(即橫向擴(kuò)展)指的是增加可用機(jī)器的數(shù)量。
傳統(tǒng)上來說,為數(shù)據(jù)庫服務(wù)器增加更多的硬件資源是增加數(shù)據(jù)庫容量的最佳方案。關(guān)系數(shù)據(jù)庫是在70年代末出現(xiàn)的,25年之后根據(jù)摩爾定律的發(fā)展趨勢,數(shù)據(jù)庫供應(yīng)商搭上了硬件發(fā)展的東風(fēng)。
分布式系統(tǒng)比集中式系統(tǒng)更難管理,復(fù)雜度大大增加,這就是為什么水平擴(kuò)展比垂直擴(kuò)展更具有挑戰(zhàn)性的原因。另一方面,配置一臺專用的高性能服務(wù)器,其價(jià)格足以購買多臺商品機(jī)——而后者可用資源(CPU、內(nèi)存、硬盤存儲器)加起來遠(yuǎn)比單個(gè)專用服務(wù)器要多得多。在決定哪種擴(kuò)展方法更適合指定的企業(yè)系統(tǒng)時(shí),價(jià)格(包括硬件與證書授權(quán))與固有的開發(fā)運(yùn)營費(fèi)用都要納入考量。
構(gòu)建在許多開源項(xiàng)目(比如PHP,MySQL)之上的Facebook就使用了水平擴(kuò)展的架構(gòu),以適應(yīng)它那巨大的流量。而StackOverflow則是垂直擴(kuò)展架構(gòu)的最佳范例,在一篇博文里,JeffAtwood解釋道:Windows與SQLServer授權(quán)的價(jià)格也是他們不選擇水平擴(kuò)展方式的原因之一。
無論效果有多強(qiáng)大,一個(gè)專用的服務(wù)器仍只是一個(gè)單獨(dú)的故障點(diǎn),若系統(tǒng)可用性出了問題,吞吐量就會降到零。因此在大多企業(yè)系統(tǒng)中,對數(shù)據(jù)庫復(fù)制是有強(qiáng)制要求的。
主從復(fù)制
主從復(fù)制方案很適合讀寫比例較高的企業(yè)系統(tǒng),可以提高其可用性。
主節(jié)點(diǎn)負(fù)責(zé)記錄,它也是唯一接受寫入的節(jié)點(diǎn),在主節(jié)點(diǎn)上執(zhí)行的所有記錄修改會復(fù)制到從節(jié)點(diǎn)上。二進(jìn)制復(fù)制使用了主節(jié)點(diǎn)預(yù)寫式日志(WAL),而基于SQL語句的復(fù)制則在從節(jié)點(diǎn)上完全重演主節(jié)點(diǎn)的操作。
異步復(fù)制非常常見——特別是在有許多從節(jié)點(diǎn)要更新的情況下。雖然從節(jié)點(diǎn)的更新速度可能會落后于主節(jié)點(diǎn),但最終結(jié)果是一致的。在主節(jié)點(diǎn)崩潰的情況下,整個(gè)集群會從可用的從節(jié)點(diǎn)中選出新的主節(jié)點(diǎn)(一般是更新記錄最新的那個(gè)節(jié)點(diǎn))。
因?yàn)橹鞴?jié)點(diǎn)不會立刻進(jìn)行選舉,因此異步復(fù)制拓?fù)浣Y(jié)構(gòu)也被稱為熱備用。
大多數(shù)據(jù)庫系統(tǒng)允許有一個(gè)同步的從節(jié)點(diǎn),代價(jià)是增加響應(yīng)時(shí)間(主節(jié)點(diǎn)必須無停頓地同步通知從節(jié)點(diǎn)進(jìn)行復(fù)制)。在主節(jié)點(diǎn)發(fā)生故障的情況下,自動故障轉(zhuǎn)移機(jī)制可以將同步的從節(jié)點(diǎn)提升為新的主節(jié)點(diǎn)。
擁有一個(gè)同步的從節(jié)點(diǎn)可以在主節(jié)點(diǎn)發(fā)生故障的情況下確保系統(tǒng)數(shù)據(jù)一致,因?yàn)檫@個(gè)同步從節(jié)點(diǎn)是完全復(fù)制主節(jié)點(diǎn)的。同步主從復(fù)制也被稱為熱備份拓?fù)洌驗(yàn)橥綇墓?jié)點(diǎn)時(shí)刻準(zhǔn)備著頂上主節(jié)點(diǎn)的位置。
如果只有異步從節(jié)點(diǎn)可用,新選舉出來的從節(jié)點(diǎn)可能會比發(fā)生故障的主節(jié)點(diǎn)更新速度慢,在這種情況下系統(tǒng)用一致性與持久性換取了更低的延遲與更高的吞吐量。
除了解決單點(diǎn)故障的問題之外,數(shù)據(jù)庫復(fù)制也能增加事務(wù)的吞吐量。在主從拓?fù)渲?,從?jié)點(diǎn)可以接受只讀事務(wù),因此可以分流讀取的流量。增加從節(jié)點(diǎn)的可用只讀連接,可以減少主節(jié)點(diǎn)的資源競爭,反過來也能減少讀寫事務(wù)的響應(yīng)時(shí)間。如果主節(jié)點(diǎn)不能再與一直增加的讀寫流量同步,使用多個(gè)主節(jié)點(diǎn)進(jìn)行復(fù)制也許是更好的選擇。
多個(gè)主節(jié)點(diǎn)復(fù)制
在多個(gè)主節(jié)點(diǎn)的復(fù)制方案中,所有節(jié)點(diǎn)都是平等的,都可以接受只讀與讀寫事務(wù)。這樣一來將負(fù)載量分配到多個(gè)節(jié)點(diǎn)上,就可以只增加事務(wù)的吞吐量,并減少響應(yīng)時(shí)間了。
然而,由于分布式系統(tǒng)都是與權(quán)衡相關(guān)的,在多主節(jié)點(diǎn)復(fù)制方案中想要確保數(shù)據(jù)的一致性是很有挑戰(zhàn)性的,因?yàn)閱我豢尚诺膩碓纯刹恢挂粋€(gè)。由于同樣的數(shù)據(jù)可以在不同節(jié)點(diǎn)上同時(shí)修改,因此可能會造成更新沖突的問題。在這種復(fù)制方案中,可以考慮采用避免沖突的方式,或者在檢測到?jīng)_突發(fā)生后,自動應(yīng)用沖突解決算法的方式來解決問題。
主節(jié)點(diǎn)負(fù)責(zé)記錄,它也是唯一接受寫入的節(jié)點(diǎn),在主節(jié)點(diǎn)上執(zhí)行的所有記錄修改會復(fù)制到從節(jié)點(diǎn)上。二進(jìn)制復(fù)制使用了主節(jié)點(diǎn)預(yù)寫式日志(WAL),而基于SQL語句的復(fù)制則在從節(jié)點(diǎn)上完全重演主節(jié)點(diǎn)的操作。
異步復(fù)制非常常見——特別是在有許多從節(jié)點(diǎn)要更新的情況下。雖然從節(jié)點(diǎn)的更新速度可能會落后于主節(jié)點(diǎn),但最終結(jié)果是一致的。在主節(jié)點(diǎn)崩潰的情況下,整個(gè)集群會從可用的從節(jié)點(diǎn)中選出新的主節(jié)點(diǎn)(一般是更新記錄最新的那個(gè)節(jié)點(diǎn))。
因?yàn)橹鞴?jié)點(diǎn)不會立刻進(jìn)行選舉,因此異步復(fù)制拓?fù)浣Y(jié)構(gòu)也被稱為熱備用。
大多數(shù)據(jù)庫系統(tǒng)允許有一個(gè)同步的從節(jié)點(diǎn),代價(jià)是增加響應(yīng)時(shí)間(主節(jié)點(diǎn)必須無停頓地同步通知從節(jié)點(diǎn)進(jìn)行復(fù)制)。在主節(jié)點(diǎn)發(fā)生故障的情況下,自動故障轉(zhuǎn)移機(jī)制可以將同步的從節(jié)點(diǎn)提升為新的主節(jié)點(diǎn)。
擁有一個(gè)同步的從節(jié)點(diǎn)可以在主節(jié)點(diǎn)發(fā)生故障的情況下確保系統(tǒng)數(shù)據(jù)一致,因?yàn)檫@個(gè)同步從節(jié)點(diǎn)是完全復(fù)制主節(jié)點(diǎn)的。同步主從復(fù)制也被稱為熱備份拓?fù)?,因?yàn)橥綇墓?jié)點(diǎn)時(shí)刻準(zhǔn)備著頂上主節(jié)點(diǎn)的位置。
如果只有異步從節(jié)點(diǎn)可用,新選舉出來的從節(jié)點(diǎn)可能會比發(fā)生故障的主節(jié)點(diǎn)更新速度慢,在這種情況下系統(tǒng)用一致性與持久性換取了更低的延遲與更高的吞吐量。
除了解決單點(diǎn)故障的問題之外,數(shù)據(jù)庫復(fù)制也能增加事務(wù)的吞吐量。在主從拓?fù)渲?,從?jié)點(diǎn)可以接受只讀事務(wù),因此可以分流讀取的流量。增加從節(jié)點(diǎn)的可用只讀連接,可以減少主節(jié)點(diǎn)的資源競爭,反過來也能減少讀寫事務(wù)的響應(yīng)時(shí)間。如果主節(jié)點(diǎn)不能再與一直增加的讀寫流量同步,使用多個(gè)主節(jié)點(diǎn)進(jìn)行復(fù)制也許是更好的選擇。
多個(gè)主節(jié)點(diǎn)復(fù)制
在多個(gè)主節(jié)點(diǎn)的復(fù)制方案中,所有節(jié)點(diǎn)都是平等的,都可以接受只讀與讀寫事務(wù)。這樣一來將負(fù)載量分配到多個(gè)節(jié)點(diǎn)上,就可以只增加事務(wù)的吞吐量,并減少響應(yīng)時(shí)間了。
然而,由于分布式系統(tǒng)都是與權(quán)衡相關(guān)的,在多主節(jié)點(diǎn)復(fù)制方案中想要確保數(shù)據(jù)的一致性是很有挑戰(zhàn)性的,因?yàn)閱我豢尚诺膩碓纯刹恢挂粋€(gè)。由于同樣的數(shù)據(jù)可以在不同節(jié)點(diǎn)上同時(shí)修改,因此可能會造成更新沖突的問題。在這種復(fù)制方案中,可以考慮采用避免沖突的方式,或者在檢測到?jīng)_突發(fā)生后,自動應(yīng)用沖突解決算法的方式來解決問題。
為了避免沖突,可以使用兩階段提交協(xié)議,以確保在分布式事務(wù)中,要么所有的參與進(jìn)程都提交事務(wù)成功,要么都取消事務(wù)。這種設(shè)計(jì)允許所有節(jié)點(diǎn)隨時(shí)執(zhí)行同步,不過相對的,也會造成事務(wù)響應(yīng)的時(shí)間增加(由于降低了寫入操作的速度)。
如果節(jié)點(diǎn)分布在廣域網(wǎng)(WAN)上,同步延遲可能會大幅增加。如果由于某個(gè)節(jié)點(diǎn)變得不可訪問而造成同步失敗,那么所有主節(jié)點(diǎn)上的事務(wù)都會執(zhí)行回滾。
盡管從數(shù)據(jù)一致性的角度來看,避免沖突是更好的辦法,但同步復(fù)制可能會導(dǎo)致事務(wù)響應(yīng)的時(shí)間很長。而異步復(fù)制在吞吐量方面更為優(yōu)秀,前提是必須要解決更新沖突的問題。異步多主節(jié)點(diǎn)復(fù)制需要有檢測沖突的機(jī)制以及自動解決沖突的算法,一旦檢測到?jīng)_突,自動解決方案就會嘗試合并這兩個(gè)沖突分支,在失敗的情況下會請求人工介入。
分片
如果數(shù)據(jù)的規(guī)模超出了復(fù)制多節(jié)點(diǎn)環(huán)境的總?cè)萘浚蟹謹(jǐn)?shù)據(jù)就會變得無可避免。分片指的是將數(shù)據(jù)分布到多個(gè)節(jié)點(diǎn)上,這樣每個(gè)實(shí)例就只包含整體數(shù)據(jù)的一個(gè)子集。
一般來講,關(guān)系數(shù)據(jù)庫提供了水平分區(qū)的方式,即在同一個(gè)數(shù)據(jù)庫服務(wù)器上將數(shù)據(jù)分布到多個(gè)表格中。與水平分區(qū)相反,分片則需要一個(gè)分布式的系統(tǒng)拓?fù)浣Y(jié)構(gòu),以便數(shù)據(jù)可以分布在多臺機(jī)器上。
每個(gè)分片必須是獨(dú)立的,因?yàn)橛脩羰聞?wù)只能使用單個(gè)分片內(nèi)的數(shù)據(jù)??绶制B接一般是不允許的,因?yàn)榉植际郊渔i和網(wǎng)絡(luò)開銷的成本都可能會導(dǎo)致事務(wù)的響應(yīng)時(shí)間很長。
通過減少每個(gè)節(jié)點(diǎn)的數(shù)據(jù)大小,就能減少索引所占的空間。請求的數(shù)據(jù)越少,事務(wù)的響應(yīng)時(shí)間也就越短。
典型的分片拓?fù)浣Y(jié)構(gòu)至少包括兩個(gè)單獨(dú)分開的數(shù)據(jù)中心:
每個(gè)數(shù)據(jù)中心都可以提供一個(gè)專門的地理區(qū)域,這樣就可以跨地理區(qū)域來平衡負(fù)載。并非所有表格都需要執(zhí)行跨分片分區(qū),較小的那些會復(fù)制到每個(gè)分區(qū)上。為了保持分片同步,需要采用異步復(fù)制機(jī)制。
在之前的圖表中,系統(tǒng)將國家表格從一個(gè)數(shù)據(jù)中心鏡像到另一個(gè),分區(qū)只在用戶表格中實(shí)現(xiàn)。為了避免對跨分片處理數(shù)據(jù)產(chǎn)生需求,每個(gè)用戶及其相關(guān)的所有數(shù)據(jù)都只會存放在同一個(gè)數(shù)據(jù)中心上。
在尋求增加系統(tǒng)容量的解決方案中,分片一般是在其他選項(xiàng)都不可用時(shí)的最后選擇——其他選項(xiàng)包括:
優(yōu)化數(shù)據(jù)層,縮短事務(wù)響應(yīng)時(shí)間;
在成本合算的配置前提下,對每個(gè)復(fù)制節(jié)點(diǎn)進(jìn)行擴(kuò)展;
增加更多復(fù)制節(jié)點(diǎn),直到同步延遲開始降到可接受閾值之下。
掃一掃
獲取更多福利
獵學(xué)網(wǎng)企業(yè)微信
獵學(xué)網(wǎng)訂閱號
獵學(xué)網(wǎng)服務(wù)號