NoSQL的前世今生
Java大猿帥成長手冊,GitHub JavaEgg ,N線互聯(lián)網(wǎng)開發(fā)必備技能兵器譜
啥玩意:
NoSQL(NoSQL = Not Only SQL ),“不僅僅是SQL”,泛指非關(guān)系型的數(shù)據(jù)庫孔庭。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在處理web2.0網(wǎng)站材蛛,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心圆到,暴露了很多難以克服的問題,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展卑吭。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn)芽淡,尤其是大數(shù)據(jù)應(yīng)用難題,包括超大規(guī)模數(shù)據(jù)的存儲豆赏。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))挣菲。這些類型的數(shù)據(jù)存儲不需要固定的模式,無需多余操作就可以橫向擴(kuò)展掷邦。
互聯(lián)網(wǎng)時代背景下白胀,數(shù)據(jù)庫的發(fā)展以及為什么要用nosql
1. 單機MySQL的美好年代
? 在以前,一個網(wǎng)站的訪問量一般都不大抚岗,用單個數(shù)據(jù)庫完全可以輕松應(yīng)付或杠。在那個時候,更多的都是靜態(tài)網(wǎng)頁宣蔚,動態(tài)交互類型的網(wǎng)站不多向抢。上述架構(gòu)下,我們來看看數(shù)據(jù)存儲的瓶頸是什么胚委?
- 數(shù)據(jù)量的總大小 一個機器放不下時
- 數(shù)據(jù)的索引(B+ Tree)一個機器的內(nèi)存放不下時
- 訪問量(讀寫混合)一個實例不能承受
2. Memcached(緩存)+MySQL+垂直拆分
? 后來挟鸠,隨著訪問量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題篷扩,web程序不再僅僅專注在功能上兄猩,同時也在追求性能。程序員們開始大量的使用緩存技術(shù)來緩解數(shù)據(jù)庫的壓力鉴未,優(yōu)化數(shù)據(jù)庫的結(jié)構(gòu)和索引枢冤。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力,但是當(dāng)訪問量繼續(xù)增大的時候铜秆,多臺web機器通過文件緩存不能共享淹真,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候连茧,Memcached就自然的成為一個非常時尚的技術(shù)產(chǎn)品核蘸。
? Memcached作為一個獨立的分布式的緩存服務(wù)器巍糯,為多個web服務(wù)器提供了一個共享的高性能緩存服務(wù),在Memcached服務(wù)器上客扎,又發(fā)展了根據(jù)hash算法來進(jìn)行多臺Memcached緩存服務(wù)的擴(kuò)展祟峦,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來的大量緩存失效的弊端
3. Mysql主從讀寫分離
? 由于數(shù)據(jù)庫的寫入壓力增加,Memcached只能緩解數(shù)據(jù)庫的讀取壓力徙鱼。讀寫集中在一個數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負(fù)宅楞,大部分網(wǎng)站開始使用主從復(fù)制技術(shù)來達(dá)到讀寫分離,以提高讀寫性能和讀庫的可擴(kuò)展性袱吆。Mysql的master-slave模式成為這個時候的網(wǎng)站標(biāo)配了厌衙。
4. 分表分庫+水平拆分+mysql集群
? 在Memcached的高速緩存,MySQL的主從復(fù)制绞绒,讀寫分離的基礎(chǔ)之上婶希,這時MySQL主庫的寫壓力開始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增蓬衡,由于MyISAM使用表鎖喻杈,在高并發(fā)下會出現(xiàn)嚴(yán)重的鎖問題,大量的高并發(fā)MySQL應(yīng)用開始使用InnoDB引擎代替MyISAM撤蟆。
? 同時奕塑,開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴(kuò)展問題。這個時候家肯,分表分庫成了一個熱門技術(shù)龄砰,是面試的熱門問題也是業(yè)界討論的熱門技術(shù)問題。也就在這個時候讨衣,MySQL推出了還不太穩(wěn)定的表分區(qū)换棚,這也給技術(shù)實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群反镇,但性能也不能很好滿足互聯(lián)網(wǎng)的要求固蚤,只是在高可靠性上提供了非常大的保證。
5. MySQL的擴(kuò)展性瓶頸
? MySQL數(shù)據(jù)庫也經(jīng)常存儲一些大文本字段歹茶,導(dǎo)致數(shù)據(jù)庫表非常的大夕玩,在做數(shù)據(jù)庫恢復(fù)的時候就導(dǎo)致非常的慢,不容易快速恢復(fù)數(shù)據(jù)庫惊豺。比如1000萬4KB大小的文本就接近40GB的大小燎孟,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小尸昧。關(guān)系數(shù)據(jù)庫很強大揩页,但是它并不能很好的應(yīng)付所有的應(yīng)用場景。MySQL的擴(kuò)展性差(需要復(fù)雜的技術(shù)來實現(xiàn))烹俗,大數(shù)據(jù)下IO壓力大爆侣,表結(jié)構(gòu)更改困難萍程,正是當(dāng)前使用MySQL的開發(fā)人員面臨的問題。
6. 為什么用NoSQL
? 今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取數(shù)據(jù)(爬蟲私密信息有風(fēng)險哈)兔仰。用戶的個人信息茫负,社交網(wǎng)絡(luò),地理位置乎赴,用戶生成的數(shù)據(jù)和用戶操作日志已經(jīng)成倍的增加朽褪。我們?nèi)绻獙@些用戶數(shù)據(jù)進(jìn)行挖掘,那SQL數(shù)據(jù)庫已經(jīng)不適合這些應(yīng)用了, NoSQL數(shù)據(jù)庫的發(fā)展也不能很好的處理這些大的數(shù)據(jù)无虚。
NoSql的優(yōu)缺點
優(yōu)點
- 易擴(kuò)展 : NoSQL數(shù)據(jù)庫種類繁多,但是一個共同的特點都是去掉關(guān)系數(shù)據(jù)庫的關(guān)系型特性衍锚。數(shù)據(jù)之間無關(guān)系友题,這樣就非常容易擴(kuò)展。也無形之間戴质,在架構(gòu)的層面上帶來了可擴(kuò)展的能力度宦。
- 大數(shù)據(jù)量高性能:NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下告匠,同樣表現(xiàn)優(yōu)秀戈抄。這得益于它的無關(guān)系性,數(shù)據(jù)庫的結(jié)構(gòu)簡單后专。一般MySQL使用Query Cache划鸽,每次表的更新Cache就失效,是一種大粒度的Cache戚哎,在針對web2.0的交互頻繁的應(yīng)用裸诽,Cache性能不高。而NoSQL的Cache是記錄級的型凳,是一種細(xì)粒度的Cache丈冬,所以NoSQL在這個層面上來說就要性能高很多了
- 多樣靈活的數(shù)據(jù)模型:NoSQL無需事先為要存儲的數(shù)據(jù)建立字段,隨時可以存儲自定義的數(shù)據(jù)格式甘畅。而在關(guān)系數(shù)據(jù)庫里埂蕊,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表疏唾,增加字段簡直就是一個噩夢
缺點
- 沒有標(biāo)準(zhǔn)化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
傳統(tǒng)RDBMS VS NOSQL:
RDBMS
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語言(SQL)
- 數(shù)據(jù)和關(guān)系都存儲在單獨的表中蓄氧。
- 數(shù)據(jù)操縱語言,數(shù)據(jù)定義語言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
NoSQL
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預(yù)定義的模式
- 鍵 - 值對存儲荸实,列存儲匀们,文檔存儲,圖形數(shù)據(jù)庫
- 最終一致性准给,而非ACID屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理
- 高性能泄朴,高可用性和可伸縮性
3V+3高
- 大數(shù)據(jù)時代的3V(海量Volume重抖、多樣Variety、實時Velocity)
- 互聯(lián)網(wǎng)需求的3高(高并發(fā)祖灰、高可擴(kuò)钟沛、高性能)
NoSQL數(shù)據(jù)模型簡介
聚合模型
- KV鍵值
- bson:BSON()是一種類json的一種二進(jìn)制形式的存儲格式,簡稱Binary JSON局扶,它和JSON一樣恨统,支持內(nèi)嵌的文檔對象和數(shù)組對象
- 列族:顧名思義,是按列存儲數(shù)據(jù)的三妈。最大的特點是方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)畜埋,方便做數(shù)據(jù)壓縮,對針對某一列或者某幾列的查詢有非常大的IO優(yōu)勢畴蒲。
- 圖形:
NoSQL數(shù)據(jù)庫的四大分類
KV鍵值:
? 新浪:BerkeleyDB+redis
? 美團(tuán):redis+tair
? 阿里悠鞍、百度:memcache+redis
文檔型數(shù)據(jù)庫(bson格式比較多):
CouchDB
MongoDB:MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫模燥。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案咖祭。MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富蔫骂,最像關(guān)系數(shù)據(jù)庫的么翰。
列存儲數(shù)據(jù)庫
Cassandra, HBase
分布式文件系統(tǒng)
圖關(guān)系數(shù)據(jù)庫
它不是放圖形的,放的是關(guān)系比如:朋友圈社交網(wǎng)絡(luò)辽旋、廣告推薦系統(tǒng)浩嫌、社交網(wǎng)絡(luò),推薦系統(tǒng)等戴已。專注于構(gòu)建關(guān)系圖譜
Neo4J, InfoGrid
四者對比
在分布式數(shù)據(jù)庫中CAP原理CAP+BASE
傳統(tǒng)的ACID
A (Atomicity) 原子性
C (Consistency) 一致性
I (Isolation) 獨立性
D (Durability) 持久性
CAP
C (Consistency) 強一致性——所有節(jié)點在同一時間具有相同的數(shù)據(jù)
A (Availability) 可用性——保證每個請求不管成功或者失敗都有響應(yīng)
P (Partition tolerance) 分區(qū)容錯性——系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運作
CAP理論的核心是:<mark>一個分布式系統(tǒng)不可能同時很好的滿足一致性固该,可用性和分區(qū)容錯性這三個需求,最多只能同時較好的滿足兩個</mark>糖儡。而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會出現(xiàn)延遲丟包等問題伐坏,所以分區(qū)容忍性是我們必須需要實現(xiàn)的。我們稱之為CAP的3進(jìn)2握联,所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡桦沉,沒有NoSQL系統(tǒng)能同時保證這三點。
因此金闽,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫分成了滿足 CA 原則纯露、滿足 CP 原則和滿足 AP 原則三大類:
- CA - 單點集群,滿足一致性代芜,可用性的系統(tǒng)埠褪,通常在可擴(kuò)展性上不太強大。傳統(tǒng)Oracle數(shù)據(jù)庫
- CP - 滿足一致性,分區(qū)容忍性的系統(tǒng)钞速,通常性能不是特別高贷掖。Redis、Mongodb
- AP - 滿足可用性渴语,分區(qū)容忍性的系統(tǒng)苹威,通常可能對一致性要求低一些驾凶。大多數(shù)網(wǎng)站架構(gòu)的選擇
?> 注意
分布式架構(gòu)的時候必須做出取舍:一致性和可用性之間取一個平衡牙甫。多余大多數(shù)web應(yīng)用,其實并不需要強一致性调违。因此犧牲C換取P窟哺,這是目前分布式數(shù)據(jù)庫產(chǎn)品的方向
一致性與可用性的決擇:對于web2.0網(wǎng)站來說,關(guān)系數(shù)據(jù)庫的很多主要特性卻往往無用武之地
數(shù)據(jù)庫事務(wù)一致性需求 :很多web實時系統(tǒng)并不要求嚴(yán)格的數(shù)據(jù)庫事務(wù)技肩,對讀一致性的要求很低脏答, 有些場合對寫一致性要求并不高。允許實現(xiàn)最終一致性亩鬼。
數(shù)據(jù)庫的寫實時性和讀實時性需求:對關(guān)系數(shù)據(jù)庫來說,插入一條數(shù)據(jù)之后立刻查詢阿蝶,是肯定可以讀出來這條數(shù)據(jù)的雳锋,但是對于很多web應(yīng)用來說,并不要求這么高的實時性羡洁,比方說發(fā)一條消息之 后玷过,過幾秒乃至十幾秒之后,我的訂閱者才看到這條動態(tài)是完全可以接受的筑煮。
對復(fù)雜的SQL查詢辛蚊,特別是多表關(guān)聯(lián)查詢的需求 :任何大數(shù)據(jù)量的web系統(tǒng),都非常忌諱多個大表的關(guān)聯(lián)查詢真仲,以及復(fù)雜的數(shù)據(jù)分析類型的報表查詢袋马,特別是SNS類型的網(wǎng)站,從需求以及產(chǎn)品設(shè)計角度秸应,就避免了這種情況的產(chǎn)生虑凛。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢软啼,SQL的功能被極大的弱化了桑谍。
BASE是什么
BASE就是為了解決關(guān)系數(shù)據(jù)庫強一致性引起的的可用性降低問題而提出的方案。
BASE其實是下面三個術(shù)語的縮寫:
基本可用(Basically Available)
軟狀態(tài)(Soft state)
最終一致(Eventually consistent)
它的思想是通過讓系統(tǒng)放松對某一時刻數(shù)據(jù)一致性的要求來換取系統(tǒng)整體伸縮性和性能上改觀祸挪。為什么這么說呢锣披,緣由就在于大型系統(tǒng)往往由于地域分布和極高性能的要求,不可能采用分布式事務(wù)來完成這些指標(biāo),要想獲得這些指標(biāo)雹仿,我們必須采用另外一種方式來完成增热,這里BASE就是解決這個問題的辦法
分布式+集群簡介
分布式系統(tǒng)(distributed system)
由多臺計算機和通信的軟件組件通過計算機網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)盅粪。正是因為軟件的特性钓葫,所以分布式系統(tǒng)具有高度的內(nèi)聚性和透明性。因此票顾,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng))础浮,而不是硬件。分布式系統(tǒng)可以應(yīng)用在在不同的平臺上如:PC奠骄、工作站豆同、局域網(wǎng)和廣域網(wǎng)上等。
分布式計算的優(yōu)點
可靠性(容錯) :分布式計算系統(tǒng)中的一個重要的優(yōu)點是可靠性含鳞。一臺服務(wù)器的系統(tǒng)崩潰并不影響到其余的服務(wù)器影锈。
可擴(kuò)展性:在分布式計算系統(tǒng)可以根據(jù)需要增加更多的機器。
資源共享:共享數(shù)據(jù)是必不可少的應(yīng)用蝉绷,如銀行鸭廷,預(yù)訂系統(tǒng)。
靈活性:由于該系統(tǒng)是非常靈活的熔吗,它很容易安裝辆床,實施和調(diào)試新的服務(wù)。
更快的速度:分布式計算系統(tǒng)可以有多臺計算機的計算能力桅狠,使得它比其他系統(tǒng)有更快的處理速度讼载。
開放系統(tǒng):由于它是開放的系統(tǒng),本地或者遠(yuǎn)程都可以訪問到該服務(wù)中跌。
更高的性能:相較于集中式計算機網(wǎng)絡(luò)集群可以提供更高的性能(及更好的性價比)咨堤。
分布式計算的缺點
故障排除: :故障排除和診斷問題。
軟件:更少的軟件支持是分布式計算系統(tǒng)的主要缺點漩符。
網(wǎng)絡(luò):網(wǎng)絡(luò)基礎(chǔ)設(shè)施的問題一喘,包括:傳輸問題,高負(fù)載嗜暴,信息丟失等津滞。
安全性:開發(fā)系統(tǒng)的特性讓分布式計算系統(tǒng)存在著數(shù)據(jù)的安全性和共享的風(fēng)險等問題。