NoSQL解讀

nosql-index.jpg

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ù)无虚。

1.png

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)的選擇
redis-cap.png

?> 注意

分布式架構(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)險等問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灼伤,一起剝皮案震驚了整個濱河市触徐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狐赡,老刑警劉巖撞鹉,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸟雏,警方通過查閱死者的電腦和手機享郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孝鹊,“玉大人炊琉,你說我怎么就攤上這事∮只睿” “怎么了苔咪?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柳骄。 經(jīng)常有香客問我团赏,道長,這世上最難降的妖魔是什么耐薯? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任舔清,我火速辦了婚禮,結(jié)果婚禮上曲初,老公的妹妹穿的比我還像新娘体谒。我一直安慰自己,他們只是感情好臼婆,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布营密。 她就那樣靜靜地躺著,像睡著了一般目锭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纷捞,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天痢虹,我揣著相機與錄音,去河邊找鬼主儡。 笑死奖唯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糜值。 我是一名探鬼主播丰捷,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寂汇!你這毒婦竟也來了病往?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤骄瓣,失蹤者是張志新(化名)和其女友劉穎停巷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡畔勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年蕾各,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆揪。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡式曲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缸榛,到底是詐尸還是另有隱情吝羞,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布仔掸,位于F島的核電站脆贵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏起暮。R本人自食惡果不足惜卖氨,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望负懦。 院中可真熱鬧筒捺,春花似錦、人聲如沸纸厉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颗品。三九已至肯尺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躯枢,已是汗流浹背则吟。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锄蹂,地道東北人氓仲。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像得糜,于是被迫代替她去往敵國和親敬扛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360