什么是NoSQL數據庫?從名稱“非SQL”或“非關系型”衍生而來,這些數據庫不使用類似SQL的查詢語言,通常稱為結構化存儲。這些數據庫自1960年就已經存在,但是直到現在一些大公司(例如Google和Facebook)開始使用它們時,這些數據庫才流行起來。該數據庫最明顯的優勢是擺脫了一組固定的列、連接和類似SQL的查詢語言的限制。有時,NoSQL這個名稱也可能表示“不僅僅SQL”,來確保它們可能支持SQL。 NoSQL數據庫使用諸如鍵值、寬列、圖形或文檔之類的數據結構,并且可以如JSON之類的不同格式存儲。
我們提供的服務有:成都網站制作、網站設計、外貿網站建設、微信公眾號開發、網站優化、網站認證、徐聞ssl等。為近千家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的徐聞網站制作公司
一、數據
1、數據(data)是事實或觀察的結果,是對客觀事物的邏輯歸納,是用于表示客觀事物的未經加工的原始素材。
2、數據可以是連續的值,比如聲音、圖像,稱為模擬數據;也可以是離散的,如符號、文字,稱為數字數據。
3、在計算機系統中,數據以二進制信息單元0、1的形式表示。
二、數據庫
數據庫是存放數據的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數據。但是數據庫并不是隨意地將數據進行存放,是有一定的規則的,否則查詢的效率會很低。當今世界是一個充滿著數據的互聯網世界,充斥著大量的數據。即這個互聯網世界就是數據世界。數據的來源有很多,比如出行記錄、消費記錄、瀏覽的網頁、發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。
三、數據庫管理系統
1、數據庫管理系統(Database Management System)是一種操縱和管理數據庫的大型軟件,用于建立、使用和維護數據庫,簡稱DBMS。它對數據庫進行統一的管理和控制,以保證數據庫的安全性和完整性。用戶通過DBMS訪問數據庫中的數據,數據庫管理員也通過DBMS進行數據庫的維護工作。
2、它可以支持多個應用程序和用戶用不同的方法在同時或不同時刻去建立,修改和詢問數據庫。大部分DBMS提供數據定義語言DDL(Data Definition Language)和數據操作語言DML(Data Manipulation Language),供用戶定義數據庫的模式結構與權限約束,實現對數據的追加、刪除等操作。
四、數據庫系統
數據庫系統DBS(Data Base System,簡稱DBS)通常由軟件、數據庫和數據管理員組成。其軟件主要包括操作系統、各種宿主語言、實用程序以及數據庫管理系統。數據庫由數據庫管理系統統一管理,數據的插入、修改和檢索均要通過數據庫管理系統進行。數據管理員負責創建、監控和維護整個數據庫,使數據能被任何有權使用的人有效使用。數據庫管理員一般是由業務水平較高、資歷較深的人員擔任。
五、數據、數據庫、數據庫管理系統、數據庫系統四者之間的關系
1、首先數據庫系統(baiDBS)包括數據庫(DB)和數據庫管理系統(DBMS),數據庫管理系統包括數據庫,數據庫包括數據。
2、數據庫是用來存放數據的倉庫。
3、數據庫管理系統是操縱和管理數據庫的系統。
擴展資料:
數據庫的發展現狀
1、在數據庫的發展歷史上,數據庫先后經歷了層次數據庫、網狀數據庫和關系數據庫等各個階段的發展,數據庫技術在各個方面的快速的發展。
2、特別是關系型數據庫已經成為目前數據庫產品中最重要的一員,80年代以來, 幾乎所有的數據庫廠商新出的數據庫產品都支持關系型數據庫,即使一些非關系數據庫產品也幾乎都有支持關系數據庫的接口。這主要是傳統的關系型數據庫可以比較好的解決管理和存儲關系型數據的問題。
3、隨著云計算的發展和大數據時代的到來,關系型數據庫越來越無法滿足需要,這主要是由于越來越多的半關系型和非關系型數據需要用數據庫進行存儲管理。
4、以此同時,分布式技術等新技術的出現也對數據庫的技術提出了新的要求,于是越來越多的非關系型數據庫就開始出現,這類數據庫與傳統的關系型數據庫在設計和數據結構有了很大的不同, 它們更強調數據庫數據的高并發讀寫和存儲大數據,這類數據庫一般被稱為NoSQL(Not only SQL)數據庫。 而傳統的關系型數據庫在一些傳統領域依然保持了強大的生命力。
常見的理解及分析
目前流行的、對CAP理論解釋的情形是從同一數據在網絡環境中的多個副本出發的。為了保證數據不會丟失,在企業級的數據管理方案中,一般必須考慮數據的冗余存儲問題,而這應該是通過在網絡上的其他獨立物理存儲節點上保留另一份、或多份數據副本來實現的(如附圖所示)。因為在同一個存儲節點上的數據冗余明顯不能解決單點故障問題,這與通過多節點集群來提供更好的計算可用性的道理是相同的。
附圖 CAP理論示意圖
其實,不用做嚴格的證明也可以想見,如附圖的情況,數據在節點A、B、C上保留了三份,如果對節點A上的數據進行了修改,然后再讓客戶端通過網絡對該數據進行讀取。那么,客戶端的讀取操作什么時候返回呢?
有這樣兩種情況:一種情況是要求節點A、B、C的三份數據完全一致后返回。也就是說,這時從任何一個網絡節點讀取的數據都是一樣的,這就是所謂的強一致性讀。很明顯,這時數據讀取的Latency要高一些(因為要等數據在網絡中的復制),同時A、B、C三個節點中任何一個宕機,都會導致數據不可用。也就是說,要保證強一致性,網絡中的副本越多,數據的可用性就越差;
另一種情況是,允許讀操作立即返回,容忍B節點的讀取與A節點的讀取不一致的情況發生。這樣一來,可用性顯然得到了提高,網絡中的副本也可以多一些,唯一得不到保證的是數據一致性。當然,對寫操作同樣也有多個節點一致性的情況,在此不再贅述。
可以看出,上述對CAP理論的解釋主要是從網絡上多個節點之間的讀寫一致性出發考慮問題的。而這一點,對于關系型數據庫意味著什么呢?當然主要是指通常所說的Standby(關于分布式事務,涉及到更多考慮,隨后討論)情況。對此,在實踐中我們大多已經采取了弱一致性的異步延時同步方案,以提高可用性。這種情況并不存在關系型數據庫為保證C、A而放棄P的情況;而對海量數據管理的需求,關系型數據庫擴展過程中所遇到的性能瓶頸,似乎也并不是CAP理論中所描述的那種原因造成的。那么,上述流行的說法中所描述的關系型數據庫為保證C、A而犧牲P到底是在指什么呢?
因此,如果根據現有的大多數資料對CAP理論的如上解釋,即只將其當作分布式系統中多個數據副本之間的讀寫一致性問題的通用理論對待,那么就可以得出結論:CAP既適用于NoSQL數據庫,也適用于關系型數據庫。它是NoSQL數據庫、關系型數據庫,乃至一切分布式系統在設計數據多個副本之間讀寫一致性問題時需要遵循的共同原則。
更深入的探究:兩種重要的分布式場景
在本文中我們要說的重點與核心是:關于對CAP理論中一致性C的理解,除了上述數據副本之間的讀寫一致性以外,分布式環境中還有兩種非常重要的場景,如果不對它們進行認識與討論,就永遠無法全面地理解CAP,當然也就無法根據CAP做出正確的解釋。但可惜的是,目前為止卻很少有人提及這兩種場景:那就是事務與關聯。
先來看看分布式環境中的事務場景。我們知道,在關系型數據庫的事務操作遵循ACID原則,其中的一致性C,主要是指一個事務中相關聯的數據在事務操作結束后是一致的。所謂ACID原則,是指在寫入/異動資料的過程中,為保證交易正確可靠所必須具備的四個特性:即原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)和持久性(Durability)。
例如銀行的一個存款交易事務,將導致交易流水表增加一條記錄。同時,必須導致賬戶表余額發生變化,這兩個操作必須是一個事務中全部完成,保證相關數據的一致性。而前文解釋的CAP理論中的C是指對一個數據多個備份的讀寫一致性。表面上看,這兩者不是一回事,但實際上,卻是本質基本相同的事物:數據請求會等待多個相關數據操作全部完成才返回。對分布式系統來講,這就是我們通常所說的分布式事務問題。
眾所周知,分布式事務一般采用兩階段提交策略來實現,這是一個非常耗時的復雜過程,會嚴重影響系統效率,在實踐中我們盡量避免使用它。在實踐過程中,如果我們為了擴展數據容量將數據分布式存儲,而事務的要求又完全不能降低。那么,系統的可用性一定會大大降低,在現實中我們一般都采用對這些數據不分散存儲的策略。
當然,我們也可以說,最常使用的關系型數據庫,因為這個原因,擴展性(分區可容忍性P)受到了限制,這是完全符合CAP理論的。但同時我們應該意識到,這對NoSQL數據庫也是一樣的。如果NoSQL數據庫也要求嚴格的分布式事務功能,情況并不會比關系型數據庫好多少。只是在NoSQL的設計中,我們往往會弱化甚至去除事務的功能,該問題才表現得不那么明顯而已。
因此,在擴展性問題上,如果要說關系型數據庫是為了保證C、A而犧牲P,在盡量避免分布式事務這一點上來看,應該是正確的。也就是說:關系型數據庫應該具有強大的事務功能,如果分區擴展,可用性就會降低;而NoSQL數據庫干脆弱化甚至去除了事務功能,因此,分區的可擴展性就大大增加了。
再來看看分布式環境中的關聯場景。初看起來,關系型數據庫中常用的多表關聯操作與CAP理論就更加不沾邊了。但仔細考慮,也可以用它來解釋數據庫分區擴展對關聯所帶來的影響。對一個數據庫來講,采用了分區擴展策略來擴充容量,數據分散存儲了,很顯然多表關聯的性能就會下降,因為我們必須在網絡上進行大量的數據遷移操作,這與CAP理論中數據副本之間的同步操作本質上也是相同的。
因此,如果要保證系統的高可用性,需要同時實現強大的多表關系操作的關系型數據庫在分區可擴展性上就遇到了極大的限制(即使是那些采用了各種優秀解決方案的MPP架構的關系型數據庫,如TeraData,Netezza等,其水平可擴展性也是遠遠不如NoSQL數據庫的),而NoSQL數據庫則干脆在設計上弱化甚至去除了多表關聯操作。那么,從這一點上來理解“NoSQL數據庫是為了保證A與P,而犧牲C”的說法,也是可以講得通的。當然,我們應該理解,關聯問題在很多情況下不是并行處理的優點所在,這在很大程度上與Amdahl定律相符合。
所以,從事務與關聯的角度來關系型數據庫的分區可擴展性為什么受限的原因是最為清楚的。而NoSQL數據庫也正是因為弱化,甚至去除了像事務與關聯(全面地講,其實還有索引等特性)等在分布式環境中會嚴重影響系統可用性的功能,才獲得了更好的水平可擴展性。
那么,如果將事務與關聯也納入CAP理論中一致性C的范疇的話,問題就很清楚了:關于“關系型數據庫為了保證一致性C與可用性A,而不得不犧牲分區可容忍性P”的說法便是正確的了。但關于“NoSQL選擇了C與P,或者A與P”的說法則是錯誤的,所有的NoSQL數據庫在設計策略的大方向上都是選擇了A與P(雖然對同一數據多個副本的讀寫一致性問題的設計各有不同),從來沒有完全選擇C與P的情況存在。
結論
現在看來,如果理解CAP理論只是指多個數據副本之間讀寫一致性的問題,那么它對關系型數據庫與NoSQL數據庫來講是完全一樣的,它只是運行在分布式環境中的數據管理設施在設計讀寫一致性問題時需要遵循的一個原則而已,卻并不是NoSQL數據庫具有優秀的水平可擴展性的真正原因。而如果將CAP理論中的一致性C理解為讀寫一致性、事務與關聯操作的綜合,則可以認為關系型數據庫選擇了C與A,而NoSQL數據庫則全都是選擇了A與P,但并沒有選擇C與P的情況存在。這才是用CAP理論來支持NoSQL數據庫設計正確認識。
其實,這種認識正好與被廣泛認同的NoSQL的另一個理論基礎相吻合,即與ACID對著干的BASE(基本可用性、軟狀態與最終一致性)。因為BASE的含義正好是指“NoSQL數據庫設計可以通過犧牲一定的數據一致性和容錯性來換取高性能的保持甚至提高”,即NoSQL數據庫都應該是犧牲C來換取P,而不是犧牲A。可用性A正好是所有NoSQL數據庫都普遍追求的特性。
基本含義NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關系型的數據存儲,相對于鋪天蓋地的關系型數據庫運用,這一概念無疑是一種全新的思維的注入。NoSQLNoSQL數據庫的四大分類鍵值(Key-Value)存儲數據庫這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對于IT系統來說的優勢在于簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。[3] 舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.列存儲數據庫。這部分數據庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.文檔型數據庫文檔型數據庫的靈感是來自于Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。圖形(Graph)數據庫圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,并且能夠擴展到多個服務器上。NoSQL數據庫沒有標準的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。[2] 如:Neo4J, InfoGrid, Infinite Graph.因此,我們總結NoSQL數據庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對數據庫性能要求較高;4、不需要高度的數據一致性;5、對于給定key,比較容易映射復雜值的環境。
Hadoop
文件系統:文件系統是用來存儲和管理文件,并且提供文件的查詢、增加、刪除等操作。
直觀上的體驗:在shell窗口輸入 ls 命令,就可以看到當前目錄下的文件夾、文件。
文件存儲在哪里?硬盤
一臺只有250G硬盤的電腦,如果需要存儲500G的文件可以怎么辦?先將電腦硬盤擴容至少250G,再將文件分割成多塊,放到多塊硬盤上儲存。
通過 hdfs dfs -ls 命令可以查看分布式文件系統中的文件,就像本地的ls命令一樣。
HDFS在客戶端上提供了查詢、新增和刪除的指令,可以實現將分布在多臺機器上的文件系統進行統一的管理。
在分布式文件系統中,一個大文件會被切分成塊,分別存儲到幾臺機器上。結合上文中提到的那個存儲500G大文件的那個例子,這500G的文件會按照一定的大小被切分成若干塊,然后分別存儲在若干臺機器上,然后提供統一的操作接口。
看到這里,不少人可能會覺得,分布式文件系統不過如此,很簡單嘛。事實真的是這樣的么?
潛在問題
假如我有一個1000臺機器組成的分布式系統,一臺機器每天出現故障的概率是0.1%,那么整個系統每天出現故障的概率是多大呢?答案是(1-0.1%)^1000=63%,因此需要提供一個容錯機制來保證發生差錯時文件依然可以讀出,這里暫時先不展開介紹。
如果要存儲PB級或者EB級的數據,成千上萬臺機器組成的集群是很常見的,所以說分布式系統比單機系統要復雜得多呀。
這是一張HDFS的架構簡圖:
client通過nameNode了解數據在哪些DataNode上,從而發起查詢。此外,不僅是查詢文件,寫入文件的時候也是先去請教NameNode,看看應該往哪個DateNode中去寫。
為了某一份數據只寫入到一個Datanode中,而這個Datanode因為某些原因出錯無法讀取的問題,需要通過冗余備份的方式來進行容錯處理。因此,HDFS在寫入一個數據塊的時候,不會僅僅寫入一個DataNode,而是會寫入到多個DataNode中,這樣,如果其中一個DataNode壞了,還可以從其余的DataNode中拿到數據,保證了數據不丟失。
實際上,每個數據塊在HDFS上都會保存多份,保存在不同的DataNode上。這種是犧牲一定存儲空間換取可靠性的做法。
接下來我們來看一下完整的文件寫入的流程:
大文件要寫入HDFS,client端根據配置將大文件分成固定大小的塊,然后再上傳到HDFS。
讀取文件的流程:
1、client詢問NameNode,我要讀取某個路徑下的文件,麻煩告訴我這個文件都在哪些DataNode上?
2、NameNode回復client,這個路徑下的文件被切成了3塊,分別在DataNode1、DataNode3和DataNode4上
3、client去找DataNode1、DataNode3和DataNode4,拿到3個文件塊,通過stream讀取并且整合起來
文件寫入的流程:
1、client先將文件分塊,然后詢問NameNode,我要寫入一個文件到某個路徑下,文件有3塊,應該怎么寫?
2、NameNode回復client,可以分別寫到DataNode1、DataNode2、DataNode3、DataNode4上,記住,每個塊重復寫3份,總共是9份
3、client找到DataNode1、DataNode2、DataNode3、DataNode4,把數據寫到他們上面
出于容錯的考慮,每個數據塊有3個備份,但是3個備份快都直接由client端直接寫入勢必會帶來client端過重的寫入壓力,這個點是否有更好的解決方案呢?回憶一下mysql主備之間是通過binlog文件進行同步的,HDFS當然也可以借鑒這個思想,數據其實只需要寫入到一個datanode上,然后由datanode之間相互進行備份同步,減少了client端的寫入壓力,那么至于是一個datanode寫入成功即成功,還是需要所有的參與備份的datanode返回寫入成功才算成功,是可靠性配置的策略,當然這個設置會影響到數據寫入的吞吐率,我們可以看到可靠性和效率永遠是“魚和熊掌不可兼得”的。
潛在問題
NameNode確實會回放editlog,但是不是每次都從頭回放,它會先加載一個fsimage,這個文件是之前某一個時刻整個NameNode的文件元數據的內存快照,然后再在這個基礎上回放editlog,完成后,會清空editlog,再把當前文件元數據的內存狀態寫入fsimage,方便下一次加載。
這樣,全量回放就變成了增量回放,但是如果NameNode長時間未重啟過,editlog依然會比較大,恢復的時間依然比較長,這個問題怎么解呢?
SecondNameNode是一個NameNode內的定時任務線程,它會定期地將editlog寫入fsimage,然后情況原來的editlog,從而保證editlog的文件大小維持在一定大小。
NameNode掛了, SecondNameNode并不能替代NameNode,所以如果集群中只有一個NameNode,它掛了,整個系統就掛了。hadoop2.x之前,整個集群只能有一個NameNode,是有可能發生單點故障的,所以hadoop1.x有本身的不穩定性。但是hadoop2.x之后,我們可以在集群中配置多個NameNode,就不會有這個問題了,但是配置多個NameNode,需要注意的地方就更多了,系統就更加復雜了。
俗話說“一山不容二虎”,兩個NameNode只能有一個是活躍狀態active,另一個是備份狀態standby,我們看一下兩個NameNode的架構圖。
兩個NameNode通過JournalNode實現同步editlog,保持狀態一致可以相互替換。
因為active的NameNode掛了之后,standby的NameNode要馬上接替它,所以它們的數據要時刻保持一致,在寫入數據的時候,兩個NameNode內存中都要記錄數據的元信息,并保持一致。這個JournalNode就是用來在兩個NameNode中同步數據的,并且standby NameNode實現了SecondNameNode的功能。
進行數據同步操作的過程如下:
active NameNode有操作之后,它的editlog會被記錄到JournalNode中,standby NameNode會從JournalNode中讀取到變化并進行同步,同時standby NameNode會監聽記錄的變化。這樣做的話就是實時同步了,并且standby NameNode就實現了SecondNameNode的功能。
優點:
缺點:
用于輸出指定的值:
s:property value="%{@cn.csdn.hr.domain.User@Name}"/br/
s:property value="@cn.csdn.hr.domain.User@Name"/Br/!-- 以上兩種方法都可以 --
s:property value="%{@cn.csdn.hr.domain.User@study()}"/
網頁標題:nosql的含義是指,數據庫nosql中文意思
轉載來源:http://m.kartarina.com/article30/dseiiso.html
成都網站建設公司_創新互聯,為您提供App開發、網站內鏈、標簽優化、虛擬主機、手機網站建設、關鍵詞優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯