這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)內(nèi)部緩存的使用示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都近千家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。我們的Web站點(diǎn)隨著訪問量的上升,會(huì)遇到很多的挑戰(zhàn),解決這些問題不僅僅是擴(kuò)容機(jī)器這么簡(jiǎn)單,建立和使用合適的緩存機(jī)制才是根本。
最開始,我們的Web系統(tǒng)架構(gòu)可能是這樣的,每個(gè)環(huán)節(jié),都可能只有1臺(tái)機(jī)器。
一、 MySQL數(shù)據(jù)庫(kù)內(nèi)部緩存使用
MySQL的緩存機(jī)制,就從先從MySQL內(nèi)部開始,下面的內(nèi)容將以最常見的InnoDB存儲(chǔ)引擎為主。
1. 建立恰當(dāng)?shù)乃饕?/p>
最簡(jiǎn)單的是建立索引,索引在表數(shù)據(jù)比較大的時(shí)候,起到快速檢索數(shù)據(jù)的作用,但是成本也是有的。首先,占用了一定的磁盤空間,其中組合索引最突出,使用需要謹(jǐn)慎,它產(chǎn)生的索引甚至?xí)仍磾?shù)據(jù)更大。其次,建立索引之后的數(shù)據(jù)insert/update/delete等操作,因?yàn)樾枰略瓉淼乃饕?,耗時(shí)會(huì)增加。當(dāng)然,實(shí)際上我們的系統(tǒng)從總體來說,是以select查詢操作居多,因此,索引的使用仍然對(duì)系統(tǒng)性能有大幅提升的作用。
2. 數(shù)據(jù)庫(kù)連接線程池緩存
如果,每一個(gè)數(shù)據(jù)庫(kù)操作請(qǐng)求都需要?jiǎng)?chuàng)建和銷毀連接的話,對(duì)數(shù)據(jù)庫(kù)來說,無疑也是一種巨大的開銷。為了減少這類型的開銷,可以在MySQL中配置thread_cache_size來表示保留多少線程用于復(fù)用。線程不夠的時(shí)候,再創(chuàng)建,空閑過多的時(shí)候,則銷毀。
其實(shí),還有更為激進(jìn)一點(diǎn)的做法,使用pconnect(數(shù)據(jù)庫(kù)長(zhǎng)連接),線程一旦創(chuàng)建在很長(zhǎng)時(shí)間內(nèi)都保持著。但是,在訪問量比較大,機(jī)器比較多的情況下,這種用法很可能會(huì)導(dǎo)致“數(shù)據(jù)庫(kù)連接數(shù)耗盡”,因?yàn)榻⑦B接并不回收,最終達(dá)到數(shù)據(jù)庫(kù)的max_connections(大連接數(shù))。因此,長(zhǎng)連接的用法通常需要在CGI和MySQL之間實(shí)現(xiàn)一個(gè)“連接池”服務(wù),控制CGI機(jī)器“盲目”創(chuàng)建連接數(shù)。
3. Innodb緩存設(shè)置(innodb_buffer_pool_size)
innodb_buffer_pool_size這是個(gè)用來保存索引和數(shù)據(jù)的內(nèi)存緩存區(qū),如果機(jī)器是MySQL獨(dú)占的機(jī)器,一般推薦為機(jī)器物理內(nèi)存的80%。在取表數(shù)據(jù)的場(chǎng)景中,它可以減少磁盤IO。一般來說,這個(gè)值設(shè)置越大,cache命中率會(huì)越高。
4. 分庫(kù)/分表/分區(qū)。
MySQL數(shù)據(jù)庫(kù)表一般承受數(shù)據(jù)量在百萬級(jí)別,再往上增長(zhǎng),各項(xiàng)性能將會(huì)出現(xiàn)大幅度下降,因此,當(dāng)我們預(yù)見數(shù)據(jù)量會(huì)超過這個(gè)量級(jí)的時(shí)候,建議進(jìn)行分庫(kù)/分表/分區(qū)等操作。最好的做法,是服務(wù)在搭建之初就設(shè)計(jì)為分庫(kù)分表的存儲(chǔ)模式,從根本上杜絕中后期的風(fēng)險(xiǎn)。不過,會(huì)犧牲一些便利性,例如列表式的查詢,同時(shí),也增加了維護(hù)的復(fù)雜度。不過,到了數(shù)據(jù)量千萬級(jí)別或者以上的時(shí)候,我們會(huì)發(fā)現(xiàn),它們都是值得的。
二、 MySQL數(shù)據(jù)庫(kù)多臺(tái)服務(wù)搭建
1臺(tái)MySQL機(jī)器,實(shí)際上是高風(fēng)險(xiǎn)的單點(diǎn),因?yàn)槿绻鼟炝耍覀僕eb服務(wù)就不可用了。而且,隨著Web系統(tǒng)訪問量繼續(xù)增加,終于有一天,我們發(fā)現(xiàn)1臺(tái)MySQL服務(wù)器無法支撐下去,我們開始需要使用更多的MySQL機(jī)器。當(dāng)引入多臺(tái)MySQL機(jī)器的時(shí)候,很多新的問題又將產(chǎn)生。
1. 建立MySQL主從,從庫(kù)作為備份
這種做法純粹為了解決“單點(diǎn)故障”的問題,在主庫(kù)出故障的時(shí)候,切換到從庫(kù)。不過,這種做法實(shí)際上有點(diǎn)浪費(fèi)資源,因?yàn)閺膸?kù)實(shí)際上被閑著了。
2. MySQL讀寫分離,主庫(kù)寫,從庫(kù)讀。
兩臺(tái)數(shù)據(jù)庫(kù)做讀寫分離,主庫(kù)負(fù)責(zé)寫入類的操作,從庫(kù)負(fù)責(zé)讀的操作。并且,如果主庫(kù)發(fā)生故障,仍然不影響讀的操作,同時(shí)也可以將全部讀寫都臨時(shí)切換到從庫(kù)中(需要注意流量,可能會(huì)因?yàn)榱髁窟^大,把從庫(kù)也拖垮)。
3. 主主互備。
兩臺(tái)MySQL之間互為彼此的從庫(kù),同時(shí)又是主庫(kù)。這種方案,既做到了訪問量的壓力分流,同時(shí)也解決了“單點(diǎn)故障”問題。任何一臺(tái)故障,都還有另外一套可供使用的服務(wù)。
不過,這種方案,只能用在兩臺(tái)機(jī)器的場(chǎng)景。如果業(yè)務(wù)拓展還是很快的話,可以選擇將業(yè)務(wù)分離,建立多個(gè)主主互備。
三、 在Web服務(wù)器和數(shù)據(jù)庫(kù)之間建立緩存
實(shí)際上,解決大訪問量的問題,不能僅僅著眼于數(shù)據(jù)庫(kù)層面。根據(jù)“二八定律”,80%的請(qǐng)求只關(guān)注在20%的熱點(diǎn)數(shù)據(jù)上。因此,我們應(yīng)該建立Web服務(wù)器和數(shù)據(jù)庫(kù)之間的緩存機(jī)制。這種機(jī)制,可以用磁盤作為緩存,也可以用內(nèi)存緩存的方式。通過它們,將大部分的熱點(diǎn)數(shù)據(jù)查詢,阻擋在數(shù)據(jù)庫(kù)之前。
1. 頁面靜態(tài)化
用戶訪問網(wǎng)站的某個(gè)頁面,頁面上的大部分內(nèi)容在很長(zhǎng)一段時(shí)間內(nèi),可能都是沒有變化的。例如一篇新聞報(bào)道,一旦發(fā)布幾乎是不會(huì)修改內(nèi)容的。這樣的話,通過CGI生成的靜態(tài)html頁面緩存到Web服務(wù)器的磁盤本地。除了第一次,是通過動(dòng)態(tài)CGI查詢數(shù)據(jù)庫(kù)獲取之外,之后都直接將本地磁盤文件返回給用戶。
在Web系統(tǒng)規(guī)模比較小的時(shí)候,這種做法看似完美。但是,一旦Web系統(tǒng)規(guī)模變大,例如當(dāng)我有100臺(tái)的Web服務(wù)器的時(shí)候。那樣這些磁盤文件,將會(huì)有100份,這個(gè)是資源浪費(fèi),也不好維護(hù)。這個(gè)時(shí)候有人會(huì)想,可以集中一臺(tái)服務(wù)器存起來,呵呵,不如看看下面一種緩存方式吧,它就是這樣做的。
2. 單臺(tái)內(nèi)存緩存
通過頁面靜態(tài)化的例子中,我們可以知道將“緩存”搭建在Web機(jī)器本機(jī)是不好維護(hù)的,會(huì)帶來更多問題(實(shí)際上,通過PHP的apc拓展,可通過Key/value操作Web服務(wù)器的本機(jī)內(nèi)存)。因此,我們選擇搭建的內(nèi)存緩存服務(wù),也必須是一個(gè)獨(dú)立的服務(wù)。
內(nèi)存緩存的選擇,主要有redis/memcache。從性能上說,兩者差別不大,從功能豐富程度上說,Redis更勝一籌。
3. 內(nèi)存緩存集群
當(dāng)我們搭建單臺(tái)內(nèi)存緩存完畢,我們又會(huì)面臨單點(diǎn)故障的問題,因此,我們必須將它變成一個(gè)集群。簡(jiǎn)單的做法,是給他增加一個(gè)slave作為備份機(jī)器。但是,如果請(qǐng)求量真的很多,我們發(fā)現(xiàn)cache命中率不高,需要更多的機(jī)器內(nèi)存呢?因此,我們更建議將它配置成一個(gè)集群。例如,類似redis cluster。
Redis cluster集群內(nèi)的Redis互為多組主從,同時(shí)每個(gè)節(jié)點(diǎn)都可以接受請(qǐng)求,在拓展集群的時(shí)候比較方便??蛻舳丝梢韵蛉我庖粋€(gè)節(jié)點(diǎn)發(fā)送請(qǐng)求,如果是它的“負(fù)責(zé)”的內(nèi)容,則直接返回內(nèi)容。否則,查找實(shí)際負(fù)責(zé)Redis節(jié)點(diǎn),然后將地址告知客戶端,客戶端重新請(qǐng)求。
對(duì)于使用緩存服務(wù)的客戶端來說,這一切是透明的。
內(nèi)存緩存服務(wù)在切換的時(shí)候,是有一定風(fēng)險(xiǎn)的。從A集群切換到B集群的過程中,必須保證B集群提前做好“預(yù)熱”(B集群的內(nèi)存中的熱點(diǎn)數(shù)據(jù),應(yīng)該盡量與A集群相同,否則,切換的一瞬間大量請(qǐng)求內(nèi)容,在B集群的內(nèi)存緩存中查找不到,流量直接沖擊后端的數(shù)據(jù)庫(kù)服務(wù),很可能導(dǎo)致數(shù)據(jù)庫(kù)宕機(jī))。
4. 減少數(shù)據(jù)庫(kù)“寫”
上面的機(jī)制,都實(shí)現(xiàn)減少數(shù)據(jù)庫(kù)的“讀”的操作,但是,寫的操作也是一個(gè)大的壓力。寫的操作,雖然無法減少,但是可以通過合并請(qǐng)求,來起到減輕壓力的效果。這個(gè)時(shí)候,我們就需要在內(nèi)存緩存集群和數(shù)據(jù)庫(kù)集群之間,建立一個(gè)修改同步機(jī)制。
先將修改請(qǐng)求生效在cache中,讓外界查詢顯示正常,然后將這些sql修改放入到一個(gè)隊(duì)列中存儲(chǔ)起來,隊(duì)列滿或者每隔一段時(shí)間,合并為一個(gè)請(qǐng)求到數(shù)據(jù)庫(kù)中更新數(shù)據(jù)庫(kù)。
除了上述通過改變系統(tǒng)架構(gòu)的方式提升寫的性能外,MySQL本身也可以通過配置參數(shù)innodb_flush_log_at_trx_commit來調(diào)整寫入磁盤的策略。如果機(jī)器成本允許,從硬件層面解決問題,可以選擇老一點(diǎn)的RAID(Redundant Arrays of independent Disks,磁盤列陣)或者比較新的SSD(Solid State Drives,固態(tài)硬盤)。
5. NoSQL存儲(chǔ)
不管數(shù)據(jù)庫(kù)的讀還是寫,當(dāng)流量再進(jìn)一步上漲,終會(huì)達(dá)到“人力有窮時(shí)”的場(chǎng)景。繼續(xù)加機(jī)器的成本比較高,并且不一定可以真正解決問題的時(shí)候。這個(gè)時(shí)候,部分核心數(shù)據(jù),就可以考慮使用NoSQL的數(shù)據(jù)庫(kù)。NoSQL存儲(chǔ),大部分都是采用key-value的方式,這里比較推薦使用上面介紹過Redis,Redis本身是一個(gè)內(nèi)存cache,同時(shí)也可以當(dāng)做一個(gè)存儲(chǔ)來使用,讓它直接將數(shù)據(jù)落地到磁盤。
這樣的話,我們就將數(shù)據(jù)庫(kù)中某些被頻繁讀寫的數(shù)據(jù),分離出來,放在我們新搭建的Redis存儲(chǔ)集群中,又進(jìn)一步減輕原來MySQL數(shù)據(jù)庫(kù)的壓力,同時(shí)因?yàn)镽edis本身是個(gè)內(nèi)存級(jí)別的Cache,讀寫的性能都會(huì)大幅度提升。
國(guó)內(nèi)一線互聯(lián)網(wǎng)公司,架構(gòu)上采用的解決方案很多是類似于上述方案,不過,使用的cache服務(wù)卻不一定是Redis,他們會(huì)有更豐富的其他選擇,甚至根據(jù)自身業(yè)務(wù)特點(diǎn)開發(fā)出自己的NoSQL服務(wù)。
6. 空節(jié)點(diǎn)查詢問題
當(dāng)我們搭建完前面所說的全部服務(wù),認(rèn)為Web系統(tǒng)已經(jīng)很強(qiáng)的時(shí)候。我們還是那句話,新的問題還是會(huì)來的??展?jié)點(diǎn)查詢,是指那些數(shù)據(jù)庫(kù)中根本不存在的數(shù)據(jù)請(qǐng)求。例如,我請(qǐng)求查詢一個(gè)不存在人員信息,系統(tǒng)會(huì)從各級(jí)緩存逐級(jí)查找,最后查到到數(shù)據(jù)庫(kù)本身,然后才得出查找不到的結(jié)論,返回給前端。因?yàn)楦骷?jí)cache對(duì)它無效,這個(gè)請(qǐng)求是非常消耗系統(tǒng)資源的,而如果大量的空節(jié)點(diǎn)查詢,是可以沖擊到系統(tǒng)服務(wù)的。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享MySQL數(shù)據(jù)庫(kù)內(nèi)部緩存的使用示例內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,詳細(xì)的解決方法等著你來學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:MySQL數(shù)據(jù)庫(kù)內(nèi)部緩存的使用示例-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article32/gcipc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容