NoSQL入门第一天——NoSQL入门与基本概述
一、課程大綱
二、入門概述
1.為什么用NoSQL
單機(jī)MySQL的年代:
一個(gè)網(wǎng)站的訪問(wèn)量一般都不大,用單個(gè)數(shù)據(jù)庫(kù)完全可以輕松應(yīng)付。
我們來(lái)看看數(shù)據(jù)存儲(chǔ)的瓶頸是什么?
1.數(shù)據(jù)量的總大小 一個(gè)機(jī)器放不下時(shí)。(現(xiàn)今單表500W的數(shù)據(jù)量)
2.數(shù)據(jù)的索引(B+ Tree)一個(gè)機(jī)器的內(nèi)存放不下時(shí)
3.訪問(wèn)量(讀寫(xiě)混合)一個(gè)實(shí)例不能承受
?Memcached(緩存)+MySQL+垂直拆分
后來(lái),隨著訪問(wèn)量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫(kù)上都開(kāi)始出現(xiàn)了性能問(wèn)題,web程序不再僅僅專注在功能上,同時(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主從讀寫(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è)熱門技術(shù),是面試的熱門問(wèn)題也是業(yè)界討論的熱門技術(shù)問(wèn)題。也就在這個(gè)時(shí)候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術(shù)實(shí)力一般的公司帶來(lái)了希望。雖然MySQL推出了MySQL Cluster集群,但性能也不能很好滿足互聯(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)題。
現(xiàn)在的MySQL的樣子?
為什么用NoSQL
? 今天我們可以通過(guò)第三方平臺(tái)(如:Google,Facebook等)可以很容易的訪問(wèn)和抓取數(shù)據(jù)。用戶的個(gè)人信息,社交網(wǎng)絡(luò),地理位置,用戶生成的數(shù)據(jù)和用戶操作日志已經(jīng)成倍的增加。我們?nèi)绻獙?duì)這些用戶數(shù)據(jù)進(jìn)行挖掘,那SQL數(shù)據(jù)庫(kù)已經(jīng)不適合這些應(yīng)用了, NoSQL數(shù)據(jù)庫(kù)的發(fā)展也卻能很好的處理這些大的數(shù)據(jù)。
介紹玩概述后,就是經(jīng)典的三步走了:是什么,能干什么,怎么干?
2.是什么?
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類型的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)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題,包括超大規(guī)模數(shù)據(jù)的存儲(chǔ)。
這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。
3.能干什么?
易拓展
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ù)都具有非常高的讀寫(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ō)就要性能高很多了
多樣靈活的數(shù)據(jù)模型
? NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,
增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)
傳統(tǒng)RDBMS VS NOSQL
RDBMS
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語(yǔ)言(SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語(yǔ)言,數(shù)據(jù)定義語(yǔ)言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
NoSQL
- 代表著不僅僅是SQL
- 沒(méi)有聲明性查詢語(yǔ)言
- 沒(méi)有預(yù)定義的模式
-鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫(kù)
- 最終一致性,而非ACID屬性
-非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理(對(duì)比ACID)
- 高性能,高可用性和可伸縮性
4.怎么干
KV+Cache+Persistence
三、3V與3高
3V—— 海量Volume 多樣Variety 實(shí)時(shí)Velocity
3高——高并發(fā) 高可擴(kuò)(縱向與橫向) 高性能(高可用)
四、經(jīng)典應(yīng)用
當(dāng)下的應(yīng)用是sql和nosql一起使用
五、NoSQL數(shù)據(jù)模型簡(jiǎn)介
數(shù)據(jù)庫(kù)的數(shù)據(jù)類型不再贅述,可參見(jiàn)MySQL的隨筆
1.以一個(gè)電商客戶、訂單、訂購(gòu)、地址模型來(lái)對(duì)比下關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)你如何設(shè)計(jì)?——ER圖(1:1/1:N/N:N,主外鍵等常見(jiàn))
nosql你如何設(shè)計(jì)?
——什么是BSON?
BSON()是一種類json的一種二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱Binary JSON,它和JSON一樣,支持內(nèi)嵌的文檔對(duì)象和數(shù)組對(duì)象。BSON官網(wǎng):http://bsonspec.org/
?
?
BSON格式:http://blog.csdn.net/hengyunabc/article/details/6897540
?
{"customer":{"id":1136,"name":"Z3","billingAddress":[{"city":"beijing"}],"orders":[ ??? {"id":17,"customerId":1136,"orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}],"shippingAddress":[{"city":"beijing"}]"orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}], ????? }]} } View Code?
//類似于customer就表示關(guān)系型數(shù)據(jù)庫(kù)中的一張表
兩者對(duì)比,問(wèn)題和難點(diǎn)
為什么上述的情況可以用聚合模型來(lái)處理?
高并發(fā)的操作是不太建議有關(guān)聯(lián)查詢的,互聯(lián)網(wǎng)公司用冗余數(shù)據(jù)來(lái)避免關(guān)聯(lián)查詢
分布式事務(wù)是支持不了太多的并發(fā)的
想想關(guān)系模型數(shù)據(jù)庫(kù)你如何查?
如果按照我們新設(shè)計(jì)的BSon,是不是查詢起來(lái)很可愛(ài)(沒(méi)有亂七八糟的JOIN GROUP BY了)
2.聚合模型
不再有MySQL里的varchar等數(shù)據(jù)類型,統(tǒng)稱聚合模型
KV鍵值
bson
列族
顧名思義,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,
對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)。
圖形(復(fù)雜的網(wǎng)狀關(guān)系)
六、NoSQL數(shù)據(jù)庫(kù)四大分類
KV鍵值
典型運(yùn)用:阿里、百度:memcache+redis
文檔型數(shù)據(jù)庫(kù)(bson格式比較多)
典型運(yùn)用:MongoDB
列存儲(chǔ)數(shù)據(jù)庫(kù)
典型運(yùn)用:HBase
圖關(guān)系數(shù)據(jù)庫(kù)
社交網(wǎng)絡(luò),推薦系統(tǒng)等。專注于構(gòu)建關(guān)系圖譜
七、CAP原理:CAP+BASE
1.傳統(tǒng)的ACID
參見(jiàn):http://www.cnblogs.com/jiangbei/p/6701239.html
2.CAP理論
Consistency (強(qiáng)一致性), 數(shù)據(jù)一致更新,所有數(shù)據(jù)變動(dòng)都是同步的
Availability (可用性), ? ? ?好的響應(yīng)性能
Partition tolerance (分區(qū)容錯(cuò)性) ? ? ? ? 可靠性
3.CAP的3進(jìn)2
不可能同時(shí)滿足三個(gè)理論(一般分布式系統(tǒng)而言,P是基本滿足);所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡
? AP 大多數(shù)網(wǎng)站架構(gòu)的選擇
?CP Redis、Mongodb
? 4.BASE
? BASE就是為了解決關(guān)系數(shù)據(jù)庫(kù)強(qiáng)一致性引起的問(wèn)題而引起的可用性降低而提出的解決方案。
BASE其實(shí)是下面三個(gè)術(shù)語(yǔ)的縮寫(xiě):
?? ? 基本可用(Basically Available)
?? ? 軟狀態(tài)(Soft state)
?? ? 最終一致(Eventually consistent)
5.分布式與集群簡(jiǎn)介
分布式系統(tǒng)(distributed system)
? 由多臺(tái)計(jì)算機(jī)和通信的軟件組件通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。正是因?yàn)檐浖奶匦?#xff0c;所以分布式系統(tǒng)具有高度的內(nèi)聚性和透明性。因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng)),而不是硬件。分布式系統(tǒng)可以應(yīng)用在在不同的平臺(tái)上如:Pc、工作站、局域網(wǎng)和廣域網(wǎng)上等。
簡(jiǎn)單來(lái)講:
1 分布式:不同的多臺(tái)服務(wù)器上面部署不同的服務(wù)模塊(工程),他們之間通過(guò)Rpc/Rmi之間通信和調(diào)用,對(duì)外提供服務(wù)和組內(nèi)協(xié)作。
2 集群:不同的多臺(tái)服務(wù)器上面部署相同的服務(wù)模塊,通過(guò)分布式調(diào)度軟件進(jìn)行統(tǒng)一的調(diào)度,對(duì)外提供服務(wù)和訪問(wèn)。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangbei/p/7250770.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的NoSQL入门第一天——NoSQL入门与基本概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: serialVersionUID的作用以
- 下一篇: 搭建mysql集群,使用Percona