十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
關(guān)系數(shù)據(jù)庫(kù)經(jīng)過(guò)幾十年的發(fā)展,已經(jīng)非常成熟,但同時(shí)也存在不足:
成都創(chuàng)新互聯(lián)公司專(zhuān)注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋邊坡防護(hù)網(wǎng)等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身制作品質(zhì)網(wǎng)站。
表結(jié)構(gòu)是強(qiáng)約束的,業(yè)務(wù)變更時(shí)擴(kuò)充很麻煩。
如果對(duì)大數(shù)據(jù)量的表進(jìn)行統(tǒng)計(jì)運(yùn)算,I/O會(huì)很高,因?yàn)榧词怪会槍?duì)某列進(jìn)行運(yùn)算,也需要將整行數(shù)據(jù)讀入內(nèi)存。
全文搜索只能使用 Like 進(jìn)行整表掃描,性能非常低。
針對(duì)這些不足,產(chǎn)生了不同的 NoSQL 解決方案,在某些場(chǎng)景下比關(guān)系數(shù)據(jù)庫(kù)更有優(yōu)勢(shì),但同時(shí)也犧牲了某些特性,所以不能片面的迷信某種方案,應(yīng)將其作為 SQL 的有利補(bǔ)充。
NoSQL != No SQL,而是:
NoSQL = Not Only SQL
典型的 NoSQL 方案分為4類(lèi):
Redis 是典型,其 value 是具體的數(shù)據(jù)結(jié)構(gòu),包括 string, hash, list, set, sorted set, bitmap, hyperloglog,常被稱(chēng)為數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
以 list 為例:
LPOP key 是移除并返回隊(duì)列左邊的第一個(gè)元素。
如果用關(guān)系數(shù)據(jù)庫(kù)就比較麻煩了,需要操作:
Redis 的缺點(diǎn)主要體現(xiàn)在不支持完成的ACID事務(wù),只能保證隔離性和一致性,無(wú)法保證原子性和持久性。
最大的特點(diǎn)是 no-schema,無(wú)需在使用前定義字段,讀取一個(gè)不存在的字段也不會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
特點(diǎn):
以電商為例,不同商品的屬性差異很大,如冰箱和電腦,這種差異性在關(guān)系數(shù)據(jù)庫(kù)中會(huì)有很大的麻煩,而使用文檔數(shù)據(jù)庫(kù)則非常方便。
文檔數(shù)據(jù)庫(kù)的主要缺點(diǎn):
關(guān)系數(shù)據(jù)庫(kù)是按行來(lái)存儲(chǔ)的,列式數(shù)據(jù)庫(kù)是按照列來(lái)存儲(chǔ)數(shù)據(jù)。
按行存儲(chǔ)的優(yōu)勢(shì):
在某些場(chǎng)景下,這些優(yōu)勢(shì)就成為劣勢(shì)了,例如,計(jì)算超重人員的數(shù)據(jù),只需要讀取體重這一列進(jìn)行統(tǒng)計(jì)即可,但行式存儲(chǔ)會(huì)將整行數(shù)據(jù)讀取到內(nèi)存中,很浪費(fèi)。
而列式存儲(chǔ)中,只需要讀取體重這列的數(shù)據(jù)即可,I/O 將大大減少。
除了節(jié)省I/O,列式存儲(chǔ)還有更高的壓縮比,可以節(jié)省存儲(chǔ)空間。普通行式數(shù)據(jù)庫(kù)的壓縮比在 3:1 到 5:1 左右,列式數(shù)據(jù)庫(kù)在 8:1 到 30:1,因?yàn)閱蝹€(gè)列的數(shù)據(jù)相似度更高。
列式存儲(chǔ)的隨機(jī)寫(xiě)效率遠(yuǎn)低于行式存儲(chǔ),因?yàn)樾惺酱鎯?chǔ)時(shí)同一行多個(gè)列都存儲(chǔ)在連續(xù)空間中,而列式存儲(chǔ)將不同列存儲(chǔ)在不連續(xù)的空間。
一般將列式存儲(chǔ)應(yīng)用在離線大數(shù)據(jù)分析統(tǒng)計(jì)場(chǎng)景,因?yàn)檫@時(shí)主要針對(duì)部分列進(jìn)行操作,而且數(shù)據(jù)寫(xiě)入后無(wú)須更新。
關(guān)系數(shù)據(jù)庫(kù)通過(guò)索引進(jìn)行快速查詢(xún),但在全文搜索的情景下,索引就不夠了,因?yàn)椋?/p>
假設(shè)有一個(gè)交友網(wǎng)站,信息表如下:
需要匹配性別、地點(diǎn)、語(yǔ)言列。
需要匹配性別、地點(diǎn)、愛(ài)好列。
實(shí)際搜索中,各種排列組合非常多,關(guān)系數(shù)據(jù)庫(kù)很難支持。
全文搜索引擎是使用 倒排索引 技術(shù),建立單詞到文檔的索引,例如上面的表信息建立倒排索引:
所以特別適合根據(jù)關(guān)鍵詞來(lái)查詢(xún)文檔內(nèi)容。
上面介紹了幾種典型的NoSQL方案,及各自的適用場(chǎng)景和特點(diǎn),您可以根據(jù)實(shí)際需求進(jìn)行選擇。
NewSQL是對(duì)一類(lèi)現(xiàn)代關(guān)系型數(shù)據(jù)庫(kù)的統(tǒng)稱(chēng),這類(lèi)數(shù)據(jù)庫(kù)對(duì)于一般的OLTP讀寫(xiě)請(qǐng)求提供可橫向擴(kuò)展的性能,同時(shí)支持事務(wù)的ACID保證。這些系統(tǒng)既擁有NoSQL數(shù)據(jù)庫(kù)的擴(kuò)展性,又保持傳統(tǒng)數(shù)據(jù)庫(kù)的事務(wù)特性。NewSQL重新將“應(yīng)用程序邏輯與數(shù)據(jù)操作邏輯應(yīng)該分離”的理念帶回到現(xiàn)代數(shù)據(jù)庫(kù)的世界,這也驗(yàn)證了歷史的發(fā)展總是呈現(xiàn)出螺旋上升的形式。
在21世紀(jì)00年代中,出現(xiàn)了許多數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng) (如 Vertica,Greeplum 和AsterData),這些以處理OLAP 請(qǐng)求為設(shè)計(jì)目標(biāo)的系統(tǒng)并不在本文定義的NewSQL范圍內(nèi)。OLAP 數(shù)據(jù)庫(kù)更關(guān)注針對(duì)海量數(shù)據(jù)的大型、復(fù)雜、只讀的查詢(xún),查詢(xún)時(shí)間可能持續(xù)秒級(jí)、分鐘級(jí)甚至更長(zhǎng)。
NoSQL的擁躉普遍認(rèn)為阻礙傳統(tǒng)數(shù)據(jù)庫(kù)橫向擴(kuò)容、提高可用性的原因在于ACID保證和關(guān)系模型,因此NoSQL運(yùn)動(dòng)的核心就是放棄事務(wù)強(qiáng)一致性以及關(guān)系模型,擁抱最終一致性和其它數(shù)據(jù)模型?(如 key/value,graphs 和Documents)。
兩個(gè)最著名的NoSQL數(shù)據(jù)庫(kù)就是Google的BigTable和Amazon的Dynamo,由于二者都未開(kāi)源,其它組織就開(kāi)始推出類(lèi)似的開(kāi)源替代項(xiàng)目,包括Facebook的 Cassandra (基于BigTable和Dynamo)、PowerSet的 Hbase(基于BigTable)。有一些創(chuàng)業(yè)公司也加入到這場(chǎng)NoSQL運(yùn)動(dòng)中,它們不一定是受BigTable和Dynamo的啟發(fā),但都響應(yīng)了NoSQL的哲學(xué),其中最出名的就是MongoDB。
在21世紀(jì)00年代末,市面上已經(jīng)有許多供用戶(hù)選擇的分布式數(shù)據(jù)庫(kù)產(chǎn)品。使用NoSQL的優(yōu)勢(shì)在于應(yīng)用開(kāi)發(fā)者可以更關(guān)注應(yīng)用邏輯本身,而非數(shù)據(jù)庫(kù)的擴(kuò)展性問(wèn)題;但與此同時(shí)許多應(yīng)用,如金融系統(tǒng)、訂單處理系統(tǒng),由于無(wú)法放棄事務(wù)的一致性要求被拒之門(mén)外。
一些組織,如Google,已經(jīng)發(fā)現(xiàn)他們的許多工程師將過(guò)多的精力放在處理數(shù)據(jù)一致性上,這既暴露了數(shù)據(jù)庫(kù)的抽象、又提高了代碼的復(fù)雜度,這時(shí)候要么選擇回到傳統(tǒng)DBMS時(shí)代,用更高的機(jī)器配置縱向擴(kuò)容,要么選擇回到中間件時(shí)代,開(kāi)發(fā)支持分布式事務(wù)的中間件。這兩種方案成本都很高,于是NewSQL運(yùn)動(dòng)開(kāi)始醞釀。
NewSQL數(shù)據(jù)庫(kù)設(shè)計(jì)針對(duì)的讀寫(xiě)事務(wù)有以下特點(diǎn):
1、耗時(shí)短。
2、使用索引查詢(xún),涉及少量數(shù)據(jù)。
3、重復(fù)度高,通常使用相同的查詢(xún)語(yǔ)句和不同的查詢(xún)參考。
也有一些學(xué)者認(rèn)為NewSQL系統(tǒng)是特指實(shí)現(xiàn)上使用Lock-free并發(fā)控制技術(shù)和share-nothing架構(gòu)的數(shù)據(jù)庫(kù)。所有我們認(rèn)為是NewSQL的數(shù)據(jù)庫(kù)系統(tǒng)確實(shí)都有這樣的特點(diǎn)。
Web1.0的時(shí)代,數(shù)據(jù)訪問(wèn)量很有限,用一夫當(dāng)關(guān)的高性能的單點(diǎn)服務(wù)器可以解決大部分問(wèn)題。
隨著Web2.0的時(shí)代的到來(lái),用戶(hù)訪問(wèn)量大幅度提升,同時(shí)產(chǎn)生了大量的用戶(hù)數(shù)據(jù)。加上后來(lái)的智能移動(dòng)設(shè)備的普及,所有的互聯(lián)網(wǎng)平臺(tái)都面臨了巨大的性能挑戰(zhàn)。
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關(guān)系型的數(shù)據(jù)庫(kù)。
NoSQL 不依賴(lài)業(yè)務(wù)邏輯方式存儲(chǔ),而以簡(jiǎn)單的key-value模式存儲(chǔ)。因此大大的增加了數(shù)據(jù)庫(kù)的擴(kuò)展能力。
Memcache Memcache Redis Redis MongoDB MongoDB 列式數(shù)據(jù)庫(kù) 列式數(shù)據(jù)庫(kù) Hbase Hbase
HBase是Hadoop項(xiàng)目中的數(shù)據(jù)庫(kù)。它用于需要對(duì)大量的數(shù)據(jù)進(jìn)行隨機(jī)、實(shí)時(shí)的讀寫(xiě)操作的場(chǎng)景中。
HBase的目標(biāo)就是處理數(shù)據(jù)量非常龐大的表,可以用普通的計(jì)算機(jī)處理超過(guò)10億行數(shù)據(jù),還可處理有數(shù)百萬(wàn)列元素的數(shù)據(jù)表。
Cassandra Cassandra
Apache Cassandra是一款免費(fèi)的開(kāi)源NoSQL數(shù)據(jù)庫(kù),其設(shè)計(jì)目的在于管理由大量商用服務(wù)器構(gòu)建起來(lái)的龐大集群上的海量數(shù)據(jù)集(數(shù)據(jù)量通常達(dá)到PB級(jí)別)。在眾多顯著特性當(dāng)中,Cassandra最為卓越的長(zhǎng)處是對(duì)寫(xiě)入及讀取操作進(jìn)行規(guī)模調(diào)整,而且其不強(qiáng)調(diào)主集群的設(shè)計(jì)思路能夠以相對(duì)直觀的方式簡(jiǎn)化各集群的創(chuàng)建與擴(kuò)展流程。
主要應(yīng)用:社會(huì)關(guān)系,公共交通網(wǎng)絡(luò),地圖及網(wǎng)絡(luò)拓譜(n*(n-1)/2)
NoSQL太火,冒出太多產(chǎn)品了,保守估計(jì)也成百上千了。
互聯(lián)網(wǎng)公司常用的基本集中在以下幾種,每種只舉一個(gè)比較常見(jiàn)或者應(yīng)用比較成功的例子吧。
1. In-Memory KV Store : Redis
in memory key-value store,同時(shí)提供了更加豐富的數(shù)據(jù)結(jié)構(gòu)和運(yùn)算的能力,成功用法是替代memcached,通過(guò)checkpoint和commit log提供了快速的宕機(jī)恢復(fù),同時(shí)支持replication提供讀可擴(kuò)展和高可用。
2. Disk-Based KV Store: Leveldb
真正基于磁盤(pán)的key-value storage, 模型單一簡(jiǎn)單,數(shù)據(jù)量不受限于內(nèi)存大小,數(shù)據(jù)落盤(pán)高可靠,Google的幾位大神出品的精品,LSM模型天然寫(xiě)優(yōu)化,順序?qū)懕P(pán)的方式對(duì)于新硬件ssd再適合不過(guò)了,不足是僅提供了一個(gè)庫(kù),需要自己封裝server端。
3. Document Store: Mongodb
分布式nosql,具備了區(qū)別mysql的最大亮點(diǎn):可擴(kuò)展性。mongodb 最新引人的莫過(guò)于提供了sql接口,是目前nosql里最像mysql的,只是沒(méi)有ACID的特性,發(fā)展很快,支持了索引等特性,上手容易,對(duì)于數(shù)據(jù)量遠(yuǎn)超內(nèi)存限制的場(chǎng)景來(lái)說(shuō),還需要慎重。
4. Column Table Store: HBase
這個(gè)富二代似乎不用贅述了,最大的優(yōu)勢(shì)是開(kāi)源,對(duì)于普通的scan和基于行的get等基本查詢(xún),性能完全不是問(wèn)題,只是只提供裸的api,易用性上是短板,可擴(kuò)展性方面是最強(qiáng)的,其次坐上了Hadoop的快車(chē),社區(qū)發(fā)展很快,各種基于其上的開(kāi)源產(chǎn)品不少,來(lái)解決諸如join、聚集運(yùn)算等復(fù)雜查詢(xún)。
NoSQL描述的是大量結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方法的集合,根據(jù)結(jié)構(gòu)化方法以及應(yīng)用場(chǎng)合的不同,主要可以將NoSQL分為以下幾類(lèi)。
(1)Column-Oriented
面向檢索的列式存儲(chǔ),其存儲(chǔ)結(jié)構(gòu)為列式結(jié)構(gòu),同于關(guān)系型數(shù)據(jù)庫(kù)的行式結(jié)構(gòu),這種結(jié)構(gòu)會(huì)讓很多統(tǒng)計(jì)聚合操作更簡(jiǎn)單方便,使系統(tǒng)具有較高的可擴(kuò)展性。這類(lèi)數(shù)據(jù)庫(kù)還可以適應(yīng)海量數(shù)據(jù)的增加以及數(shù)據(jù)結(jié)構(gòu)的變化,這個(gè)特點(diǎn)與云計(jì)算所需的相關(guān)需求是相符合的,比如GoogleAppengine的BigTable以及相同設(shè)計(jì)理念的Hadoop子系統(tǒng)HaBase就是這類(lèi)的典型代表。需要特別指出的是,Big Table特別適用于MapReduce處理,這對(duì)于云計(jì)算的發(fā)展有很高的適應(yīng)性。
(2)Key-Value。
面向高性能并發(fā)讀/寫(xiě)的緩存存儲(chǔ),其結(jié)構(gòu)類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的Hash表,每個(gè)Key分別對(duì)應(yīng)一個(gè)Value,能夠提供非??斓牟樵?xún)速度、大數(shù)據(jù)存放量和高并發(fā)操作,非常適合通過(guò)主鍵對(duì)數(shù)據(jù)進(jìn)行查詢(xún)和修改等操作。Key-Value數(shù)據(jù)庫(kù)的主要特點(diǎn)是具有極高的并發(fā)讀/寫(xiě)性能,非常適合作為緩存系統(tǒng)使用。MemcacheDB、BerkeleyDB、Redis、Flare就是Key-Value數(shù)據(jù)庫(kù)的代表。
(3)Document-Oriented。
面向海量數(shù)據(jù)訪問(wèn)的文檔存儲(chǔ),這類(lèi)存儲(chǔ)的結(jié)構(gòu)與Key-Value非常相似,也是每個(gè)Key分別對(duì)應(yīng)一個(gè)Value,但是這個(gè)Value主要以JSON(JavaScriptObjectNotations)或者XML等格式的文檔來(lái)進(jìn)行存儲(chǔ)。這種存儲(chǔ)方式可以很方便地被面向?qū)ο蟮恼Z(yǔ)言所使用。這類(lèi)數(shù)據(jù)庫(kù)可在海量的數(shù)據(jù)中快速查詢(xún)數(shù)據(jù),典型代表為MongoDB、CouchDB等。
NoSQL具有擴(kuò)展簡(jiǎn)單、高并發(fā)、高穩(wěn)定性、成本低廉等優(yōu)勢(shì),也存在一些問(wèn)題。例如,NoSQL暫不提供SQL的支持,會(huì)造成開(kāi)發(fā)人員的額外學(xué)習(xí)成本;NoSQL大多為開(kāi)源軟件其成熟度與商用的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)相比有差距;NoSQL的架構(gòu)特性決定了其很難保證數(shù)據(jù)的完整性,適合在一些特殊的應(yīng)用場(chǎng)景使用。
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ā)的SNS類(lèi)型的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)帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。
雖然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版本。這里列出一些比較知名的工具,可以為大數(shù)據(jù)建立快速、可擴(kuò)展的存儲(chǔ)庫(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ú)疑是一種全新的思維的注入。
對(duì)于NoSQL并沒(méi)有一個(gè)明確的范圍和定義,但是他們都普遍存在下面一些共同特征:
不需要預(yù)定義模式:不需要事先定義數(shù)據(jù)模式,預(yù)定義表結(jié)構(gòu)。數(shù)據(jù)中的每條記錄都可能有不同的屬性和格式。當(dāng)插入數(shù)據(jù)時(shí),并不需要預(yù)先定義它們的模式。
無(wú)共享架構(gòu):相對(duì)于將所有數(shù)據(jù)存儲(chǔ)的存儲(chǔ)區(qū)域網(wǎng)絡(luò)中的全共享架構(gòu)。NoSQL往往將數(shù)據(jù)劃分后存儲(chǔ)在各個(gè)本地服務(wù)器上。因?yàn)閺谋镜卮疟P(pán)讀取數(shù)據(jù)的性能往往好于通過(guò)網(wǎng)絡(luò)傳輸讀取數(shù)據(jù)的性能,從而提高了系統(tǒng)的性能。
彈性可擴(kuò)展:可以在系統(tǒng)運(yùn)行的時(shí)候,動(dòng)態(tài)增加或者刪除結(jié)點(diǎn)。不需要停機(jī)維護(hù),數(shù)據(jù)可以自動(dòng)遷移。
分區(qū):相對(duì)于將數(shù)據(jù)存放于同一個(gè)節(jié)點(diǎn),NoSQL數(shù)據(jù)庫(kù)需要將數(shù)據(jù)進(jìn)行分區(qū),將記錄分散在多個(gè)節(jié)點(diǎn)上面。并且通常分區(qū)的同時(shí)還要做復(fù)制。這樣既提高了并行性能,又能保證沒(méi)有單點(diǎn)失效的問(wèn)題。
異步復(fù)制:和RAID存儲(chǔ)系統(tǒng)不同的是,NoSQL中的復(fù)制,往往是基于日志的異步復(fù)制。這樣,數(shù)據(jù)就可以盡快地寫(xiě)入一個(gè)節(jié)點(diǎn),而不會(huì)被網(wǎng)絡(luò)傳輸引起遲延。缺點(diǎn)是并不總是能保證一致性,這樣的方式在出現(xiàn)故障的時(shí)候,可能會(huì)丟失少量的數(shù)據(jù)。
BASE:相對(duì)于事務(wù)嚴(yán)格的ACID特性,NoSQL數(shù)據(jù)庫(kù)保證的是BASE特性。BASE是最終一致性和軟事務(wù)。
NoSQL數(shù)據(jù)庫(kù)并沒(méi)有一個(gè)統(tǒng)一的架構(gòu),兩種NoSQL數(shù)據(jù)庫(kù)之間的不同,甚至遠(yuǎn)遠(yuǎn)超過(guò)兩種關(guān)系型數(shù)據(jù)庫(kù)的不同??梢哉f(shuō),NoSQL各有所長(zhǎng),成功的NoSQL必然特別適用于某些場(chǎng)合或者某些應(yīng)用,在這些場(chǎng)合中會(huì)遠(yuǎn)遠(yuǎn)勝過(guò)關(guān)系型數(shù)據(jù)庫(kù)和其他的NoSQL。