NoSQL在2010年風(fēng)生水起贰健,大大小小的Web站點(diǎn)在追求高性能高可靠性方面,不由自主都選擇了NoSQL技術(shù)作為優(yōu)先考慮的方面。今年伊始涤妒,InfoQ中文站有幸邀請(qǐng)到鳳凰網(wǎng)的孫立先生颁督,為大家分享他之于NoSQL方面的經(jīng)驗(yàn)和體會(huì)践啄。
非常榮幸能受邀在InfoQ開辟這樣一個(gè)關(guān)于NoSQL的專欄,InfoQ是我非常尊重的一家技術(shù)媒體沉御,同時(shí)我也希望借助InfoQ屿讽,在國(guó)內(nèi)推動(dòng)NoSQL的發(fā)展,希望跟我一樣有興趣的朋友加入進(jìn)來(lái)吠裆。這次的NoSQL專欄系列將先整體介紹NoSQL伐谈,然后介紹如何把NoSQL運(yùn)用到自己的項(xiàng)目中合適的場(chǎng)景中,還會(huì)適當(dāng)?shù)胤治鲆恍┏晒Π咐蛱担M谐晒κ褂肗oSQL經(jīng)驗(yàn)的朋友給我提供一些線索和信息衩婚。
NoSQL概念
隨著web2.0的快速發(fā)展,非關(guān)系型效斑、分布式數(shù)據(jù)存儲(chǔ)得到了快速的發(fā)展非春,它們不保證關(guān)系數(shù)據(jù)的ACID特性。NoSQL概念在2009年被提了出來(lái)。NoSQL最常見(jiàn)的解釋是“non-relational”奇昙,“Not Only SQL”也被很多人接受护侮。(“NoSQL”一詞最早于1998年被用于一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù)的名字。)
NoSQL被我們用得最多的當(dāng)數(shù)key-value存儲(chǔ)储耐,當(dāng)然還有其他的文檔型的羊初、列存儲(chǔ)、圖型數(shù)據(jù)庫(kù)什湘、xml數(shù)據(jù)庫(kù)等长赞。在NoSQL概念提出之前,這些數(shù)據(jù)庫(kù)就被用于各種系統(tǒng)當(dāng)中闽撤,但是卻很少用于web互聯(lián)網(wǎng)應(yīng)用得哆。比如cdb、qdbm哟旗、bdb數(shù)據(jù)庫(kù)贩据。
傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的瓶頸
傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)具有不錯(cuò)的性能,高穩(wěn)定型闸餐,久經(jīng)歷史考驗(yàn)饱亮,而且使用簡(jiǎn)單,功能強(qiáng)大舍沙,同時(shí)也積累了大量的成功案例近上。在互聯(lián)網(wǎng)領(lǐng)域,MySQL成為了絕對(duì)靠前的王者场勤,毫不夸張的說(shuō)戈锻,MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻(xiàn)。
在90年代和媳,一個(gè)網(wǎng)站的訪問(wèn)量一般都不大格遭,用單個(gè)數(shù)據(jù)庫(kù)完全可以輕松應(yīng)付。在那個(gè)時(shí)候留瞳,更多的都是靜態(tài)網(wǎng)頁(yè)拒迅,動(dòng)態(tài)交互類型的網(wǎng)站不多。
到了最近10年她倘,網(wǎng)站開始快速發(fā)展璧微。火爆的論壇硬梁、博客前硫、sns、微博逐漸引領(lǐng)web領(lǐng)域的潮流荧止。在初期屹电,論壇的流量其實(shí)也不大阶剑,如果你接觸網(wǎng)絡(luò)比較早,你可能還記得那個(gè)時(shí)候還有文本型存儲(chǔ)的論壇程序危号,可以想象一般的論壇的流量有多大牧愁。
Memcached+MySQL
后來(lái),隨著訪問(wèn)量的上升外莲,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫(kù)上都開始出現(xiàn)了性能問(wèn)題猪半,web程序不再僅僅專注在功能上,同時(shí)也在追求性能偷线。程序員們開始大量的使用緩存技術(shù)來(lái)緩解數(shù)據(jù)庫(kù)的壓力磨确,優(yōu)化數(shù)據(jù)庫(kù)的結(jié)構(gòu)和索引。開始比較流行的是通過(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)的大量緩存失效的弊端。當(dāng)時(shí)硫豆,如果你去面試龙巨,你說(shuō)你有Memcached經(jīng)驗(yàn),肯定會(huì)加分的熊响。
Mysql主從讀寫分離
由于數(shù)據(jù)庫(kù)的寫入壓力增加旨别,Memcached只能緩解數(shù)據(jù)庫(kù)的讀取壓力。讀寫集中在一個(gè)數(shù)據(jù)庫(kù)上讓數(shù)據(jù)庫(kù)不堪重負(fù)汗茄,大部分網(wǎng)站開始使用主從復(fù)制技術(shù)來(lái)達(dá)到讀寫分離秸弛,以提高讀寫性能和讀庫(kù)的可擴(kuò)展性。Mysql的master-slave模式成為這個(gè)時(shí)候的網(wǎng)站標(biāo)配了洪碳。
分表分庫(kù)
隨著web2.0的繼續(xù)高速發(fā)展递览,在Memcached的高速緩存,MySQL的主從復(fù)制瞳腌,讀寫分離的基礎(chǔ)之上绞铃,這時(shí)MySQL主庫(kù)的寫壓力開始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增嫂侍,由于MyISAM使用表鎖儿捧,在高并發(fā)下會(huì)出現(xiàn)嚴(yán)重的鎖問(wèn)題荚坞,大量的高并發(fā)MySQL應(yīng)用開始使用InnoDB引擎代替MyISAM。同時(shí)纯命,開始流行使用分表分庫(kù)來(lái)緩解寫壓力和數(shù)據(jù)增長(zhǎng)的擴(kuò)展問(wèn)題西剥。這個(gè)時(shí)候,分表分庫(kù)成了一個(gè)熱門技術(shù)亿汞,是面試的熱門問(wèn)題也是業(yè)界討論的熱門技術(shù)問(wèn)題瞭空。也就在這個(gè)時(shí)候,MySQL推出了還不太穩(wěn)定的表分區(qū)疗我,這也給技術(shù)實(shí)力一般的公司帶來(lái)了希望咆畏。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒(méi)有成功案例吴裤,性能也不能滿足互聯(lián)網(wǎng)的要求旧找,只是在高可靠性上提供了非常大的保證。
MySQL的擴(kuò)展性瓶頸
在互聯(lián)網(wǎng)麦牺,大部分的MySQL都應(yīng)該是IO密集型的钮蛛,事實(shí)上,如果你的MySQL是個(gè)CPU密集型的話剖膳,那么很可能你的MySQL設(shè)計(jì)得有性能問(wèn)題魏颓,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應(yīng)用開發(fā)越來(lái)越復(fù)雜吱晒,也越來(lái)越具有技術(shù)挑戰(zhàn)性甸饱。分表分庫(kù)的規(guī)則把握都是需要經(jīng)驗(yàn)的。雖然有像淘寶這樣技術(shù)實(shí)力強(qiáng)大的公司開發(fā)了透明的中間件層來(lái)屏蔽開發(fā)者的復(fù)雜性仑濒,但是避免不了整個(gè)架構(gòu)的復(fù)雜性叹话。分庫(kù)分表的子庫(kù)到一定階段又面臨擴(kuò)展問(wèn)題。還有就是需求的變更墩瞳,可能又需要一種新的分庫(kù)方式驼壶。
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的開發(fā)人員面臨的問(wèn)題烹棉。
NOSQL的優(yōu)勢(shì)
易擴(kuò)展
NoSQL數(shù)據(jù)庫(kù)種類繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性怯疤。數(shù)據(jù)之間無(wú)關(guān)系浆洗,這樣就非常容易擴(kuò)展。也無(wú)形之間集峦,在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力伏社。
大數(shù)據(jù)量,高性能
NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫性能塔淤,尤其在大數(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ō)就要性能高很多了滤淳。
靈活的數(shù)據(jù)模型
NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式砌左。而在關(guān)系數(shù)據(jù)庫(kù)里脖咐,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表汇歹,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)屁擅。這點(diǎn)在大數(shù)據(jù)量的web2.0時(shí)代尤其明顯。
高可用
NoSQL在不太影響性能的情況产弹,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)派歌。比如Cassandra,HBase模型痰哨,通過(guò)復(fù)制模型也能實(shí)現(xiàn)高可用胶果。
總結(jié)
NoSQL數(shù)據(jù)庫(kù)的出現(xiàn),彌補(bǔ)了關(guān)系數(shù)據(jù)(比如MySQL)在某些方面的不足斤斧,在某些方面能極大的節(jié)省開發(fā)成本和維護(hù)成本早抠。
MySQL和NoSQL都有各自的特點(diǎn)和使用的應(yīng)用場(chǎng)景,兩者的緊密結(jié)合將會(huì)給web2.0的數(shù)據(jù)庫(kù)發(fā)展帶來(lái)新的思路撬讽。讓關(guān)系數(shù)據(jù)庫(kù)關(guān)注在關(guān)系上蕊连,NoSQL關(guān)注在存儲(chǔ)上悬垃。
原文鏈接:https://news.cnblogs.com/n/88251/
擴(kuò)展閱讀: