NoSQL綜述
什麼是NoSQL:
NoSQL:not only SQL,非關系型資料庫
NoSQL是一個通用術語
指不遵循傳統RDBMS模型的資料庫
資料是非關系的,且不使用SQL作為主要查詢語言
解決資料庫的可伸縮性和可用性問題
不針對原子性或一緻性問題
為什麼我們要使用NoSQL:
網際網路的發展,傳統關系型資料庫存在瓶頸
高并發讀寫
高存儲量
高可用性
高擴充性
低成本
NoSQL和關系型資料庫對比
NoSQL的特點
最終一緻性
應用程式增加了維護一緻性和處理事務等職責
備援資料存儲
NoSQL != 大資料
NoSQL産品是為了幫助解決大資料存儲問題
大資料不僅僅包含資料存儲的問題還有Hadoop、Kafka、Spark, etc
NoSQL基本概念
三大基石(CAP、BASE、 最終一緻性)
CAP:
資料庫最多支援3個中的2個
Consistency(一緻性),Availability(可用性),Partition Tolerance(分區容錯性)
NoSQL不保證“ACID”
提供“最終一緻性”
BASE
Basically Availble(基本可用):保證核心可用
Soft-state(軟狀态):狀态可以有一段時間不同步
Eventual Consistency(最終一緻性):系統經過一定時間後,資料最終能夠達到一緻的狀态
核心思想是即使無法做到強一緻性,但應用可以選擇适合的方式達到最終一緻性
最終一緻性
最終結果保持一緻性,而不是時時一緻
如賬戶餘額,庫存量等資料需強一緻性
如catalog等資訊不需要強一緻性
Causal consistency(因果一緻性)
Read-your-writes consistency
Session consistency
Indexing(索引)
大多數NoSQL是按key進行索引
部分NoSQL允許二級索引
HBase使用HDFS,append-only
批處理寫入Logged
重新建立并排序檔案
Query(查詢)
沒有專門的查詢語言,通常使用腳本語言查詢
有些開始支援SQL查詢
有些可以使用MapReduce代碼查詢
*MapReduce
不是Hadoop的MapReduce,概念相關
可進行資料的處理查詢
Sharding(分片)
一種分區模式
可以複制分片
有利于災難恢複
Apache HBase 生态圈
HBase生态圈技術:
Lily – 基于HBase的CRM
OpenTSDB – HBase面向時間序列資料管理
Kylin – HBase上的OLAP
Phoenix – SQL操作HBase工具
Splice Machine – 基于HBase的OLTP
Apache Tephra – HBase事務支援
TiDB – 分布式SQL DB
Apache Omid - 優化事務管理
Yarn application timeline server v.2 遷移到HBase
Hive metadata存儲可以遷移到HBase
Ambari Metrics Server将使用HBase做資料存儲
HBase實體架構 - HMaster
HMaster的作用:
是HBase叢集的主節點,可以配置多個,用來實作HA
管理和配置設定Region
負責RegionServer的負載均衡
發現失效的RegionServer并重新配置設定其上的Region
HBase實體架構 - RegionServer
RegionServer負責管理維護Region:
一個RegionServer包含一個WAL、一個BlockCache (讀緩存)和多個Region
一個Region包含多個存儲區,每個存儲區對應一個列族
一個存儲區由多個StoreFile和MemStore組成
一個StoreFile對應于一個HFile和一個列族
HFile和WAL作為序列檔案儲存在HDFS上
Client與RegionServer互動
HBase實體架構 - Region和Table
單個Table(表)被分區成大小大緻相同的Region
Region是HBase叢集分布資料的最小機關
Region被配置設定給叢集中的RegionServer
一個Region隻能配置設定給一個RegionServer
HBase邏輯架構 - Row
Rowkey(行鍵)是唯一的并已排序
Schema可以定義何時插入記錄
每個Row都可以定義自己的列,即使其他Row不使用
相關列定義為列族
使用唯一時間戳維護多個Row版本
在不同版本中值類型可以不同
HBase資料全部以位元組存儲
HBase架構特點
強一緻性
自動擴充
當Region變大會自動分割
使用HDFS擴充資料并管理空間
寫恢複
使用WAL(Write Ahead Log)
與Hadoop內建
HBase shell常用指令
使用者權限:
user_permission [‘表名’…]
grant ‘使用者名’, ‘RWXCA’
表:
增:create ‘表名’,{NAME=>‘列簇名’},{NAME=>‘列簇名’}…
删:disable ‘表名’ + drop '表名’
改:snapshot ‘表名’,‘鏡像名’
clone_snapshot ‘鏡像名’,‘新表名’
delete_snapshot ‘鏡像名’
查:list
行:put的時候:put ‘表名’,‘行鍵’,‘列簇名:列名’,‘值’[,‘時間戳’]
可以單獨删除行,行內資料全部删除
列簇:
增:alter ‘表名’,NAME=>‘列簇名’
删:alter ‘表名’,NAME=>‘列簇名’,METHOD=>‘delete’
改:先加後删
查:get ‘表名’,‘行鍵(row)’,‘列簇名’
列:cell 值+時間戳