數(shù)據(jù)庫(kù)讀寫(xiě)壓力大——讀寫(xiě)分離
一、采用數(shù)據(jù)庫(kù)作為讀庫(kù)
讀多寫(xiě)少,那么多加一個(gè)數(shù)據(jù)庫(kù)作為讀庫(kù),只用來(lái)提供讀服務(wù)。
問(wèn)題:
1、數(shù)據(jù)怎么復(fù)制到讀庫(kù)?
數(shù)據(jù)庫(kù)系統(tǒng)一般都提供了數(shù)據(jù)復(fù)制的功能,直接使用數(shù)據(jù)庫(kù)系統(tǒng)的自身機(jī)制。
2、數(shù)據(jù)復(fù)制時(shí)延問(wèn)題?
數(shù)據(jù)復(fù)制延遲帶來(lái)的就是短期的數(shù)據(jù)不一致。例如我們修改了用戶信息,在這個(gè)信息還沒(méi)有復(fù)制到讀庫(kù)是,我們從讀庫(kù)上讀出來(lái)的信息就不是最新的。
3、對(duì)結(jié)構(gòu)變化的影響?
我們的應(yīng)用需要根據(jù)不同的情況來(lái)選擇不同的數(shù)據(jù)庫(kù)源。寫(xiě)操作要走主庫(kù),事務(wù)中的讀也要走主庫(kù),即使不是事務(wù)中的讀,考慮到備庫(kù)的數(shù)據(jù)延遲,不同業(yè)務(wù)下選擇也會(huì)有差異。
二、搜索引擎也是一個(gè)讀庫(kù)
大型網(wǎng)站的站內(nèi)搜索功能
搜索功能有幾種實(shí)現(xiàn)方式:
1、數(shù)據(jù)庫(kù)中的like功能(代價(jià)大)
2、使用搜索引擎的倒排表方式(速度快)
搜索引擎要工作,首要一點(diǎn)是需要根據(jù)被搜索的數(shù)據(jù)來(lái)構(gòu)建索引(數(shù)據(jù)復(fù)制)。
引入了搜索引擎之后,我們的應(yīng)用也需要知道什么數(shù)據(jù)應(yīng)該做搜索,什么數(shù)據(jù)應(yīng)該走數(shù)據(jù)庫(kù)。

搜索集群的使用方式和讀庫(kù)是一樣的。只是構(gòu)建索引的過(guò)程基恩都是需要我們自己來(lái)實(shí)現(xiàn)的。
從兩個(gè)維度對(duì)搜索系統(tǒng)構(gòu)建索引的方式進(jìn)行劃分:
按照全量/增量劃分:
全量方式用于第一次建立索引,而增量方式用戶在全量的基礎(chǔ)上持續(xù)更新索引。
按照實(shí)時(shí)/非實(shí)時(shí)劃分:
體現(xiàn)在索引更新的時(shí)間上。
三、加速數(shù)據(jù)讀取——增加緩存
1、數(shù)據(jù)緩存
緩存系統(tǒng)一般是用來(lái)保存和查詢鍵值對(duì)的。緩存中放的是“熱”數(shù)據(jù)而不是全部的數(shù)據(jù),填充方式就是通過(guò)應(yīng)用完成的,即應(yīng)用訪問(wèn)緩存,如果數(shù)據(jù)不存在,則從數(shù)據(jù)庫(kù)讀出數(shù)據(jù)后放入緩存。隨著時(shí)間的推移,當(dāng)緩存容量不夠需要清理數(shù)據(jù)時(shí),最近不被訪問(wèn)的數(shù)據(jù)就被清除了。
使用這種方式有一個(gè)要求,即根據(jù)數(shù)據(jù)庫(kù)記錄的變化去更新緩存的代碼要能夠理解業(yè)務(wù)邏輯。
2、頁(yè)面緩存
采用ESI或者類似的思路來(lái)做,也可uiba頁(yè)面緩存與頁(yè)面渲染放在一起處理。
web服務(wù)器前端有Apache/Nginx服務(wù)器。
對(duì)于ESI的處理是在Apache中進(jìn)行。web服務(wù)器產(chǎn)生的請(qǐng)求響應(yīng)結(jié)果返回Apache,Apache中的模塊會(huì)對(duì)響應(yīng)結(jié)果做處理解析找到ESI標(biāo)簽,然后去緩存中獲取這些ESI標(biāo)簽對(duì)應(yīng)的內(nèi)容,如果這些內(nèi)容不存在,那么Apache中的模塊會(huì)通過(guò)web服務(wù)器去渲染這些內(nèi)容,并且把結(jié)果放入緩存中,用內(nèi)容換掉ESI
標(biāo)簽,返回給客戶的瀏覽器。
四、彌補(bǔ)關(guān)系型數(shù)據(jù)庫(kù)的不足——分布式存儲(chǔ)系統(tǒng)
常見(jiàn)的分布式系統(tǒng)有分布式文件系統(tǒng)、福不是Key-value系統(tǒng)和分布式系統(tǒng)和分布式數(shù)據(jù)庫(kù)。
分布式存儲(chǔ)系統(tǒng)自身起到了存儲(chǔ)的作用,也就是提供數(shù)據(jù)的讀寫(xiě)支持。相對(duì)于讀寫(xiě)分離中的讀“源”,分布式存儲(chǔ)系統(tǒng)更多的是直接替代了主庫(kù)。
五、讀寫(xiě)分離后,主庫(kù)中業(yè)務(wù)的數(shù)據(jù)還是在一個(gè)數(shù)據(jù)庫(kù)中,這個(gè)數(shù)據(jù)庫(kù)的壓力還是持續(xù)增加。解決這個(gè)問(wèn)題,我們有數(shù)據(jù)垂直拆分和水平拆分兩種選擇。
1、垂直拆分
專庫(kù)專用,不同的業(yè)務(wù)數(shù)據(jù)拆分 到不同的數(shù)據(jù)庫(kù),適用于業(yè)務(wù)過(guò)多
缺點(diǎn):應(yīng)用需要配置多個(gè)數(shù)據(jù)源,這就增加了所需的配置,但是帶來(lái)每個(gè)數(shù)據(jù)庫(kù)連接池的隔離
如何處理跨業(yè)務(wù)的事務(wù)?
一種是使用分布式事務(wù),其性能要明顯低于之前的單機(jī)事務(wù)。
另一種是去掉事務(wù)或者不去追求強(qiáng)事務(wù)支持,則原來(lái)在單庫(kù)中可以使用的表關(guān)聯(lián)的查詢就需要改變實(shí)現(xiàn)了。
2、數(shù)據(jù)水平劃分
把同一個(gè)表的數(shù)據(jù)拆到兩個(gè)數(shù)據(jù)庫(kù)中。適用于數(shù)據(jù)量大的數(shù)據(jù)庫(kù)
|