NoSQL,指的是非關(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ā)的
為尼瀘西等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及尼瀘西網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站制作、尼瀘西網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。
NoSQL(NoSQL
= Not Only SQL
),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)
據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維的注入。
從這一新興技術(shù)中選擇一款正確的NoSQL數(shù)據(jù)庫(kù)是非常具有挑戰(zhàn)性的。比一下網(wǎng)建議在選擇時(shí)考慮以下因素:
并發(fā)控制
并
發(fā)控制指的是當(dāng)多個(gè)用戶同時(shí)更新運(yùn)行時(shí),用于保護(hù)數(shù)據(jù)庫(kù)完整性的各種技術(shù)。并發(fā)機(jī)制不正確可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀等此類問(wèn)題。并發(fā)控制的目的是保
證一個(gè)用戶的工作不會(huì)對(duì)另一個(gè)用戶的工作產(chǎn)生不合理的影響。在某些情況下,這些措施保證了當(dāng)用戶和其他用戶一起操作時(shí),所得的結(jié)果和她單獨(dú)操作時(shí)的結(jié)果是
一樣的。在另一些情況下,這表示用戶的工作按預(yù)定的方式受其他用戶的影響。
封鎖
就是事務(wù)T在對(duì)某個(gè)數(shù)據(jù)對(duì)象(例如表、記錄等)操作之前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)T就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在事務(wù)T釋放它的鎖之前,其它的事務(wù)不能更新此數(shù)據(jù)對(duì)象。
封鎖是一次只允許一個(gè)用戶讀取或修改的一種機(jī)制,是實(shí)現(xiàn)并發(fā)控制的一個(gè)非常重要的技術(shù)。
MVCC
Multi-Version Concurrency Control多版本并發(fā)控制,維持一個(gè)數(shù)據(jù)的多個(gè)版本使讀寫(xiě)操作沒(méi)有沖突。MVCC優(yōu)化了數(shù)據(jù)庫(kù)并發(fā)系統(tǒng),使系統(tǒng)在有大量并發(fā)用戶時(shí)得到最高的性能,并且可以不用關(guān)閉服務(wù)器就直接進(jìn)行熱備份。
ACID
指
數(shù)據(jù)庫(kù)事務(wù)正確執(zhí)行的四個(gè)基本要素的縮寫(xiě)。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久
性(Durability)。一個(gè)支持事務(wù)(Transaction)的數(shù)據(jù)庫(kù)系統(tǒng),必需要具有這四種特性,否則在事務(wù)過(guò)程(Transaction
processing)當(dāng)中無(wú)法保證數(shù)據(jù)的正確性,交易過(guò)程極可能達(dá)不到交易方的要求。
None
一些系統(tǒng)不提供原子性。
鏡像
數(shù)據(jù)庫(kù)鏡像是DBMS根據(jù)DBA的要求,自動(dòng)把整個(gè)數(shù)據(jù)庫(kù)或其中的關(guān)鍵數(shù)據(jù)復(fù)制到另一個(gè)磁盤(pán)上,每當(dāng)主數(shù)據(jù)庫(kù)更新時(shí),DBMS會(huì)自動(dòng)把更新后的數(shù)據(jù)復(fù)制過(guò)去,即DBMS自動(dòng)保證鏡像數(shù)據(jù)與主數(shù)據(jù)的一致性。
鏡像分為同步和異步。
數(shù)據(jù)存儲(chǔ)
指的是數(shù)據(jù)的物理特性怎樣被存儲(chǔ)在數(shù)據(jù)庫(kù)中。
磁盤(pán) 數(shù)據(jù)被存儲(chǔ)在硬盤(pán)驅(qū)動(dòng)器里;
GFS或谷歌文件系統(tǒng)是一個(gè)由谷歌開(kāi)發(fā)的專有的分布式文件系統(tǒng);
Hadoop是Apache軟件框架,免費(fèi)許可下支持?jǐn)?shù)據(jù)密集型分布式應(yīng)用程序;
RAM隨機(jī)存儲(chǔ)器;
插件 可以添加外部插件;
Amazon S3通過(guò)Web服務(wù)接口提供存儲(chǔ);
BDB:BDB
全稱是 “Berkeley DB”,它是MySQL具有事務(wù)能力的表類型,由Sleepycat
Software開(kāi)發(fā)。BDB表類型提供了MySQL用戶長(zhǎng)久期盼的功能,即事務(wù)控制能力。在任何RDBMS中,事務(wù)控制能力都是一種極其重要和寶貴的功
能。事務(wù)控制能力使得我們能夠確保一組命令確實(shí)已經(jīng)全部執(zhí)行成功,或者確保當(dāng)任何一個(gè)命令出現(xiàn)錯(cuò)誤時(shí)所有命令的執(zhí)行結(jié)果均被退回。
實(shí)現(xiàn)語(yǔ)言
實(shí)現(xiàn)語(yǔ)言會(huì)影響數(shù)據(jù)庫(kù)的發(fā)展速度。典型的NoSQL數(shù)據(jù)庫(kù)是用低級(jí)語(yǔ)言如C / C + +編寫(xiě)的。另一方面,那些更高層次的語(yǔ)言如Java,使自定義更容易。
實(shí)現(xiàn)語(yǔ)言有:C, C++, Erlang, Java, Python
特性
考慮下列哪一個(gè)特點(diǎn)對(duì)你的數(shù)據(jù)庫(kù)是最重要的:
持久性
可用性
一致性
分區(qū)容忍性
證書(shū)類型
下面這些許可證是一個(gè)不同的開(kāi)放源碼許可的形式:
GPL:通用公共許可證
BSD:伯克利軟件分發(fā)
MPL:Mozilla公共許可證
EPL:Eclipse公共許可證
IDPL:最初的開(kāi)發(fā)者的公共許可證
LGPL:較寬松通用公共許可證
存儲(chǔ)類型
存儲(chǔ)類型是NoSQL數(shù)據(jù)庫(kù)最大的不同,是決定使用哪款數(shù)據(jù)庫(kù)的一個(gè)首要指標(biāo)。
關(guān)鍵字:支持get、put和刪除操作
按列存儲(chǔ):相對(duì)于傳統(tǒng)的按行存儲(chǔ),數(shù)據(jù)集成容易多了
面向文件系統(tǒng):存儲(chǔ)像是JSON或XML這樣的結(jié)構(gòu)化文件,很容易就能從面向?qū)ο筌浖蝎@取數(shù)據(jù)。
常見(jiàn)的理解及分析
目前流行的、對(duì)CAP理論解釋的情形是從同一數(shù)據(jù)在網(wǎng)絡(luò)環(huán)境中的多個(gè)副本出發(fā)的。為了保證數(shù)據(jù)不會(huì)丟失,在企業(yè)級(jí)的數(shù)據(jù)管理方案中,一般必須考慮數(shù)據(jù)的冗余存儲(chǔ)問(wèn)題,而這應(yīng)該是通過(guò)在網(wǎng)絡(luò)上的其他獨(dú)立物理存儲(chǔ)節(jié)點(diǎn)上保留另一份、或多份數(shù)據(jù)副本來(lái)實(shí)現(xiàn)的(如附圖所示)。因?yàn)樵谕粋€(gè)存儲(chǔ)節(jié)點(diǎn)上的數(shù)據(jù)冗余明顯不能解決單點(diǎn)故障問(wèn)題,這與通過(guò)多節(jié)點(diǎn)集群來(lái)提供更好的計(jì)算可用性的道理是相同的。
附圖 CAP理論示意圖
其實(shí),不用做嚴(yán)格的證明也可以想見(jiàn),如附圖的情況,數(shù)據(jù)在節(jié)點(diǎn)A、B、C上保留了三份,如果對(duì)節(jié)點(diǎn)A上的數(shù)據(jù)進(jìn)行了修改,然后再讓客戶端通過(guò)網(wǎng)絡(luò)對(duì)該數(shù)據(jù)進(jìn)行讀取。那么,客戶端的讀取操作什么時(shí)候返回呢?
有這樣兩種情況:一種情況是要求節(jié)點(diǎn)A、B、C的三份數(shù)據(jù)完全一致后返回。也就是說(shuō),這時(shí)從任何一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)讀取的數(shù)據(jù)都是一樣的,這就是所謂的強(qiáng)一致性讀。很明顯,這時(shí)數(shù)據(jù)讀取的Latency要高一些(因?yàn)橐葦?shù)據(jù)在網(wǎng)絡(luò)中的復(fù)制),同時(shí)A、B、C三個(gè)節(jié)點(diǎn)中任何一個(gè)宕機(jī),都會(huì)導(dǎo)致數(shù)據(jù)不可用。也就是說(shuō),要保證強(qiáng)一致性,網(wǎng)絡(luò)中的副本越多,數(shù)據(jù)的可用性就越差;
另一種情況是,允許讀操作立即返回,容忍B節(jié)點(diǎn)的讀取與A節(jié)點(diǎn)的讀取不一致的情況發(fā)生。這樣一來(lái),可用性顯然得到了提高,網(wǎng)絡(luò)中的副本也可以多一些,唯一得不到保證的是數(shù)據(jù)一致性。當(dāng)然,對(duì)寫(xiě)操作同樣也有多個(gè)節(jié)點(diǎn)一致性的情況,在此不再贅述。
可以看出,上述對(duì)CAP理論的解釋主要是從網(wǎng)絡(luò)上多個(gè)節(jié)點(diǎn)之間的讀寫(xiě)一致性出發(fā)考慮問(wèn)題的。而這一點(diǎn),對(duì)于關(guān)系型數(shù)據(jù)庫(kù)意味著什么呢?當(dāng)然主要是指通常所說(shuō)的Standby(關(guān)于分布式事務(wù),涉及到更多考慮,隨后討論)情況。對(duì)此,在實(shí)踐中我們大多已經(jīng)采取了弱一致性的異步延時(shí)同步方案,以提高可用性。這種情況并不存在關(guān)系型數(shù)據(jù)庫(kù)為保證C、A而放棄P的情況;而對(duì)海量數(shù)據(jù)管理的需求,關(guān)系型數(shù)據(jù)庫(kù)擴(kuò)展過(guò)程中所遇到的性能瓶頸,似乎也并不是CAP理論中所描述的那種原因造成的。那么,上述流行的說(shuō)法中所描述的關(guān)系型數(shù)據(jù)庫(kù)為保證C、A而犧牲P到底是在指什么呢?
因此,如果根據(jù)現(xiàn)有的大多數(shù)資料對(duì)CAP理論的如上解釋,即只將其當(dāng)作分布式系統(tǒng)中多個(gè)數(shù)據(jù)副本之間的讀寫(xiě)一致性問(wèn)題的通用理論對(duì)待,那么就可以得出結(jié)論:CAP既適用于NoSQL數(shù)據(jù)庫(kù),也適用于關(guān)系型數(shù)據(jù)庫(kù)。它是NoSQL數(shù)據(jù)庫(kù)、關(guān)系型數(shù)據(jù)庫(kù),乃至一切分布式系統(tǒng)在設(shè)計(jì)數(shù)據(jù)多個(gè)副本之間讀寫(xiě)一致性問(wèn)題時(shí)需要遵循的共同原則。
更深入的探究:兩種重要的分布式場(chǎng)景
在本文中我們要說(shuō)的重點(diǎn)與核心是:關(guān)于對(duì)CAP理論中一致性C的理解,除了上述數(shù)據(jù)副本之間的讀寫(xiě)一致性以外,分布式環(huán)境中還有兩種非常重要的場(chǎng)景,如果不對(duì)它們進(jìn)行認(rèn)識(shí)與討論,就永遠(yuǎn)無(wú)法全面地理解CAP,當(dāng)然也就無(wú)法根據(jù)CAP做出正確的解釋。但可惜的是,目前為止卻很少有人提及這兩種場(chǎng)景:那就是事務(wù)與關(guān)聯(lián)。
先來(lái)看看分布式環(huán)境中的事務(wù)場(chǎng)景。我們知道,在關(guān)系型數(shù)據(jù)庫(kù)的事務(wù)操作遵循ACID原則,其中的一致性C,主要是指一個(gè)事務(wù)中相關(guān)聯(lián)的數(shù)據(jù)在事務(wù)操作結(jié)束后是一致的。所謂ACID原則,是指在寫(xiě)入/異動(dòng)資料的過(guò)程中,為保證交易正確可靠所必須具備的四個(gè)特性:即原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)和持久性(Durability)。
例如銀行的一個(gè)存款交易事務(wù),將導(dǎo)致交易流水表增加一條記錄。同時(shí),必須導(dǎo)致賬戶表余額發(fā)生變化,這兩個(gè)操作必須是一個(gè)事務(wù)中全部完成,保證相關(guān)數(shù)據(jù)的一致性。而前文解釋的CAP理論中的C是指對(duì)一個(gè)數(shù)據(jù)多個(gè)備份的讀寫(xiě)一致性。表面上看,這兩者不是一回事,但實(shí)際上,卻是本質(zhì)基本相同的事物:數(shù)據(jù)請(qǐng)求會(huì)等待多個(gè)相關(guān)數(shù)據(jù)操作全部完成才返回。對(duì)分布式系統(tǒng)來(lái)講,這就是我們通常所說(shuō)的分布式事務(wù)問(wèn)題。
眾所周知,分布式事務(wù)一般采用兩階段提交策略來(lái)實(shí)現(xiàn),這是一個(gè)非常耗時(shí)的復(fù)雜過(guò)程,會(huì)嚴(yán)重影響系統(tǒng)效率,在實(shí)踐中我們盡量避免使用它。在實(shí)踐過(guò)程中,如果我們?yōu)榱藬U(kuò)展數(shù)據(jù)容量將數(shù)據(jù)分布式存儲(chǔ),而事務(wù)的要求又完全不能降低。那么,系統(tǒng)的可用性一定會(huì)大大降低,在現(xiàn)實(shí)中我們一般都采用對(duì)這些數(shù)據(jù)不分散存儲(chǔ)的策略。
當(dāng)然,我們也可以說(shuō),最常使用的關(guān)系型數(shù)據(jù)庫(kù),因?yàn)檫@個(gè)原因,擴(kuò)展性(分區(qū)可容忍性P)受到了限制,這是完全符合CAP理論的。但同時(shí)我們應(yīng)該意識(shí)到,這對(duì)NoSQL數(shù)據(jù)庫(kù)也是一樣的。如果NoSQL數(shù)據(jù)庫(kù)也要求嚴(yán)格的分布式事務(wù)功能,情況并不會(huì)比關(guān)系型數(shù)據(jù)庫(kù)好多少。只是在NoSQL的設(shè)計(jì)中,我們往往會(huì)弱化甚至去除事務(wù)的功能,該問(wèn)題才表現(xiàn)得不那么明顯而已。
因此,在擴(kuò)展性問(wèn)題上,如果要說(shuō)關(guān)系型數(shù)據(jù)庫(kù)是為了保證C、A而犧牲P,在盡量避免分布式事務(wù)這一點(diǎn)上來(lái)看,應(yīng)該是正確的。也就是說(shuō):關(guān)系型數(shù)據(jù)庫(kù)應(yīng)該具有強(qiáng)大的事務(wù)功能,如果分區(qū)擴(kuò)展,可用性就會(huì)降低;而NoSQL數(shù)據(jù)庫(kù)干脆弱化甚至去除了事務(wù)功能,因此,分區(qū)的可擴(kuò)展性就大大增加了。
再來(lái)看看分布式環(huán)境中的關(guān)聯(lián)場(chǎng)景。初看起來(lái),關(guān)系型數(shù)據(jù)庫(kù)中常用的多表關(guān)聯(lián)操作與CAP理論就更加不沾邊了。但仔細(xì)考慮,也可以用它來(lái)解釋數(shù)據(jù)庫(kù)分區(qū)擴(kuò)展對(duì)關(guān)聯(lián)所帶來(lái)的影響。對(duì)一個(gè)數(shù)據(jù)庫(kù)來(lái)講,采用了分區(qū)擴(kuò)展策略來(lái)擴(kuò)充容量,數(shù)據(jù)分散存儲(chǔ)了,很顯然多表關(guān)聯(lián)的性能就會(huì)下降,因?yàn)槲覀儽仨氃诰W(wǎng)絡(luò)上進(jìn)行大量的數(shù)據(jù)遷移操作,這與CAP理論中數(shù)據(jù)副本之間的同步操作本質(zhì)上也是相同的。
因此,如果要保證系統(tǒng)的高可用性,需要同時(shí)實(shí)現(xiàn)強(qiáng)大的多表關(guān)系操作的關(guān)系型數(shù)據(jù)庫(kù)在分區(qū)可擴(kuò)展性上就遇到了極大的限制(即使是那些采用了各種優(yōu)秀解決方案的MPP架構(gòu)的關(guān)系型數(shù)據(jù)庫(kù),如TeraData,Netezza等,其水平可擴(kuò)展性也是遠(yuǎn)遠(yuǎn)不如NoSQL數(shù)據(jù)庫(kù)的),而NoSQL數(shù)據(jù)庫(kù)則干脆在設(shè)計(jì)上弱化甚至去除了多表關(guān)聯(lián)操作。那么,從這一點(diǎn)上來(lái)理解“NoSQL數(shù)據(jù)庫(kù)是為了保證A與P,而犧牲C”的說(shuō)法,也是可以講得通的。當(dāng)然,我們應(yīng)該理解,關(guān)聯(lián)問(wèn)題在很多情況下不是并行處理的優(yōu)點(diǎn)所在,這在很大程度上與Amdahl定律相符合。
所以,從事務(wù)與關(guān)聯(lián)的角度來(lái)關(guān)系型數(shù)據(jù)庫(kù)的分區(qū)可擴(kuò)展性為什么受限的原因是最為清楚的。而NoSQL數(shù)據(jù)庫(kù)也正是因?yàn)槿趸?,甚至去除了像事?wù)與關(guān)聯(lián)(全面地講,其實(shí)還有索引等特性)等在分布式環(huán)境中會(huì)嚴(yán)重影響系統(tǒng)可用性的功能,才獲得了更好的水平可擴(kuò)展性。
那么,如果將事務(wù)與關(guān)聯(lián)也納入CAP理論中一致性C的范疇的話,問(wèn)題就很清楚了:關(guān)于“關(guān)系型數(shù)據(jù)庫(kù)為了保證一致性C與可用性A,而不得不犧牲分區(qū)可容忍性P”的說(shuō)法便是正確的了。但關(guān)于“NoSQL選擇了C與P,或者A與P”的說(shuō)法則是錯(cuò)誤的,所有的NoSQL數(shù)據(jù)庫(kù)在設(shè)計(jì)策略的大方向上都是選擇了A與P(雖然對(duì)同一數(shù)據(jù)多個(gè)副本的讀寫(xiě)一致性問(wèn)題的設(shè)計(jì)各有不同),從來(lái)沒(méi)有完全選擇C與P的情況存在。
結(jié)論
現(xiàn)在看來(lái),如果理解CAP理論只是指多個(gè)數(shù)據(jù)副本之間讀寫(xiě)一致性的問(wèn)題,那么它對(duì)關(guān)系型數(shù)據(jù)庫(kù)與NoSQL數(shù)據(jù)庫(kù)來(lái)講是完全一樣的,它只是運(yùn)行在分布式環(huán)境中的數(shù)據(jù)管理設(shè)施在設(shè)計(jì)讀寫(xiě)一致性問(wèn)題時(shí)需要遵循的一個(gè)原則而已,卻并不是NoSQL數(shù)據(jù)庫(kù)具有優(yōu)秀的水平可擴(kuò)展性的真正原因。而如果將CAP理論中的一致性C理解為讀寫(xiě)一致性、事務(wù)與關(guān)聯(lián)操作的綜合,則可以認(rèn)為關(guān)系型數(shù)據(jù)庫(kù)選擇了C與A,而NoSQL數(shù)據(jù)庫(kù)則全都是選擇了A與P,但并沒(méi)有選擇C與P的情況存在。這才是用CAP理論來(lái)支持NoSQL數(shù)據(jù)庫(kù)設(shè)計(jì)正確認(rèn)識(shí)。
其實(shí),這種認(rèn)識(shí)正好與被廣泛認(rèn)同的NoSQL的另一個(gè)理論基礎(chǔ)相吻合,即與ACID對(duì)著干的BASE(基本可用性、軟狀態(tài)與最終一致性)。因?yàn)锽ASE的含義正好是指“NoSQL數(shù)據(jù)庫(kù)設(shè)計(jì)可以通過(guò)犧牲一定的數(shù)據(jù)一致性和容錯(cuò)性來(lái)?yè)Q取高性能的保持甚至提高”,即NoSQL數(shù)據(jù)庫(kù)都應(yīng)該是犧牲C來(lái)?yè)Q取P,而不是犧牲A??捎眯訟正好是所有NoSQL數(shù)據(jù)庫(kù)都普遍追求的特性。
NoSQL(NoSQL
=
Not
Only
SQL
),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維的注入。
隨著大數(shù)據(jù)的不斷發(fā)展,非關(guān)系型的數(shù)據(jù)庫(kù)現(xiàn)在成了一個(gè)極其熱門(mén)的新領(lǐng)域,非關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展非常迅速?,F(xiàn)今的計(jì)算機(jī)體系結(jié)構(gòu)在數(shù)據(jù)存儲(chǔ)方面要有龐大的水平擴(kuò)展性,而NoSQL也正是致力于改變這一現(xiàn)狀。目前Google的
BigTable和Amazon
的Dynamo使用的就是NoSQL型數(shù)據(jù)庫(kù),本文介紹了10種出色的NoSQL數(shù)據(jù)庫(kù)。
雖然NoSQL流行語(yǔ)火起來(lái)才短短一年的時(shí)間,但是不可否認(rèn),現(xiàn)在已經(jīng)開(kāi)始了第二代運(yùn)動(dòng)。盡管早期的堆棧代碼只能算是一種實(shí)驗(yàn),然而現(xiàn)在的系統(tǒng)已經(jīng)更加的成熟、穩(wěn)定。不過(guò)現(xiàn)在也面臨著一個(gè)嚴(yán)酷的事實(shí):技術(shù)越來(lái)越成熟——以至于原來(lái)很好的NoSQL數(shù)據(jù)存儲(chǔ)不得不進(jìn)行重寫(xiě),也有少數(shù)人認(rèn)為這就是所謂的2.0版本。這里列出一些比較知名的NoSQL工具,可以為大數(shù)據(jù)建立快速、可擴(kuò)展的存儲(chǔ)庫(kù)。
給一個(gè)地址吧
2. 什么是NoSQL?
2.1 NoSQL 概述
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ǔ)。
(例如谷歌或Facebook每天為他們的用戶收集萬(wàn)億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。
2.2 NoSQL代表
MongDB、 Redis、Memcache
3. 關(guān)系型數(shù)據(jù)庫(kù)與NoSQL的區(qū)別?
3.1 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ù)
ACID
關(guān)系型數(shù)據(jù)庫(kù)遵循ACID規(guī)則
事務(wù)在英文中是transaction,和現(xiàn)實(shí)世界中的交易很類似,它有如下四個(gè)特性:
A (Atomicity) 原子性
原子性很容易理解,也就是說(shuō)事務(wù)里的所有操作要么全部做完,要么都不做,事務(wù)成功的條件是事務(wù)里的所有操作都成功,只要有一個(gè)操作失敗,整個(gè)事務(wù)就失敗,需要回滾。比如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元至B賬戶,分為兩個(gè)步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢(qián)會(huì)莫名其妙少了100元。
C (Consistency) 一致性
一致性也比較容易理解,也就是說(shuō)數(shù)據(jù)庫(kù)要一直處于一致的狀態(tài),事務(wù)的運(yùn)行不會(huì)改變數(shù)據(jù)庫(kù)原本的一致性約束。
I (Isolation) 獨(dú)立性
所謂的獨(dú)立性是指并發(fā)的事務(wù)之間不會(huì)互相影響,如果一個(gè)事務(wù)要訪問(wèn)的數(shù)據(jù)正在被另外一個(gè)事務(wù)修改,只要另外一個(gè)事務(wù)未提交,它所訪問(wèn)的數(shù)據(jù)就不受未提交事務(wù)的影響。比如現(xiàn)有有個(gè)交易是從A賬戶轉(zhuǎn)100元至B賬戶,在這個(gè)交易還未完成的情況下,如果此時(shí)B查詢自己的賬戶,是看不到新增加的100元的
D (Durability) 持久性
持久性是指一旦事務(wù)提交后,它所做的修改將會(huì)永久的保存在數(shù)據(jù)庫(kù)上,即使出現(xiàn)宕機(jī)也不會(huì)丟失。
3.2 NoSQL
代表著不僅僅是SQL
沒(méi)有聲明性查詢語(yǔ)言
沒(méi)有預(yù)定義的模式
鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫(kù)
最終一致性,而非ACID屬性
非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
CAP定理
高性能,高可用性和可伸縮性
分布式數(shù)據(jù)庫(kù)中的CAP原理(了解)
CAP定理:
Consistency(一致性), 數(shù)據(jù)一致更新,所有數(shù)據(jù)變動(dòng)都是同步的
Availability(可用性), 好的響應(yīng)性能
Partition tolerance(分區(qū)容錯(cuò)性) 可靠性
P: 系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作。
定理:任何分布式系統(tǒng)只可同時(shí)滿足二點(diǎn),沒(méi)法三者兼顧。
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,
因此,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫(kù)分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
CA - 單點(diǎn)集群,滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大。
CP - 滿足一致性,分區(qū)容忍性的系統(tǒng),通常性能不是特別高。
AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通常可能對(duì)一致性要求低一些。
CAP理論就是說(shuō)在分布式存儲(chǔ)系統(tǒng)中,最多只能實(shí)現(xiàn)上面的兩點(diǎn)。
而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會(huì)出現(xiàn)延遲丟包等問(wèn)題,所以分區(qū)容忍性是我們必須需要實(shí)現(xiàn)的。
所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡,沒(méi)有NoSQL系統(tǒng)能同時(shí)保證這三點(diǎn)。
說(shuō)明:C:強(qiáng)一致性 A:高可用性 P:分布式容忍性
舉例:
CA:傳統(tǒng)Oracle數(shù)據(jù)庫(kù)
AP:大多數(shù)網(wǎng)站架構(gòu)的選擇
CP:Redis、Mongodb
注意:分布式架構(gòu)的時(shí)候必須做出取舍。
一致性和可用性之間取一個(gè)平衡。多余大多數(shù)web應(yīng)用,其實(shí)并不需要強(qiáng)一致性。
因此犧牲C換取P,這是目前分布式數(shù)據(jù)庫(kù)產(chǎn)品的方向。
4. 當(dāng)下NoSQL的經(jīng)典應(yīng)用
當(dāng)下的應(yīng)用是 SQL 與 NoSQL 一起使用的。
代表項(xiàng)目:阿里巴巴商品信息的存放。
去 IOE 化。
ps:I 是指 IBM 的小型機(jī),很貴的,好像好幾萬(wàn)一臺(tái);O 是指 Oracle 數(shù)據(jù)庫(kù),也很貴的,好幾萬(wàn)呢;M 是指 EMC 的存儲(chǔ)設(shè)備,也很貴的。
難點(diǎn):
數(shù)據(jù)類型多樣性。
數(shù)據(jù)源多樣性和變化重構(gòu)。
數(shù)據(jù)源改造而服務(wù)平臺(tái)不需要大面積重構(gòu)。
可以使用的語(yǔ)言有java,c++等 .云技術(shù)的開(kāi)發(fā),并沒(méi)有發(fā)展什么新語(yǔ)言,而是在其他語(yǔ)言的基礎(chǔ)上。比如Java語(yǔ)言。與其他技術(shù),最顯著的區(qū)別,不是在開(kāi)發(fā)上,而是在于架構(gòu)上,最顯著的特點(diǎn)是分布式。
1、Hadoop
Hadoop是一個(gè)框架,它是由Java語(yǔ)言來(lái)實(shí)現(xiàn)的。Hadoop是處理大數(shù)據(jù)技術(shù). Hadoop可以處理云計(jì)算產(chǎn)生大數(shù)據(jù),需要區(qū)分hadoop并不是云計(jì)算。它和云計(jì)算密不可分。詳細(xì)見(jiàn)下面內(nèi)容。
(1)Hadoop是如何產(chǎn)生的
Hadoop產(chǎn)生是互聯(lián)網(wǎng)的產(chǎn)物,也是必然。大家都知道,我們上網(wǎng)時(shí)需要服務(wù)器的。假如世界上只有一臺(tái)電腦,根本不需要服務(wù)器。如果有10臺(tái)服務(wù)器,100臺(tái),1000臺(tái),上萬(wàn)臺(tái),那么我們?cè)撊绾巫尨蠹蚁嗷ネㄐ牛蚕碇R(shí),所以我們產(chǎn)生了互聯(lián)網(wǎng)。
互聯(lián)網(wǎng)產(chǎn)生,全世界都可以通信,知識(shí)如此居多,我們像獲取更多的知識(shí),想獲取新技術(shù),獲取新知識(shí),通過(guò)什么,國(guó)內(nèi)通過(guò)百度,國(guó)外也有許多,比如Google??墒前俣群凸雀璧挠脩粲卸嗌?,多了不說(shuō),最起碼有上億的用戶。并且這些用戶每天上百度,上谷歌,又會(huì)產(chǎn)生多少數(shù)據(jù),查詢多少數(shù)據(jù)。那么他們?cè)趺闯惺苋绱硕嘤脩?。這不是一臺(tái)電腦、一臺(tái)服務(wù)器能完成的事情。
2、openstack
openstack是搭建云平臺(tái)技術(shù),可以搭建公有云,私有云,和混合云。
OpenStack是開(kāi)源的云管理平臺(tái),用來(lái)統(tǒng)一管理多個(gè)虛擬化集群的框架。
openstack目前分為兩種
(1)openstack的運(yùn)維
(2)openstack的二次開(kāi)發(fā)
目前來(lái)講,國(guó)內(nèi)真正對(duì)openstack二次開(kāi)發(fā)的很少,這方面的人才也是比較稀缺,網(wǎng)上資料也比較少,淘寶上資料也稀缺,只有很少一部分。建議向高工資的朋友,可以從這方面下點(diǎn)功夫。
3.Cloud Foundry
Cloud Foundry是一個(gè)開(kāi)源的平臺(tái)即服務(wù)產(chǎn)品,它提供給開(kāi)發(fā)者自由度去選擇云平臺(tái),開(kāi)發(fā)框架和應(yīng)用服務(wù)。Cloud Foundry最初由 VMware 發(fā)起,得到了業(yè)界廣泛的支持,它使得開(kāi)發(fā)者能夠更快更容易的開(kāi)發(fā),測(cè)試,部署和擴(kuò)展應(yīng)用。Cloud Foundry是一個(gè)開(kāi)源項(xiàng)目,用戶可以使用多種私有云發(fā)行版,也可以使用公共云服務(wù)。
還有nosql即not only sql。
nosql數(shù)據(jù)庫(kù)是一種比較低級(jí)的數(shù)據(jù)庫(kù),關(guān)系型數(shù)據(jù)庫(kù)是由nosql數(shù)據(jù)庫(kù)發(fā)展而來(lái)。
什么是關(guān)系型數(shù)據(jù)庫(kù),這里不從概念上區(qū)別,常用的SqlServer,mysql,oracle都是關(guān)系型數(shù)據(jù)庫(kù)。關(guān)系型數(shù)據(jù)庫(kù)顧名思義,數(shù)據(jù)庫(kù)關(guān)系明確嚴(yán)謹(jǐn)。
而nosql則是一種數(shù)據(jù)關(guān)系不嚴(yán)謹(jǐn)?shù)臄?shù)據(jù)庫(kù)。一個(gè)key和value。
c++
java的長(zhǎng)處 都是c的短處
c的長(zhǎng)處是夠精煉,可以開(kāi)發(fā)很底層?xùn)|西,并作為新語(yǔ)言的母體
c的有些語(yǔ)法格式過(guò)分死板 比如
int i;
for(i=0;i10;i++);
而java中除了可以這樣寫(xiě)之外 還可以
for(int i=0;i10;i++);
綜上 總結(jié)一下
優(yōu)點(diǎn):
c應(yīng)該夠精煉 夠簡(jiǎn)單 可以作為其他語(yǔ)言的母體 或基于硬件的開(kāi)發(fā)(操作系統(tǒng)等)
缺點(diǎn):
生產(chǎn)力比較低 我的意思 用c某些方面開(kāi)發(fā)效率很低
學(xué)習(xí)C++有一些難點(diǎn)需要注意:
知識(shí)點(diǎn)廣泛而且難度高。按照幾年前Scot Mayer在Effective C++中對(duì)C++的定義來(lái)看,C++是一門(mén)多范型語(yǔ)言,包括了C、面向?qū)ο缶幊毯头盒途幊獭3绦騿T需要正確理解很多基礎(chǔ)概念,比如,堆和棧的區(qū)別、指針、指針的指針、虛函數(shù)的內(nèi)部原理、繼承引發(fā)的對(duì)象內(nèi)存布局、多繼承引發(fā)的模棱兩可、模板以及編譯器推導(dǎo)、STL算法等。C++的內(nèi)容如此廣泛,因此每個(gè)知識(shí)點(diǎn)的學(xué)習(xí)和積累都不是件容易的事情, 自然誤用的情況常會(huì)發(fā)生。
C++打開(kāi)了直接面向操作系統(tǒng)API編程的大門(mén),因此使用C++完成工作,很多時(shí)候需要學(xué)習(xí)大量的平臺(tái)相關(guān)的API,這些API有的非常復(fù)雜。比如被稱為噩夢(mèng)般的技術(shù),Windows提供的COM/COM+庫(kù),其實(shí)就是需要了解一大堆基礎(chǔ)知識(shí)才能操縱好。再比如:面向接口編程、虛函數(shù)表、設(shè)計(jì)模式中的工廠模式、Windows DLL地獄的由來(lái)、Windows注冊(cè)表、序列化、Windows安全、RPC、IDL語(yǔ)言、支持腳本語(yǔ)言的自動(dòng)化技術(shù)(IDispatch)、對(duì)象引用計(jì)數(shù)器,線程安全和套間和ATL模板技術(shù)等。
而在C++的演化過(guò)程中,因?yàn)槿狈ι虡I(yè)公司的大力贊助,缺乏良好設(shè)計(jì)的跨平C++類庫(kù),多數(shù)人只能使用標(biāo)準(zhǔn)C++庫(kù),但跨平臺(tái)效果也不佳。直到近幾年Boost為代表的現(xiàn)代C++庫(kù)起到了很大的作用。同時(shí),Java程序員早就享受著非常好的支持,SUN的豐富的JDK,大量活躍的開(kāi)源社區(qū)(比如Apache) 對(duì)Java的推動(dòng)也是非常明顯的。
C++程序員成長(zhǎng)周期長(zhǎng),特別是中國(guó)很多靠做項(xiàng)目掙錢(qián)的成長(zhǎng)型企業(yè)面對(duì)選用C++作為編程語(yǔ)言會(huì)有所顧慮。
優(yōu)勢(shì)同樣很明顯:
假定程序員能很好的運(yùn)用C++,那么程序可以獲得很高的性能,消耗較少的資源。在云計(jì)算時(shí)代,C++在很多關(guān)鍵業(yè)務(wù)上起到不可替代的作用,也為這個(gè)地球節(jié)能。舉個(gè)例子,我有一次要在美國(guó)服務(wù)器上部署一個(gè)JSF編寫(xiě)的網(wǎng)站,安裝GlassFish失敗是因?yàn)樘摂M機(jī)核心線程和進(jìn)程的總數(shù)被限制,只能換成C++編寫(xiě)的網(wǎng)站。這臺(tái)服務(wù)器還同時(shí)運(yùn)行著C++編寫(xiě)的TCP服務(wù)程序和NoSQL數(shù)據(jù)庫(kù)。