本文將從單機(jī)MySQL的場(chǎng)景出發(fā),簡(jiǎn)述一下隨著網(wǎng)站的訪問(wèn)量越來(lái)越大,數(shù)據(jù)庫(kù)部署的演進(jìn)過(guò)程,到為什么要用MySQL的必要性。
創(chuàng)新互聯(lián)專(zhuān)注于石門(mén)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供石門(mén)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),石門(mén)網(wǎng)站制作、石門(mén)網(wǎng)頁(yè)設(shè)計(jì)、石門(mén)網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造石門(mén)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供石門(mén)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
大數(shù)據(jù)時(shí)代的數(shù)據(jù)有3V的特點(diǎn):海量Volume、多樣Variety、實(shí)時(shí)Velocity。
互聯(lián)網(wǎng)網(wǎng)站需求的3高的特點(diǎn):高并發(fā)、高可擴(kuò)、高性能。
一、單機(jī)MySql
當(dāng)一個(gè)網(wǎng)站的訪問(wèn)量不大時(shí),用單個(gè)數(shù)據(jù)庫(kù)完全可以輕松應(yīng)付。
在那個(gè)時(shí)候,更多的都是靜態(tài)網(wǎng)頁(yè),動(dòng)態(tài)交互類(lèi)型的網(wǎng)站不多。
上述架構(gòu)下,我們來(lái)看看數(shù)據(jù)存儲(chǔ)的瓶頸是什么?
1.數(shù)據(jù)量的總大小 一個(gè)機(jī)器放不下時(shí)
2.數(shù)據(jù)的索引(B+ Tree)一個(gè)機(jī)器的內(nèi)存放不下時(shí)
3.訪問(wèn)量(讀寫(xiě)混合)一個(gè)實(shí)例不能承受
如果滿(mǎn)足了上述1 or 3個(gè),進(jìn)化......
二、Memcached(緩存)+Mysql+垂直拆分
后來(lái),隨著訪問(wèn)量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫(kù)上都開(kāi)始出現(xiàn)了性能問(wèn)題,web程序不再僅僅專(zhuān)注在功能上,同時(shí)也在追求性能。程序員們開(kāi)始大量的使用緩存技術(shù)來(lái)緩解數(shù)據(jù)庫(kù)的壓力,優(yōu)化數(shù)據(jù)庫(kù)的結(jié)構(gòu)和索引。開(kāi)始比較流行的是通過(guò)文件緩存來(lái)緩解數(shù)據(jù)庫(kù)壓力,但是當(dāng)訪問(wèn)量繼續(xù)增大的時(shí)候,多臺(tái)web機(jī)器通過(guò)文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個(gè)時(shí)候,Memcached就自然的成為一個(gè)非常時(shí)尚的技術(shù)產(chǎn)品。
Memcached作為一個(gè)獨(dú)立的分布式的緩存服務(wù)器,為多個(gè)web服務(wù)器提供了一個(gè)共享的高性能緩存服務(wù),在Memcached服務(wù)器上,又發(fā)展了根據(jù)hash算法來(lái)進(jìn)行多臺(tái)Memcached緩存服務(wù)的擴(kuò)展,然后又出現(xiàn)了一致性hash來(lái)解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來(lái)的大量緩存失效的弊端
三、MySql主從復(fù)制讀寫(xiě)分離
由于數(shù)據(jù)庫(kù)的寫(xiě)入壓力增加,Memcached只能緩解數(shù)據(jù)庫(kù)的讀取壓力。讀寫(xiě)集中在一個(gè)數(shù)據(jù)庫(kù)上讓數(shù)據(jù)庫(kù)不堪重負(fù),大部分網(wǎng)站開(kāi)始使用主從復(fù)制技術(shù)來(lái)達(dá)到讀寫(xiě)分離,以提高讀寫(xiě)性能和讀庫(kù)的可擴(kuò)展性。Mysql的master-slave模式成為這個(gè)時(shí)候的網(wǎng)站標(biāo)配了。
四、分庫(kù)分表+水平拆分+Mysql集群
在Memcached的高速緩存,MySQL的主從復(fù)制,讀寫(xiě)分離的基礎(chǔ)之上,這時(shí)MySQL主庫(kù)的寫(xiě)壓力開(kāi)始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會(huì)出現(xiàn)嚴(yán)重的鎖問(wèn)題,大量的高并發(fā)MySQL應(yīng)用開(kāi)始使用InnoDB引擎代替MyISAM。
同時(shí),開(kāi)始流行使用分表分庫(kù)來(lái)緩解寫(xiě)壓力和數(shù)據(jù)增長(zhǎng)的擴(kuò)展問(wèn)題。這個(gè)時(shí)候,分表分庫(kù)成了一個(gè)熱門(mén)技術(shù),是面試的熱門(mén)問(wèn)題也是業(yè)界討論的熱門(mén)技術(shù)問(wèn)題。也就在這個(gè)時(shí)候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術(shù)實(shí)力一般的公司帶來(lái)了希望。雖然MySQL推出了MySQL Cluster集群,但性能也不能很好滿(mǎn)足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。
五、Mysql的擴(kuò)展性瓶頸
MySQL數(shù)據(jù)庫(kù)也經(jīng)常存儲(chǔ)一些大文本字段,導(dǎo)致數(shù)據(jù)庫(kù)表非常的大,在做數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候就導(dǎo)致非常的慢,不容易快速恢復(fù)數(shù)據(jù)庫(kù)。比如1000萬(wàn)4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小。關(guān)系數(shù)據(jù)庫(kù)很強(qiáng)大,但是它并不能很好的應(yīng)付所有的應(yīng)用場(chǎng)景。MySQL的擴(kuò)展性差(需要復(fù)雜的技術(shù)來(lái)實(shí)現(xiàn)),大數(shù)據(jù)下IO壓力大,表結(jié)構(gòu)更改困難,正是當(dāng)前使用MySQL的開(kāi)發(fā)人員面臨的問(wèn)題。
六、為什么用Nosql
今天我們可以通過(guò)第三方平臺(tái)(如:Google,Facebook等)可以很容易的訪問(wèn)和抓取數(shù)據(jù)。用戶(hù)的個(gè)人信息,社交網(wǎng)絡(luò),地理位置,用戶(hù)生成的數(shù)據(jù)和用戶(hù)操作日志已經(jīng)成倍的增加。我們?nèi)绻獙?duì)這些用戶(hù)數(shù)據(jù)進(jìn)行挖掘,那SQL數(shù)據(jù)庫(kù)已經(jīng)不適合這些應(yīng)用了, NoSQL數(shù)據(jù)庫(kù)的發(fā)展也卻能很好的處理這些大的數(shù)據(jù)。下面給大家看一下,web應(yīng)用數(shù)據(jù)量的增長(zhǎng)圖:
七、Nosql是什么
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,
泛指非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類(lèi)型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類(lèi)帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題,包括超大規(guī)模數(shù)據(jù)的存儲(chǔ)。
(例如谷歌或Facebook每天為他們的用戶(hù)收集萬(wàn)億比特的數(shù)據(jù))。這些類(lèi)型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。
八、Nosql的優(yōu)勢(shì)
1.易擴(kuò)展
NoSQL數(shù)據(jù)庫(kù)種類(lèi)繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性。
數(shù)據(jù)之間無(wú)關(guān)系,這樣就非常容易擴(kuò)展。也無(wú)形之間,在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。
2.大數(shù)據(jù)量,高性能
NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫(xiě)性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。
這得益于它的無(wú)關(guān)系性,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對(duì)web2.0的交互頻繁的應(yīng)用,Cache性能不高。而NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來(lái)說(shuō)就要性能高很多了。
3.多樣靈活的數(shù)據(jù)模型
NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。
九、Nosql數(shù)據(jù)庫(kù)的四大分類(lèi)
鍵值(Key-Value)存儲(chǔ)
列存儲(chǔ)
文檔存儲(chǔ)
圖形存儲(chǔ)
常見(jiàn)的有:Redis、Memcache、MongoDB,這里就不一 一 介紹了。
NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類(lèi)型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類(lèi)帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。
雖然NoSQL流行語(yǔ)火起來(lái)才短短一年的時(shí)間,但是不可否認(rèn),現(xiàn)在已經(jīng)開(kāi)始了第二代運(yùn)動(dòng)。盡管早期的堆棧代碼只能算是一種實(shí)驗(yàn),然而現(xiàn)在的系統(tǒng)已經(jīng)更加的成熟、穩(wěn)定。不過(guò)現(xiàn)在也面臨著一個(gè)嚴(yán)酷的事實(shí):技術(shù)越來(lái)越成熟——以至于原來(lái)很好的NoSQL數(shù)據(jù)存儲(chǔ)不得不進(jìn)行重寫(xiě),也有少數(shù)人認(rèn)為這就是所謂的2.0版本。這里列出一些比較知名的工具,可以為大數(shù)據(jù)建立快速、可擴(kuò)展的存儲(chǔ)庫(kù)。
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維的注入。
對(duì)于NoSQL并沒(méi)有一個(gè)明確的范圍和定義,但是他們都普遍存在下面一些共同特征:
不需要預(yù)定義模式:不需要事先定義數(shù)據(jù)模式,預(yù)定義表結(jié)構(gòu)。數(shù)據(jù)中的每條記錄都可能有不同的屬性和格式。當(dāng)插入數(shù)據(jù)時(shí),并不需要預(yù)先定義它們的模式。
無(wú)共享架構(gòu):相對(duì)于將所有數(shù)據(jù)存儲(chǔ)的存儲(chǔ)區(qū)域網(wǎng)絡(luò)中的全共享架構(gòu)。NoSQL往往將數(shù)據(jù)劃分后存儲(chǔ)在各個(gè)本地服務(wù)器上。因?yàn)閺谋镜卮疟P(pán)讀取數(shù)據(jù)的性能往往好于通過(guò)網(wǎng)絡(luò)傳輸讀取數(shù)據(jù)的性能,從而提高了系統(tǒng)的性能。
彈性可擴(kuò)展:可以在系統(tǒng)運(yùn)行的時(shí)候,動(dòng)態(tài)增加或者刪除結(jié)點(diǎn)。不需要停機(jī)維護(hù),數(shù)據(jù)可以自動(dòng)遷移。
分區(qū):相對(duì)于將數(shù)據(jù)存放于同一個(gè)節(jié)點(diǎn),NoSQL數(shù)據(jù)庫(kù)需要將數(shù)據(jù)進(jìn)行分區(qū),將記錄分散在多個(gè)節(jié)點(diǎn)上面。并且通常分區(qū)的同時(shí)還要做復(fù)制。這樣既提高了并行性能,又能保證沒(méi)有單點(diǎn)失效的問(wèn)題。
異步復(fù)制:和RAID存儲(chǔ)系統(tǒng)不同的是,NoSQL中的復(fù)制,往往是基于日志的異步復(fù)制。這樣,數(shù)據(jù)就可以盡快地寫(xiě)入一個(gè)節(jié)點(diǎn),而不會(huì)被網(wǎng)絡(luò)傳輸引起遲延。缺點(diǎn)是并不總是能保證一致性,這樣的方式在出現(xiàn)故障的時(shí)候,可能會(huì)丟失少量的數(shù)據(jù)。
BASE:相對(duì)于事務(wù)嚴(yán)格的ACID特性,NoSQL數(shù)據(jù)庫(kù)保證的是BASE特性。BASE是最終一致性和軟事務(wù)。
NoSQL數(shù)據(jù)庫(kù)并沒(méi)有一個(gè)統(tǒng)一的架構(gòu),兩種NoSQL數(shù)據(jù)庫(kù)之間的不同,甚至遠(yuǎn)遠(yuǎn)超過(guò)兩種關(guān)系型數(shù)據(jù)庫(kù)的不同。可以說(shuō),NoSQL各有所長(zhǎng),成功的NoSQL必然特別適用于某些場(chǎng)合或者某些應(yīng)用,在這些場(chǎng)合中會(huì)遠(yuǎn)遠(yuǎn)勝過(guò)關(guān)系型數(shù)據(jù)庫(kù)和其他的NoSQL。
傳統(tǒng)觀念中 NoSQL數(shù)據(jù)庫(kù)非常適合某些數(shù)據(jù)類(lèi)型,如:非關(guān)系數(shù)據(jù)源。同時(shí),NoSQL被吹捧為最適合Web應(yīng)用程序的優(yōu)秀平臺(tái)。然而他適合大多數(shù)數(shù)據(jù),特別是web應(yīng)用程序的數(shù)據(jù)是相關(guān)型。那么,這是否可以給你一個(gè)堅(jiān)持使用RDMS的理由呢?也不一定,即使很困難,我們還是要做出選擇。
評(píng)估NoSQL是一個(gè)很茅盾的理論,一些人認(rèn)為,應(yīng)該將所有文檔數(shù)據(jù)存儲(chǔ)在一個(gè)文檔中,做鏈接代碼就是褻瀆神明。另外一部分人認(rèn)為,存儲(chǔ)應(yīng)用文檔,
加入代碼,才是合理選擇。與此同時(shí),不同的數(shù)據(jù)庫(kù),需要在文檔中限制嵌套數(shù)據(jù)數(shù)量。有的人會(huì)鼓勵(lì)文檔引用。這是NoSQL數(shù)據(jù)模型的基本部分,也沒(méi)有一個(gè)
明確的共識(shí)。
曾經(jīng)有一篇很熱的帖子"Why you should never use
XYZ",我想,讀到這里,一定會(huì)有人搜索這篇文章。當(dāng)然,這種文章各式各樣,太過(guò)于籠統(tǒng)的標(biāo)題也沒(méi)什么幫助。毫無(wú)疑問(wèn),會(huì)有人會(huì)搜索這個(gè)文章,然后再找
到這個(gè)文章,進(jìn)一步深入,找到該文章的方法遠(yuǎn)比成功(理解問(wèn)題)的故事多。很難知道誰(shuí)提供了一個(gè)有效的技術(shù)問(wèn)題,誰(shuí)又誤讀了這個(gè)問(wèn)題(或者缺少證據(jù)證明其
觀點(diǎn))。
有大量選擇,RDBMS的世界,選擇就很容易。你有4或5個(gè)目標(biāo),大家工作方式差不多,來(lái)選擇環(huán)境、預(yù)算支持的平臺(tái)。對(duì)于成熟的產(chǎn)品,風(fēng)險(xiǎn)比較小。 NoSQL的世界,有很多數(shù)據(jù)庫(kù)引擎功能選擇。每一個(gè)有自己的獨(dú)特優(yōu)勢(shì),也有致命弱點(diǎn)。所以選擇很難, NoSQL項(xiàng)目生命周期短,嘗試新項(xiàng)目或者流行項(xiàng)目也會(huì)有風(fēng)險(xiǎn)。上次,我的的項(xiàng)目是在 CouchDB上,而現(xiàn)在似乎停擺了。
做出這個(gè)痛苦決定的原因是,這可能是一個(gè)案例:你需要做一大堆工作,才能知道,你做出的選擇對(duì)與錯(cuò)。你可以實(shí)體化你的數(shù)據(jù)模型,了解他與系統(tǒng)的工作
情況,但是,這只有你正真撞到南墻,才可以找到裂縫(答案)。以我為例,我建的應(yīng)用程序是關(guān)系數(shù)據(jù)庫(kù),移動(dòng)文件存儲(chǔ)的主要因素是,需要一個(gè)無(wú)模式設(shè)計(jì)來(lái)達(dá)
到我的目標(biāo)。使用NoSQL 數(shù)據(jù)庫(kù)存儲(chǔ)關(guān)系型數(shù)據(jù)庫(kù)并不是我們所常說(shuō)的,雖然,這種事常常發(fā)生。
現(xiàn)在我在用 Couchbase 和
MongoDB,Mongo對(duì)我沒(méi)多大吸引力,不過(guò)鑒于他非常流行,對(duì)于引起來(lái)說(shuō),很有好處。當(dāng)然,很多都可以以同樣的方式流行。PHP很流行,因?yàn)樗?/p>
易用性,而不是因?yàn)樗芎?。我現(xiàn)在在使用MongoDB和PHP,也在學(xué)習(xí)Couchbase,如果你有任何NoSQL平臺(tái)的使用感想,歡迎交流。