NoSQL或者Not Only SQL(不僅僅是SQL)是一種數(shù)據(jù)存儲(chǔ)和檢索方法,對(duì)于開發(fā)交互式Web應(yīng)用的初創(chuàng)公司和處理大量數(shù)據(jù)的企業(yè)而言,這是非常“時(shí)髦”的方法。這種方法受歡迎的主要原因是:與傳統(tǒng)關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)相比(包括甲骨文的MySQL和微軟的SQL Server),它提供更好的可擴(kuò)展性和可用性,以及更快的訪問數(shù)據(jù)。
RDBMS中的數(shù)據(jù)需要是可預(yù)測(cè)的,因此數(shù)據(jù)可以存儲(chǔ)在有結(jié)構(gòu)的表和行中,通過不同元素之間定義關(guān)系。另一方面,NoSQL數(shù)據(jù)庫中的數(shù)據(jù)則不需要如此結(jié)構(gòu)化或者按照固定的模式。當(dāng)性能和實(shí)時(shí)訪問比一致性更重要時(shí),例如當(dāng)索引和檢索大量記錄時(shí),NoSQL比關(guān)系型數(shù)據(jù)庫更適合。在NoSQL中,數(shù)據(jù)也可以更容易地跨多個(gè)服務(wù)器存儲(chǔ),因而提供更好的容錯(cuò)性和可擴(kuò)展性。谷歌和亞馬遜等公司是使用自己的云友好型NoSQL數(shù)據(jù)庫技術(shù),現(xiàn)在有很多商業(yè)和開源NoSQL數(shù)據(jù)庫可供企業(yè)選擇,例如Couchbase、MongoDB、Cassandra和Riak。
盡管數(shù)據(jù)存儲(chǔ)在NoSQL數(shù)據(jù)庫中有諸多優(yōu)點(diǎn),但快速方便地訪問數(shù)據(jù)的需要嚴(yán)重影響了NoSQL安全。為了安全地存儲(chǔ)信息,數(shù)據(jù)庫需要提供保密性、完整性和可用性(CIA)。企業(yè)RDBMS數(shù)據(jù)庫通過集成的安全功能提供CIA功能,例如基于角色的安全、加密通信、支持行和列訪問控制,以及通過預(yù)先設(shè)定的程序,用戶級(jí)權(quán)限的訪問控制。RDBMS數(shù)據(jù)庫還具有ACID(原子性、一致、隔離、耐用)功能來保證數(shù)據(jù)庫交易的可靠處理;數(shù)據(jù)復(fù)制和日志記錄確保耐用和數(shù)據(jù)完整。由于這些功能增加了檢索大量數(shù)據(jù)所花費(fèi)的時(shí)間,所以它們沒有部署在NoSQL數(shù)據(jù)庫中。
為了保證對(duì)數(shù)據(jù)的快速訪問,NoSQL數(shù)據(jù)庫基本沒有內(nèi)置安全性。它們有BASE(基本可用、軟態(tài)、最終一致)的屬性;不需要每次傳輸后的一致性,該數(shù)據(jù)庫只需要最終達(dá)到一致狀態(tài)。例如,當(dāng)用戶查看數(shù)據(jù)時(shí),比如存儲(chǔ)條目的數(shù)量,用戶會(huì)看到數(shù)據(jù)的最后一次快照,而不是當(dāng)前視圖。因?yàn)閿?shù)據(jù)交易沒有立即寫入到數(shù)據(jù)庫中,同時(shí)進(jìn)行的交易可能會(huì)互相干擾。這種固有的爭(zhēng)用情況(用戶不一定在同一時(shí)間看到相同數(shù)據(jù))意味著NoSQL數(shù)據(jù)庫永遠(yuǎn)不會(huì)用于處理金融交易。
NoSQL數(shù)據(jù)庫還缺乏保密性和安全性。由于NoSQL數(shù)據(jù)庫沒有固定的模式,對(duì)表、列或行的權(quán)限不能被隔離。這也可能導(dǎo)致相同數(shù)據(jù)出現(xiàn)多個(gè)副本。這會(huì)讓該數(shù)據(jù)庫很難保持?jǐn)?shù)據(jù)的一致性,特別是對(duì)多個(gè)表格的更改不能包裝到一個(gè)交易中,因?yàn)槠洳迦?、升?jí)或刪除操作的邏輯單元是作為整體來執(zhí)行。
現(xiàn)在有超過20種不同的NoSQL部署,缺乏標(biāo)準(zhǔn)也讓保持?jǐn)?shù)據(jù)安全的更復(fù)雜。保密性和完整性必須完全由訪問NoSQL數(shù)據(jù)的應(yīng)用來提供。對(duì)于任何在應(yīng)用級(jí)有價(jià)值的數(shù)據(jù),只設(shè)置最后一道防線并不是正確的做法。應(yīng)用開發(fā)人員并不擅長部署安全功能,新代碼通常意味著新漏洞。發(fā)送到NoSQL數(shù)據(jù)庫的任何請(qǐng)求都需要進(jìn)行轉(zhuǎn)義、過濾和驗(yàn)證,而數(shù)據(jù)庫本身需要位于強(qiáng)壯的環(huán)境中。
有趣的是,一些NoSQL項(xiàng)目現(xiàn)在開始添加RDBMS類型的安全功能。例如,甲骨文對(duì)寫入到一個(gè)節(jié)點(diǎn)的數(shù)據(jù)增加了事務(wù)性控制。Cassandra支持交易記錄和自動(dòng)復(fù)制,而MongoDB支持主從復(fù)制。
如果可擴(kuò)展性和可用性是企業(yè)對(duì)數(shù)據(jù)庫的主要要求,那么,NoSQL可能是某些大型數(shù)據(jù)集的最佳選擇。然而,系統(tǒng)架構(gòu)師在選擇NoSQL數(shù)據(jù)庫之前,應(yīng)該仔細(xì)考慮他們對(duì)安全、隱私和數(shù)據(jù)完整性的需求。缺乏NoSQL安全功能,即身份驗(yàn)證或認(rèn)證支持,意味著敏感數(shù)據(jù)最好保存在傳統(tǒng)RDBMS中。
更多信息請(qǐng)查看IT技術(shù)專欄