大約10年前,我加入了Amazon Web Services,在那里我第一次看到了在分布式系統(tǒng)中進(jìn)行權(quán)衡的重要性。在大學(xué)里,我已經(jīng)了解了一致性和可用性之間的權(quán)衡(CAP定理),但實際上,頻譜要比這深得多。任何設(shè)計決策都可能涉及延遲,并發(fā)性,可伸縮性,耐用性,可維護(hù)性,功能性,操作簡便性以及系統(tǒng)其他方面之間的權(quán)衡,而這些權(quán)衡會對應(yīng)用程序的功能和用戶體驗產(chǎn)生有意義的影響,并且即使是業(yè)務(wù)本身的有效性。
創(chuàng)新互聯(lián)建站專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、臨海網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為臨海等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
也許在權(quán)衡需求最明顯的分布式系統(tǒng)中最具挑戰(zhàn)性的問題是構(gòu)建分布式數(shù)據(jù)庫。當(dāng)應(yīng)用程序開始需要可以在許多服務(wù)器上擴(kuò)展的數(shù)據(jù)庫時,數(shù)據(jù)庫開發(fā)人員開始做出極端的權(quán)衡。為了在許多節(jié)點上實現(xiàn)可伸縮性,分布式鍵值存儲(NoSQL)拋棄了傳統(tǒng)關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)提供的豐富功能集,包括SQL,聯(lián)接,外鍵和ACID保證。由于每個人都想要可伸縮性,因此RDBMS消失只是時間問題,對嗎?實際上,關(guān)系數(shù)據(jù)庫繼續(xù)主導(dǎo)著數(shù)據(jù)庫領(lǐng)域。這就是為什么:
在分布式系統(tǒng)(或任何系統(tǒng))中進(jìn)行權(quán)衡時,要考慮的最重要方面是開發(fā)成本。
數(shù)據(jù)庫軟件所做出的權(quán)衡將對應(yīng)用程序的開發(fā)成本產(chǎn)生重大影響。在高級應(yīng)用程序中處理需要可用性,可靠性和性能的數(shù)據(jù)是一個固有地需要解決的問題。成功解決每個小問題所需的工時數(shù)量可能很大。幸運的是,數(shù)據(jù)庫可以解決許多這些子問題,但是數(shù)據(jù)庫開發(fā)人員也面臨成本問題。實際上,要使數(shù)據(jù)庫足以滿足大多數(shù)應(yīng)用程序的功能,保證和性能,就需要數(shù)十年的時間。那就是建立關(guān)系數(shù)據(jù)庫如PostgreSQL和MySQL的地方。
在Citus Data,我們從不同角度解決了數(shù)據(jù)庫可伸縮性的需求。我和我的團(tuán)隊在過去的幾年中花費了很多時間將已建立的RDBMS轉(zhuǎn)換為分布式數(shù)據(jù)庫,而又不會失去其強(qiáng)大功能或從基礎(chǔ)項目中分叉。通過這樣做,我們發(fā)現(xiàn)RDBMS是構(gòu)建分布式數(shù)據(jù)庫的理想基礎(chǔ)。
使RDBMS對開發(fā)應(yīng)用程序(尤其是開源RDBMS,尤其是云RDBMS)如此吸引人的原因在于,您可以有效地利用數(shù)十年來對RDBMS進(jìn)行的工程投資,并利用這些RDBMS功能。您的應(yīng)用,降低了開發(fā)成本。
RDBMS為您提供:
這些功能幾乎對任何非平凡的應(yīng)用都很重要,但是要花很長時間才能開發(fā)。另一方面,某些應(yīng)用程序的工作量對于單臺計算機(jī)來說太過苛刻,因此需要水平可伸縮性。
許多新的分布式數(shù)據(jù)庫正在開發(fā)中,并且正在分布式鍵值存儲(“ NewSQL”)之上實現(xiàn)RDBMS功能,例如SQL。盡管這些較新的數(shù)據(jù)庫可以使用多臺計算機(jī)的資源,但是在SQL支持,查詢性能,并發(fā)性,索引,外鍵,事務(wù),存儲過程等方面,它們?nèi)赃h(yuǎn)未建立在關(guān)系數(shù)據(jù)庫系統(tǒng)上。您遇到許多要在應(yīng)用程序中解決的復(fù)雜問題。
許多大型互聯(lián)網(wǎng)公司采用的替代方法是RDBMS的手動,應(yīng)用程序?qū)臃制ㄍǔJ荘ostgreSQL或MySQL)。手動分片意味著有許多RDBMS節(jié)點,并且應(yīng)用程序會根據(jù)某種條件(例如,用戶ID)決定連接到哪個節(jié)點。應(yīng)用程序本身負(fù)責(zé)如何處理數(shù)據(jù)放置,架構(gòu)更改,查詢多個節(jié)點,復(fù)制表等,因此,如果執(zhí)行手動分片,最終將在應(yīng)用程序中實現(xiàn)自己的分布式數(shù)據(jù)庫,這可能甚至更多。昂貴。
幸運的是,有一種方法可以解決開發(fā)成本難題。
PostgreSQL已有數(shù)十年的發(fā)展 歷史 ,其令人難以置信的重點是代碼質(zhì)量,模塊化和可擴(kuò)展性。這種可擴(kuò)展性提供了一個獨特的機(jī)會:無需分叉就可以將PostgreSQL轉(zhuǎn)換為分布式數(shù)據(jù)庫。這就是我們構(gòu)建Citus的方式。
大約5年前,當(dāng)我加入一家名為Citus Data的初創(chuàng)公司時,我為在競爭激烈的市場中建立高級分布式數(shù)據(jù)庫而無任何現(xiàn)有基礎(chǔ)架構(gòu),品牌知名度,進(jìn)入市場,資本或大量工程師的挑戰(zhàn)感到沮喪 。 僅開發(fā)成本就似乎是無法克服的。 但是,就像應(yīng)用程序開發(fā)人員利用PostgreSQL來構(gòu)建復(fù)雜的應(yīng)用程序一樣,我們利用PostgreSQL來構(gòu)建……分布式PostgreSQL。
我們創(chuàng)建了Citus,這是開源的PostgreSQL擴(kuò)展,而不是從頭開始創(chuàng)建分布式數(shù)據(jù)庫,它以提供水平擴(kuò)展的方式透明地分發(fā)表和查詢,但是應(yīng)用程序開發(fā)人員需要具備所有PostgreSQL功能才能成功。
通過使用在計劃查詢時Postgres調(diào)用的內(nèi)部掛鉤,我們能夠?qū)⒎植际奖淼母拍钐砑拥絇ostgres。
分布式表的分片存儲在具有所有現(xiàn)有功能的常規(guī)PostgreSQL節(jié)點中,Citus發(fā)送常規(guī)SQL命令以查詢分片,然后合并結(jié)果。 我們還添加了參考表的概念,該參考表可在所有節(jié)點上復(fù)制,因此可以通過任何列與分布式表連接。 通過進(jìn)一步增加對分布式事務(wù),查詢路由,分布式子查詢和CTE,序列,更新等的支持,我們達(dá)到了最先進(jìn)的PostgreSQL功能可以使用的規(guī)模,但現(xiàn)在已經(jīng)可以大規(guī)模使用。
Citus相對來說還很年輕,但是已經(jīng)建立在PostgreSQL之上,已經(jīng)成為世界上最先進(jìn)的分布式數(shù)據(jù)庫之一。與PostgreSQL的完整功能集相比,這令人毛骨悚然,還有許多工作要做,Citus現(xiàn)在提供的功能及其擴(kuò)展方式使其在分布式數(shù)據(jù)庫環(huán)境中具有很大的獨特性。許多當(dāng)前的Citus用戶最初使用Postgres中的許多高級功能在單節(jié)點PostgreSQL服務(wù)器上建立業(yè)務(wù),然后僅用幾周的開發(fā)工作就遷移到Citus,以將其數(shù)據(jù)庫模式轉(zhuǎn)換為分布式表和引用表。對于任何其他數(shù)據(jù)庫,從單節(jié)點數(shù)據(jù)庫到分布式數(shù)據(jù)庫的這種遷移可能要花費數(shù)月甚至數(shù)年的時間。
像PostgreSQL這樣的RDBMS具有幾乎無限的功能和成熟的SQL引擎,可讓您以多種方式查詢數(shù)據(jù)。當(dāng)然,這些功能只有在速度很快時才對應(yīng)用程序有用。幸運的是,PostgreSQL很快,并且通過諸如實時查詢編譯之類的新功能不斷提高,但是當(dāng)您擁有大量數(shù)據(jù)或流量以至于一臺機(jī)器速度太慢時,那些強(qiáng)大的功能就不再那么有用了……除非您可以結(jié)合許多計算機(jī)的計算能力。這就是功能成為超級大國的地方。
通過采用PostgreSQL功能并進(jìn)行擴(kuò)展,Citus具有許多超級功能,這些功能使用戶可以將數(shù)據(jù)庫擴(kuò)展到任意大小,同時保持高性能及其所有功能。
盡管大多數(shù)這些功能對于開發(fā)需要擴(kuò)展的復(fù)雜應(yīng)用程序來說似乎都是必不可少的,但并不是所有分布式數(shù)據(jù)庫都支持它們。下面我們根據(jù)公開提供的文檔對一些流行的分布式數(shù)據(jù)庫進(jìn)行比較。
與在分布式數(shù)據(jù)庫中擁有超級功能相比,更重要的是能夠組合數(shù)據(jù)庫超級功能來解決復(fù)雜的用例。
由于支持查詢路由,參考表,索引,分布式事務(wù)和存儲過程,因此即使最先進(jìn)的多租戶OLTP應(yīng)用程序(例如Copper)也可以使用Citus擴(kuò)展到單個PostgreSQL節(jié)點之外,而不會在應(yīng)用程序中做出任何犧牲。
如果將子查詢下推與并行的分布式DML結(jié)合使用,則可以在數(shù)據(jù)庫內(nèi)部轉(zhuǎn)換大量數(shù)據(jù)。一個常見的示例是使用INSERT…SELECT構(gòu)建匯總表,該表可以并行化以適應(yīng)任何類型的數(shù)據(jù)量。結(jié)合通過COPY,索引,聯(lián)接和分區(qū)進(jìn)行的批量加載,您將擁有一個非常適合時間序列數(shù)據(jù)和實時分析應(yīng)用程序(如Algolia儀表板)的數(shù)據(jù)庫。
正如Microsoft的Min Wei在談到Microsoft如何使用Citus和PostgreSQL分析Windows數(shù)據(jù)時指出的那樣:Citus使您能夠使用分布式OLTP解決大規(guī)模OLAP問題。
Citus與其他分布式數(shù)據(jù)庫有些不同,后者通常是從頭開始開發(fā)的。 Citus沒有引入PostgreSQL中尚未提供的任何功能。 Citus數(shù)據(jù)庫以滿足需要擴(kuò)展的用例的方式擴(kuò)展了現(xiàn)有功能。重要的是,大多數(shù)PostgreSQL功能已經(jīng)針對各種用例進(jìn)行了數(shù)十年的開發(fā)和測試,而當(dāng)今用例的功能要求最終并沒有太大不同;主要是數(shù)據(jù)的規(guī)模和大小不同。因此,在構(gòu)建現(xiàn)代應(yīng)用程序時,基于世界上最先進(jìn)的開源RDBMS(PostgreSQL?。?gòu)建的分布式數(shù)據(jù)庫(如Citus)可以成為您的武器庫中最強(qiáng)大的工具。
原文:
本文:
討論:請加入知識星球或者微信圈子【首席架構(gòu)師圈】
2. 什么是NoSQL?
2.1 NoSQL 概述
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,
泛指非關(guān)系型的數(shù)據(jù)庫。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付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ò)展。
2.2 NoSQL代表
MongDB、 Redis、Memcache
3. 關(guān)系型數(shù)據(jù)庫與NoSQL的區(qū)別?
3.1 RDBMS
高度組織化結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化查詢語言(SQL)
數(shù)據(jù)和關(guān)系都存儲在單獨的表中。
數(shù)據(jù)操縱語言,數(shù)據(jù)定義語言
嚴(yán)格的一致性
基礎(chǔ)事務(wù)
ACID
關(guān)系型數(shù)據(jù)庫遵循ACID規(guī)則
事務(wù)在英文中是transaction,和現(xiàn)實世界中的交易很類似,它有如下四個特性:
A (Atomicity) 原子性
原子性很容易理解,也就是說事務(wù)里的所有操作要么全部做完,要么都不做,事務(wù)成功的條件是事務(wù)里的所有操作都成功,只要有一個操作失敗,整個事務(wù)就失敗,需要回滾。比如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。
C (Consistency) 一致性
一致性也比較容易理解,也就是說數(shù)據(jù)庫要一直處于一致的狀態(tài),事務(wù)的運行不會改變數(shù)據(jù)庫原本的一致性約束。
I (Isolation) 獨立性
所謂的獨立性是指并發(fā)的事務(wù)之間不會互相影響,如果一個事務(wù)要訪問的數(shù)據(jù)正在被另外一個事務(wù)修改,只要另外一個事務(wù)未提交,它所訪問的數(shù)據(jù)就不受未提交事務(wù)的影響。比如現(xiàn)有有個交易是從A賬戶轉(zhuǎn)100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的
D (Durability) 持久性
持久性是指一旦事務(wù)提交后,它所做的修改將會永久的保存在數(shù)據(jù)庫上,即使出現(xiàn)宕機(jī)也不會丟失。
3.2 NoSQL
代表著不僅僅是SQL
沒有聲明性查詢語言
沒有預(yù)定義的模式
鍵 - 值對存儲,列存儲,文檔存儲,圖形數(shù)據(jù)庫
最終一致性,而非ACID屬性
非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
CAP定理
高性能,高可用性和可伸縮性
分布式數(shù)據(jù)庫中的CAP原理(了解)
CAP定理:
Consistency(一致性), 數(shù)據(jù)一致更新,所有數(shù)據(jù)變動都是同步的
Availability(可用性), 好的響應(yīng)性能
Partition tolerance(分區(qū)容錯性) 可靠性
P: 系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運作。
定理:任何分布式系統(tǒng)只可同時滿足二點,沒法三者兼顧。
CAP理論的核心是:一個分布式系統(tǒng)不可能同時很好的滿足一致性,可用性和分區(qū)容錯性這三個需求,
因此,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
CA - 單點集群,滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大。
CP - 滿足一致性,分區(qū)容忍性的系統(tǒng),通常性能不是特別高。
AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通??赡軐σ恢滦砸蟮鸵恍?。
CAP理論就是說在分布式存儲系統(tǒng)中,最多只能實現(xiàn)上面的兩點。
而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會出現(xiàn)延遲丟包等問題,所以分區(qū)容忍性是我們必須需要實現(xiàn)的。
所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡,沒有NoSQL系統(tǒng)能同時保證這三點。
說明:C:強(qiáng)一致性 A:高可用性 P:分布式容忍性
舉例:
CA:傳統(tǒng)Oracle數(shù)據(jù)庫
AP:大多數(shù)網(wǎng)站架構(gòu)的選擇
CP:Redis、Mongodb
注意:分布式架構(gòu)的時候必須做出取舍。
一致性和可用性之間取一個平衡。多余大多數(shù)web應(yīng)用,其實并不需要強(qiáng)一致性。
因此犧牲C換取P,這是目前分布式數(shù)據(jù)庫產(chǎn)品的方向。
4. 當(dāng)下NoSQL的經(jīng)典應(yīng)用
當(dāng)下的應(yīng)用是 SQL 與 NoSQL 一起使用的。
代表項目:阿里巴巴商品信息的存放。
去 IOE 化。
ps:I 是指 IBM 的小型機(jī),很貴的,好像好幾萬一臺;O 是指 Oracle 數(shù)據(jù)庫,也很貴的,好幾萬呢;M 是指 EMC 的存儲設(shè)備,也很貴的。
難點:
數(shù)據(jù)類型多樣性。
數(shù)據(jù)源多樣性和變化重構(gòu)。
數(shù)據(jù)源改造而服務(wù)平臺不需要大面積重構(gòu)。
1/7 分步閱讀
1.實質(zhì)。非關(guān)系型數(shù)據(jù)庫的實質(zhì):非關(guān)系型數(shù)據(jù)庫產(chǎn)品是傳統(tǒng)關(guān)系型數(shù)據(jù)庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高產(chǎn)品性能。
2/7
2.價格。目前基本上大部分主流的非關(guān)系型數(shù)據(jù)庫都是免費的。而比較有名氣的關(guān)系型數(shù)據(jù)庫,比如Oracle、DB2、MSSQL是收費的。雖然Mysql免費,但它需要做很多工作才能正式用于生產(chǎn)。
3/7
3.功能。實際開發(fā)中,有很多業(yè)務(wù)需求,其實并不需要完整的關(guān)系型數(shù)據(jù)庫功能,非關(guān)系型數(shù)據(jù)庫的功能就足夠使用了。這種情況下,使用性能更高、成本更低的非關(guān)系型數(shù)據(jù)庫當(dāng)然是更明智的選擇。
4/7
傳統(tǒng)的SQL數(shù)據(jù)庫有3個缺點
許可費用昂貴
不能自動Sharding
嚴(yán)格的Schema
互聯(lián)網(wǎng)公司一般都是技術(shù)密集型的,就自己根據(jù)自己的需求搞了一套數(shù)據(jù)存儲,犧牲了嚴(yán)格一致性,滿足互聯(lián)網(wǎng)伸縮性的要求。
5/7
nosql 當(dāng)年是為了處理 雜亂的非結(jié)構(gòu)化數(shù)據(jù)來設(shè)計的 比如 網(wǎng)頁訪問信息 那就如樓上說的 閹割了sql 的 acid 特性 這樣當(dāng)然快了啊 比如插入數(shù)據(jù)
相反如果是一些 交易數(shù)據(jù) 數(shù)據(jù)的安全穩(wěn)定 壓倒一切的時候 rdbms 就顯現(xiàn)威力了 但是rdbms 在面對nosql的 一些挑戰(zhàn)之后 大力優(yōu)化了 對于一些 非結(jié)構(gòu)化數(shù)據(jù)的支持 比如json 數(shù)據(jù) 同時rdbms 對于 olap and oltp 的支持 也要比 nosql快的你是一點半點
6/7
非關(guān)系型數(shù)據(jù)庫的優(yōu)勢:1. 性能NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應(yīng)關(guān)系,而且不需要經(jīng)過SQL層的解析,所以性能非常高。2. 可擴(kuò)展性同樣也是因為基于鍵值對,數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴(kuò)展。
7/7
關(guān)系型數(shù)據(jù)庫的優(yōu)勢:1. 復(fù)雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常復(fù)雜的數(shù)據(jù)查詢。2. 事務(wù)支持使得對于安全性能很高的數(shù)據(jù)訪問要求得以實現(xiàn)。對于這兩類數(shù)據(jù)庫,對方的優(yōu)勢就是自己的弱勢,反之亦然。
NoSQL與RDBMS的九點區(qū)別聯(lián)系?
1 理解ACID與BASE的區(qū)別(ACID是關(guān)系型數(shù)據(jù)庫強(qiáng)一致性的四個要求,而BASE是NoSQL數(shù)據(jù)庫通常對可用性及一致性的弱要求原則,它們的意思分別是,ACID:atomicity, consistency, isolation, durability;BASE:Basically Available, Soft-state, Eventually Consistent。同時有意思的是ACID在英語里意為酸,BASE意思為堿)
2 理解持久化與非持久化的區(qū)別。這么說是因為有的NoSQL系統(tǒng)是純內(nèi)存存儲的。
3 你必須意識到傳統(tǒng)有關(guān)系型數(shù)據(jù)庫與NoSQL系統(tǒng)在數(shù)據(jù)結(jié)構(gòu)上的本質(zhì)區(qū)別。傳統(tǒng)關(guān)系型數(shù)據(jù)庫通常是基于行的表格型存儲,而NoSQL系統(tǒng)包括了列式存儲(Cassandra)、key/value存儲(Memcached)、文檔型存儲(CouchDB)以及圖結(jié)構(gòu)存儲(Neo4j)
4與傳統(tǒng)關(guān)系數(shù)據(jù)庫有統(tǒng)一的SQL語言操作接口不同,NoSQL系統(tǒng)通常有自己特有的API接口。
5 在架構(gòu)上,你必須搞清楚,NoSQL系統(tǒng)是被設(shè)計用于成百上千臺機(jī)器的集群中的,而非共享型數(shù)據(jù)庫系統(tǒng)的架構(gòu)。
6在NoSQL系統(tǒng)中,可能你得習(xí)慣一下不知道你的數(shù)據(jù)具體存在何處的情況。
7 在NoSQL系統(tǒng)中,你最好習(xí)慣它的弱一致性。”eventually consistent”(最終一致性)正是BASE原則中的重要一項。比如在Twitter,你在Followers列表中經(jīng)常會感受到數(shù)據(jù)的延遲。
8 在NoSQL系統(tǒng)中,你要理解,很多時候數(shù)據(jù)并不總是可用的。
9 你得理解,有的方案是擁有分區(qū)容忍性的,有的方案不一定有。
NewSQL是對一類現(xiàn)代關(guān)系型數(shù)據(jù)庫的統(tǒng)稱,這類數(shù)據(jù)庫對于一般的OLTP讀寫請求提供可橫向擴(kuò)展的性能,同時支持事務(wù)的ACID保證。這些系統(tǒng)既擁有NoSQL數(shù)據(jù)庫的擴(kuò)展性,又保持傳統(tǒng)數(shù)據(jù)庫的事務(wù)特性。NewSQL重新將“應(yīng)用程序邏輯與數(shù)據(jù)操作邏輯應(yīng)該分離”的理念帶回到現(xiàn)代數(shù)據(jù)庫的世界,這也驗證了歷史的發(fā)展總是呈現(xiàn)出螺旋上升的形式。
在21世紀(jì)00年代中,出現(xiàn)了許多數(shù)據(jù)倉庫系統(tǒng) (如 Vertica,Greeplum 和AsterData),這些以處理OLAP 請求為設(shè)計目標(biāo)的系統(tǒng)并不在本文定義的NewSQL范圍內(nèi)。OLAP 數(shù)據(jù)庫更關(guān)注針對海量數(shù)據(jù)的大型、復(fù)雜、只讀的查詢,查詢時間可能持續(xù)秒級、分鐘級甚至更長。
NoSQL的擁躉普遍認(rèn)為阻礙傳統(tǒng)數(shù)據(jù)庫橫向擴(kuò)容、提高可用性的原因在于ACID保證和關(guān)系模型,因此NoSQL運動的核心就是放棄事務(wù)強(qiáng)一致性以及關(guān)系模型,擁抱最終一致性和其它數(shù)據(jù)模型?(如 key/value,graphs 和Documents)。
兩個最著名的NoSQL數(shù)據(jù)庫就是Google的BigTable和Amazon的Dynamo,由于二者都未開源,其它組織就開始推出類似的開源替代項目,包括Facebook的 Cassandra (基于BigTable和Dynamo)、PowerSet的 Hbase(基于BigTable)。有一些創(chuàng)業(yè)公司也加入到這場NoSQL運動中,它們不一定是受BigTable和Dynamo的啟發(fā),但都響應(yīng)了NoSQL的哲學(xué),其中最出名的就是MongoDB。
在21世紀(jì)00年代末,市面上已經(jīng)有許多供用戶選擇的分布式數(shù)據(jù)庫產(chǎn)品。使用NoSQL的優(yōu)勢在于應(yīng)用開發(fā)者可以更關(guān)注應(yīng)用邏輯本身,而非數(shù)據(jù)庫的擴(kuò)展性問題;但與此同時許多應(yīng)用,如金融系統(tǒng)、訂單處理系統(tǒng),由于無法放棄事務(wù)的一致性要求被拒之門外。
一些組織,如Google,已經(jīng)發(fā)現(xiàn)他們的許多工程師將過多的精力放在處理數(shù)據(jù)一致性上,這既暴露了數(shù)據(jù)庫的抽象、又提高了代碼的復(fù)雜度,這時候要么選擇回到傳統(tǒng)DBMS時代,用更高的機(jī)器配置縱向擴(kuò)容,要么選擇回到中間件時代,開發(fā)支持分布式事務(wù)的中間件。這兩種方案成本都很高,于是NewSQL運動開始醞釀。
NewSQL數(shù)據(jù)庫設(shè)計針對的讀寫事務(wù)有以下特點:
1、耗時短。
2、使用索引查詢,涉及少量數(shù)據(jù)。
3、重復(fù)度高,通常使用相同的查詢語句和不同的查詢參考。
也有一些學(xué)者認(rèn)為NewSQL系統(tǒng)是特指實現(xiàn)上使用Lock-free并發(fā)控制技術(shù)和share-nothing架構(gòu)的數(shù)據(jù)庫。所有我們認(rèn)為是NewSQL的數(shù)據(jù)庫系統(tǒng)確實都有這樣的特點。