NoSQL數據庫概覽及其與SQL語法的比較
HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,同時也是知名的NoSQL數據庫之一。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用的難題。
本文對NoSQL數據庫的定義、分類、特征、當前比較流行的NoSQL數據庫系統等進行了簡單的介紹,并對NoSQL和SQL語法進行了簡單的比較,為大家對NoSQL數據庫的學習提供了有益的參考。
一、NoSQL的出現
關系型數據庫系統多年來在解決數據存儲、服務和處理問題方面取得了巨大的成功。一些大型的公司使用關系型數據庫建立了自己的系統,如聯機事務處理系統和后端分析應用系統。聯機事務處理(OLTP)系統用來實時記錄交易信息。對這類系統的期望是能夠快速返回響應信息(一般在毫秒級)。聯機分析處理(OLAP)系統用來分析查詢所儲存的數據。OLAP屬于商業智能的范疇,數據需要研究、處理和分析,以便收集信息,進一步驅動商業決策。
關系型數據庫的內部設計由關系算法決定,這些系統需要預先定義一個模式(schema)和數據要遵守的類型。SQL是與這些系統交互的標準方式。但在對象-關系不匹配問題出現的場合,SQL就不是表達訪問模式的最好方式了。例如目前炙手可熱的大數據領域,關系型數據庫不能很好地工作。
有關大數據常見定義包括:第一,大數據意味著數據足夠大,為了從這些數據中獲得一些真知灼見,你不得不研究它;第二,大數據就是不再適用于單臺機器的數據。這些觀點并不完整,我們需要用一種根本上不同的方式來考慮數據,從如何驅動商業價值的角度來考慮數據,這種數據就是大數據。
在大數據領域中,系統需要能夠適應不同種類的數據格式和數據源,不需要預先嚴格定義模式,并且能夠處理大規模數據。這樣,NoSQL就出現了。
二、NoSQL的定義
NoSQL(NoSQL= Not Only SQL ),意即“不僅僅是SQL”,是一項全新的數據庫革命性運動。NoSQL的擁護者們提倡運用非關系型的數據存儲。大多數數據庫技術不能保證支持ACID(原子性、一致性、隔離性和持久性),而且大部分技術都是開源項目,這些技術作為整體被稱為NoSQL。
三、NoSQL的分類
一般將NoSQL數據庫分為四大類:鍵值(Key-Value)存儲數據庫、列存儲數據庫、文檔型數據庫和圖形(Graph)數據庫。它們的數據模型、優缺點、典型應用場景如表1所示。
表1 四大NoSQL數據庫分析
分類 | 數據模型 | 優點 | 缺點 | 典型應用場景 |
鍵值(Key-Value)存儲數據庫 | Key指向Value的鍵值對,通常用hash表來實現 | 查找速度快 | 數據無結構化(通常只被當作字符串或者二進制數據) | 內容緩存,主要用于處理大量數據的高訪問負載,也用于一些日志系統等 |
列存儲數據庫 | 以列簇式存儲,將同一列數據存在一起 | 查找速度快,可擴展性強,更容易進行分布式擴展 | 功能相對局限 | 分布式的文件系統 |
文檔型數據庫 | Key-Value對應的鍵值對,Value為結構化數據 | 數據結構要求不嚴格,表結構可變(不需要像關系型數據庫一樣需預先定義表結構) | 查詢性能不高,而且缺乏統一的查詢語法 | Web應用 |
圖形(Graph)數據庫 | 圖結構 | 利用圖結構相關算法(如最短路徑尋址,N度關系查找等) | 很多時候需要對整個圖做計算才能得出需要的信息,而且這種結構不太好做分布式的集群方案 | 社交網絡,推薦系統等 |
四、NoSQL的特征
NoSQL數據庫并沒有一個統一的架構,但是它們都普遍存在表2所示的一些共同特征。
表2 NoSQL的特征
特征 | 描述 |
不需要預定義模式 | 不需事先定義數據模式,預定義表結構等。數據中每條記錄都可能有不同的屬性和格式 |
無共享架構 | NoSQL往往將數據劃分后存儲在各個本地服務器上,從而提高了系統的性能 |
彈性可擴展 | 可以在系統運行的時候,動態增加或者刪除結點。不需要停機維護,數據可以自動遷移 |
分區 | NoSQL數據庫將數據進行分區,將記錄分散在多個節點上面,并且通常分區的同時還要做復制 |
異步復制 | NoSQL中的復制,往往是基于日志的異步復制。這樣,數據就可以盡快地寫入一個節點,而不會出現網絡傳輸遲延 |
BASE | 相對于ACID特性,NoSQL數據庫保證的是BASE特性(BASE是最終一致性和軟事務) |
五、常見的NoSQL數據庫
比較適合采用NoSQL數據庫的場合是:(1)數據模型比較簡單;(2)需要靈活性更強的IT系統;(3)對數據庫性能要求較高;(4)不需要高度的數據一致性;(5)對于給定key,比較容易映射復雜值的環境。
常見的NoSQL數據庫如表3所示。
表3常見的NoSQL數據庫
分類 | 實例 |
鍵值(Key-Value)存儲數據庫 | * Riak:一個開源、分布式鍵值數據庫,支持數據復制和容錯
* Redis:一個開源的鍵值存儲數據庫,支持主從式復制、事務,Pub/Sub、Lua腳本,還支持給Key添加時限 * Dynamo:一個鍵值分布式存儲數據庫,直接由亞馬遜Dynamo數據庫實現 * Oracle NoSQL Database:來自Oracle的鍵值NoSQL數據庫,支持事務ACID和JSON * Oracle NoSQL Database:具備數據備份和分布式鍵值存儲系統 * Voldemort:具備數據備份和分布式鍵值存儲系統 * Aerospike:一個鍵值存儲數據庫,支持混合內存架構,通過強一致性和可調一致性保證數據的完整性 |
列存儲數據庫 | * Cassandra:支持跨數據中心的數據復制,提供列索引
* HBase:一個開源、分布式、面向列存儲的模型 * Amazon SimpleDB:一個非關系型數據存儲 * Apache Accumulo:有序的、分布式鍵值數據存儲,基于Google的BigTable設計 * Hypertable:一個開源、可擴展的數據庫,模仿Bigtable,支持分片 * Azure Tables:為要求大量非結構化數據存儲的應用提供NoSQL性能 |
文檔型數據庫 | * MongoDB:開源、面向文檔
* CounchDB:一個使用JSON的文檔數據庫,使用Javascript做MapReduce查詢,也是一個使用HTTP的API * Couchbase:基于JSON模型 * RavenDB:一個基于.net語言的面向文檔數據庫 * MarkLogic:用來存儲基于XML和以文檔為中心的信息,支持靈活的模式 |
圖形(Graph)數據庫 | * Neo4j:一個圖數據庫,支持ACID事務
* InfiniteGraph:用來維持和遍歷對象間的關系,支持分布式數據存儲 * AllegroGraph:結合使用了內存和磁盤,提供了高可擴展性,支持SPARQ、RDFS++和Prolog推理 |
六、NoSQL和SQL語法的簡單比較
前面介紹了NoSQL的基本情況,下面以HBase和ORACLE為例,對NoSQL和SQL的語法進行簡單的比較。HBase數據庫被認為是安全特性最完善的NoSQL數據庫產品之一,它被證實是一個強大的工具,尤其是在已經使用Hadoop的場合。如今,它已經是Apache頂級項目,有著眾多的開發人員和興旺的用戶社區。
1.創建表
如果要創建一個表“mytable”,其中包含了一個“info”字段,那么:
(1)ORACLE中的語法為:
create table mytable
(
info varchar(30) not null
);
(2)HBase中的語法為:
create ‘mytable’, ‘cf’
該命令創建了一個有一個列族(“cf”)的表“mytable”。
2.寫數據
如果要向表中寫入數據“hello hbase”,那么:
(1)ORACLE中的語法為:
insert into mytable(info) values(‘hello hbase’);
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase’
該命令在“mytable”表的“first”行中的“cf:info”列對應的數據單元中插入“hello hbase”。
3.讀(查)數據
如果要從表中讀出單條數據,那么:
(1)ORACLE中的語法為:
select * from mytable where info = ‘hello hbase’;
(2)HBase中的語法為:
get ‘mytable’, ‘first’
該命令輸出了該行的數據單元。
如果要從表中讀出所有數據,那么:
(1)ORACLE中的語法為:
select * from mytable;
(2)HBase中的語法為:
scan ‘mytable’
該命令輸出了所有數據。
4.刪數據
如果要從表中刪除數據,那么:
(1)ORACLE中的語法為:
delete from mytable where info = ‘hello hbase’;
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase1′
該命令用最新的值覆蓋了舊的值,就相當于將原數據刪除了。
5.修改數據
如果要在表中修改數據,那么:
(1)ORACLE中的語法為:
update mytable set info = ‘hello hbase1′ where info = ‘hellohbase’;
(2)HBase中的語法為:
put ‘mytable’, ‘first’, ‘cf:info’, ‘hello hbase1′
該命令用最新的值覆蓋了舊的值,就相當于修改了原數據。
6.刪表
如果要刪除表,那么:
(1)ORACLE中的語法為:
drop table mytable;
(2)HBase中的語法為:
disable 'mytable' drop 'mytable'
該命令先將表“disable”掉,然后再“drop”掉。
我們可以看到,HBase的語法比較的簡單,因此完全可以將上述所有命令放到一個shell腳本中,讓命令批量執行。下面,我們來具體操作一下:
第一步,編寫名為“command.sh”的腳本,其內容如下:
exec /root/zhouzx/hbase-1.0.1/bin/hbase shell <<EOF create 'mytable', 'cf' put 'mytable', 'first', 'cf:info', 'hello hbase' get 'mytable', 'first' scan 'mytable' put 'mytable', 'first', 'cf:info', 'hello hbase1' disable 'mytable' drop 'mytable' EOF
第二步,將該腳本上傳到Linux機器的安裝HBase的用戶下,依次執行“dos2unix command.sh”和“chmod 777command.sh”命令來轉換文件格式和對文件賦權限。
第三步,執行“./command.sh”命令,在Linux界面上,我們可以看到如下輸出信息:
HBase Shell; enter 'help' for list of supportedcommands. Type "exit" to leave the HBase Shell Version 1.0.1, r66a93c09df3b12ff7b86c39bc8475c60e15af82d, Fri Apr17 22:14:06 PDT 2015 create 'mytable', 'cf' 0 row(s) in 0.6660 seconds Hbase::Table - mytable put 'mytable', 'first', 'cf:info', 'hello hbase' 0 row(s) in 0.1140 seconds get 'mytable', 'first' COLUMN CELL cf:info timestamp=1435807200326, value=hello hbase 1 row(s) in 0.0440 seconds scan 'mytable' ROW COLUMN+CELL first column=cf:info,timestamp=1435807200326, value=hello hbase 1 row(s) in 0.0210 seconds put 'mytable', 'first', 'cf:info', 'hello hbase1' 0 row(s) in 0.0040 seconds disable 'mytable' 0 row(s) in 1.1930 seconds drop 'mytable' 0 row(s) in 0.1940 seconds
整個腳本執行過程不過幾秒鐘,但我們之前提到的所有HBase命令都包括其中了,由此可見批處理的威力。大家一定要好好體會一下。
七、總結
本文對NoSQL進行了全面的介紹,并比較了它與SQL語法之間的不同。盡管大多數NoSQL數據存儲系統都已被部署到實際應用中,但仍存在以下挑戰性問題需要解決:
- 第一,已有key-value數據庫產品大多是面向特定應用自治構建的,缺乏通用性。
- 第二,已有產品支持的功能有限(不支持事務特性),導致其應用具有一定的局限性。
- 第三,已有一些研究成果和改進的NoSQL數據存儲系統,但它們都是針對不同應用需求而提出的相應解決方案,很少從全局考慮系統的通用性,也沒有形成系列化的研究成果。
- 第四,缺乏類似關系數據庫所具有的強有力的理論(如armstrong公理系統)、技術(如成熟的基于啟發式的優化策略、兩段封鎖協議等)、標準規范(如SQL語言)的支持。
- 第五,很多NoSQL數據庫沒有提供內建的安全機制。
隨著云計算、移動互聯網等技術的發展,大數據廣泛存在,同時也出現了許多云環境下的新型應用,如社交網絡、移動服務、協作編輯等。這些新型應用對海量數據管理或稱云數據管理系統也提出了新的需求,NoSQL數據庫在這些方面有大展身手的機會。我們有理由相信,NoSQL數據庫的明天會更加的美好!