什么是NoSQL數(shù)據(jù)庫?從名稱“非SQL”或“非關系型”衍生而來,這些數(shù)據(jù)庫不使用類似SQL的查詢語言,通常稱為結構化存儲。這些數(shù)據(jù)庫自1960年就已經(jīng)存在,但是直到現(xiàn)在一些大公司(例如Google和Facebook)開始使用它們時,這些數(shù)據(jù)庫才流行起來。該數(shù)據(jù)庫最明顯的優(yōu)勢是擺脫了一組固定的列、連接和類似SQL的查詢語言的限制。有時,NoSQL這個名稱也可能表示“不僅僅SQL”,來確保它們可能支持SQL。 NoSQL數(shù)據(jù)庫使用諸如鍵值、寬列、圖形或文檔之類的數(shù)據(jù)結構,并且可以如JSON之類的不同格式存儲。
專注于為中小企業(yè)提供成都網(wǎng)站設計、成都網(wǎng)站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)蒲江縣免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。
當為大家描述我們的整體服務架構時,最常見的兩個問題是:
為什么采用結構化方式將數(shù)據(jù)存儲在SQL數(shù)據(jù)庫中,而不使用NoSQL平臺?
為什么自己維護數(shù)據(jù)中心,而不將Evernote托管到云服務提供商?
這兩個問題都很有趣,我們先來探討第一個。
對特定的應用而言,相比一個單一的SQL實例,一個現(xiàn)代的鍵值存儲引擎具備顯著的性能優(yōu)勢和可擴展性。
CREATE TABLE notebooks ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, name varchar(100) COLLATE utf8_bin NOT NULL, ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE notes ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, notebook_id int UNSIGNED NOT NULL, title varchar(255) NOT NULL, ... FOREIGN KEY (notebook_id) REFERENCES notebooks(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果你在Windows客戶端上創(chuàng)建了一個名為“Cooking”的記事本,并立即在其中粘貼了一個名為“Quick Tomato Sauce”的食譜,客戶端會立刻進行如下同步:
調(diào)用NoteStore.createNotebook() 請求服務器創(chuàng)建記事本,并返回以創(chuàng)建記事本的GUID。
通過指定記事本的GUID,調(diào)用NoteStore.createNote()在記事本中創(chuàng)建筆記。
每次API調(diào)用都通過SQL事物予以實現(xiàn),可以讓客戶端完全信任服務器的任何提示。ACID兼容的數(shù)據(jù)庫可以做到這些:
原子性(Atomicity):如果API調(diào)用成功,那么所有的改動都會保存;如果API調(diào)用失敗,所有的改動都不會提交。
一致性(Consistency): 在API調(diào)用完成后,所有的賬戶都可用,并能保證內(nèi)部狀態(tài)的一致性。每篇筆記都與記事本相關聯(lián),以避免出現(xiàn)孤立項。數(shù)據(jù)庫不允許刪除關聯(lián)有記事的記事本,這得感謝FOREIGN KEY約束。
持久性(Durability):當服務器發(fā)送記事本已創(chuàng)建完畢的回執(zhí)后,客戶端會認為它的存在具有持久性,以便進行后續(xù)的操作。變更的持久性,可以讓客戶端知道在任何時刻對服務狀態(tài)的影響都能保持一致性。
對我們的同步協(xié)議而言,持久性最為重要。如果客戶端不能確定服務器端的變更具有持久性,那么協(xié)議將會變得復雜而低效。
“大數(shù)據(jù)”問題
得益于事務處理的數(shù)據(jù)庫的ACID屬性,同樣使得數(shù)據(jù)集非常難以擴展,以超出單臺服務器的范圍。數(shù)據(jù)庫集群和多主復制技術并不理想,鍵值存儲為實現(xiàn)可擴展性提供了一條捷徑。
所幸,Evernote暫時不需要考慮這個問題。即便是我們有近10億的筆記,和近20億的資源文件,這也并不能稱得上是一個大數(shù)據(jù)集。通過按用戶分區(qū),它被劃分成了2千萬個獨立的數(shù)據(jù)集。
我們尚未遇到所謂“大數(shù)據(jù)”引發(fā)的問題,倒是遇到了許多“中數(shù)據(jù)”的存儲問題,這就是通過規(guī)整分區(qū)形成的分片存儲架構。
也許以后……
我們對新的存儲系統(tǒng)非常感興趣,非常樂意應用在哪些對ACID要求不強,但確實需要橫向擴展的新項目中。例如,我們的報告分析系統(tǒng)已經(jīng)逐漸超出了MySQL平臺的承受力,需要被更快、更先進的系統(tǒng)所取代。
我們現(xiàn)在對以Evernote用戶元數(shù)據(jù)為基礎的MySQL分片存儲頗為滿意,盡管這不會引起那些IT弄潮兒的興趣。
NoSQL,指的是非關系型的數(shù)據(jù)庫。
NoSQL 是Not Only SQL 的縮寫,意思是“不僅僅是 SQL”,而不是“不使用 SQL”。
NoSQL 的出現(xiàn)可以解決傳統(tǒng)關系型數(shù)據(jù)庫所不能解決的問題。