個人複習筆記Mark,圖片內容大多來自老師提供ppt,感謝大數據課的陳老師、孫老師的辛苦授課~
目錄
(2)分佈式事務處理:事務讀寫的數據分佈在不同機器上,代價昂貴
1 大數據背景與趨勢
1.1 計算機硬件的發展
晶體管數量-摩爾定律,指數級增加
- CPU體系結構發展
- 2005年以前-提高主頻,功耗、散熱等限制主頻的進一步增加
- 轉向核的增加:單核單線->多核多線->衆核
- 多種類型的處理器:GPU/ARM/…
- 存儲層次結構
- 外存(硬盤、閃存)->DRAM內存->L3緩存->L2緩存->L1緩存->寄存器 =>速度快,容量低,價格高
- 內存:容量符合摩爾定律,帶寬有一定的方法增加,訪問速度比指令執行慢100倍
- 硬盤:容量指數級增加,性能(訪問速度慢,帶寬受限於盤片轉速,順序訪問比隨機訪問好)
- 固態:以閃存爲存儲介質,隨機讀性能、順序讀寫性能優於機械,但隨機寫性能差
1.2 數據管理系統的發展
- 關係型數據庫(1970-1980)
- 第一個關係型數據庫:System R
- 事務處理(Transaction Processing)
- 大量併發用戶,少量隨機讀寫操作
- 典型:銀行業務,訂票,購物等
- 數據倉庫:讀取大量數據的分析操作 1990
- 數據流處理、GIS、多媒體數據庫等 2000
- 大數據 2010
1.3 大數據的挑戰
- 三個重要概念&挑戰
- 數據量巨大 Volume
- 數據的產生速度、更新速度快 Velocity
- 數據種類繁多 Variety
1.4 大數據管理系統
2 關係型數據管理系統
2.1 關係型數據模型
(1)Table/Relation (表)
- Column 列
- 一個屬性,有明確的數據類型
- 必須是原子類型,不可再分,無內部結構
- Row 行
- 一個記錄,記錄之間無序
- 表型瘦長,列數較少,行數成千上萬
- 原子類型:無內部嵌套結構
- Int,Double,Char…及Int基礎上表達類型(Date等)
- 數學定義
- Schema vs Instance
- Schema:類型,只需定義一次
- Instance:具體取值,每列具體值
(2)Key(鍵)
- 特殊的列
- 用處:取值唯一,唯一確定一個記錄
- Primary Key:主鍵,唯一確定本表中的一個紀錄(例如學生信息表的ID,選課信息表中學生ID和課程ID的組合)
- Foreign Key:外鍵,是另一個表的主鍵,唯一確定另一個表的一個記錄(例如選課信息表的學生ID和課程ID),可理解爲指針或引用
2.2 關係型運算 & SQL語言
SQL:主流的關係型數據庫語言
- 一般運算
- SQL Create Table +聲明主鍵、外鍵
- SQL Insert
- 插入完整記錄
- 插入特定列
- 插入完整記錄
- SQL Delete
- SQL Update
- 主要關係運算
- Selection 選擇
- 從一個表中提取一些行
- Projection 投影
- 從一個表中提取一些列
- Selection 選擇
=>SQL 選擇+投影
|
- Join 連接(等值連接 Equi-join)
- R表中的a列與S表中的b列,找到兩個表中互相匹配的記錄
- Group by 分組統計
- Having 在group by基礎上選擇
- Order by 排序
- desc (descending 減少)表示從大到小排序;asc (ascending 增加) 表示從小到大排序
- 如何計算平均成績?
2.3 數據庫系統架構
(1)概述
- DBMS(Database Management System)數據庫管理系統
- RDBMS (Relational Database Management System) 關係型數據庫管理系統
- 目前主流的三大商用系統:Oracle, Microsoft SQL Server, IBM DB2
- 通常的系統爲典型的Client/Server
(2)RDBMS系統架構(單機)
- 前端:思考用戶需求
- SQL Parser:將SQL語句的程序變爲解析好的內部表達
- 語法解析,語法檢查,表名、列名、類型檢查
- Query Optimizer:將SQL內部表達變爲執行方案(Query Plan)
- 產生可行的執行方案,估計其運行時間和空間代價,並在多個方案中選擇最佳
- SQL Parser:將SQL語句的程序變爲解析好的內部表達
- 後端:如何存數據、完成運算
- Execution Engine :將執行方案轉爲SQL語句的結果
- 根據執行方案完成相應的運算和操作,數據訪問,關係型運算的實現
- Buffer Pool :在內存中緩存硬盤數據
- Data storage and indexing : 在硬盤上存儲數據 & 高效訪問數據
- Transaction management:事務管理
- 實現ACID,進行logging寫日誌,locking加鎖,保證並行Transaction事物的正確性
- Execution Engine :將執行方案轉爲SQL語句的結果
2.4 數據存儲與訪問
- 數據庫 vs 文件系統
- 數據在硬盤上的存儲
- 硬盤最小存儲訪問單位:一個扇區512b
- 文件系統訪問硬盤單位:4kb
- RDMS最小存儲單位:database page size,可設置爲1至多個文件系統的page,例如4、8、16kb
- 文件系統訪問硬盤單位:4kb
- Page
- 內部結構:page header,slot and tuples ->方便存儲變長的記錄,記錄超出頁面大小需要特殊處理
- Tuple結構
- 硬盤最小存儲訪問單位:一個扇區512b
<center>tuple長度 |變長的列的起始地址 |定長的列的內容 |變長的列的內容
<center>eg:
- 索引
- 數據的順序訪問:順序讀取表的每個page->順序訪問page的每個tuple->檢查條件成立與否->成立的讀取對應內容
- 有選擇性的訪問:使用索引index
- Tree based index:有序,支持點查詢和範圍查詢
- Hash based index:無序,只支持點查詢
- 鏈式哈希表 Chained Hash Table
- H(hey) % size (H是對key位運算產生一個整數,size是hash表中header數組的元素個數)
- 在硬盤上存儲時,bucket =page
- B+樹
|
|
- 葉子節點
|
- 內部節點
|
- Search
|
- Insertion
|
- Deletion
- Range Scan
- Clustered index(主索引)與 Secondary index(二級索引)
- Clustered: 記錄就存在index中,記錄順序就是index順序
- Secondary: 記錄順序不是index順序,index中存儲page ID 和in-page tuple slot ID
- 比較順序訪問&二級索引訪問
- 順序訪問:需要處理每一個記錄,順序讀每一個page
- 二級索引訪問:有選擇的處理記錄,隨機讀相關的page
- 如何選擇:由選中多大比例的記錄決定,根據預測的selectivity、硬盤順序讀和隨機讀的性能,估算兩種方式的執行時間,最終選時間小的方案->query optimizer的一個任務
- Buffer Pool:用於提高性能,減少I/O
- 數據訪問局部性
- 時間局部性:同一個數據元素可能會在一段時間內多次被訪問 ->Buffer pool
- 空間局部性:位置相近的數據元素可能會被一起訪問 ->Page爲單位讀寫
- 組成
- 內存空間分成page大小的單元->frame,每個frame可以緩衝硬盤中的一個page
- 如果一個page在緩衝池中,可直接訪問,節省了i/o操作;不在則找到一個可用的frame,讀取page後放入
- Replacement 替換
- 如果沒有空閒frame,需要找到一個已緩存的page(victim page)替換掉;如果page被修改,需要寫回硬盤
- 如何選擇victim?->替換策略
-
常見替換策略:
- LRU
- 實現方法1:Buffer Head記錄訪問時間戳,令時間戳最早的頁爲victim ->問題:替換操作O(N)
- 實現方法2:當一頁被訪問時,將其移動到最前端,令最後一個page爲victim ->代價O(1),但存在修改隊列和代價和多線程共享隊頭的問題
- Clock算法
- 數據結構:Buffer Head記錄R,取值爲0、1
- 訪問一個頁時,令R=1;替換時,順時針旋轉查看下一頁,如果R爲1則令R=0並繼續旋轉,如果R爲0則選中爲victim
2.5 運算的實現
(1)Operator tree
(2)Selection & Projection
(3)Join(三種思路)
- Nested loop
- 最早
|
- Block Nested Loop
- Index Nested Loop
- Hashing
- Simple hash join:讀R建立哈希表,讀S訪問表找到所有的匹配
- 如果R比內存大->I/O partitioning,將R和S劃分爲小塊,
- PartitionID = hash(join key) % PartitionNumber
- Rj中記錄的匹配只存在於相應的Sj中
- PartitionID = hash(join key) % PartitionNumber
- Grace hash join:對R和S進行I/O partitioning,對於每個Partition進行simple hash join
- Sorting
- 思路:將R按照R.a順序排序,S按照S.b順序排序,可Merge找出所有匹配
2.6 事務處理
大量併發用戶,少量隨機讀寫操作
(1)事務(Transaction)
一個事務可能包含多個操作(select、insert等),事務中的所有操作滿足ACID性質
表現形式:一般每個SQL語句被認爲是一個事務,或者引入特殊語句(begin transaction等)則爲一組語句
(2)ACID:DBMS保證事務的ACID性質
- Atomicity(原子性):要麼完全執行,要麼完全沒執行
- Consistency(一致性):從一個正確狀態轉換到另一個正確狀態
- Isolation(隔離性):每個事務與其它併發事務互不影響
- Durability(持久性):Transaction commit後,結果持久有效,crash也不消失
(3)Concurrency Control (併發控制)
- 數據競爭:不同的執行順序會導致不同的結果->寫讀:讀髒結果
讀寫:不可重複讀
寫寫:更新丟失
- 如何判斷一組事務正確執行?->Serializable(可串行化),判斷一組並行Transactions是否正確執行的標準
- 解決方案:採用機制保證數據競爭不會出現或提交前檢查存在數據競爭與否
- 加鎖:2 Phase Locking 兩階段加鎖->有一個集中的加鎖階段和一個集中的解鎖階段
讀寫的鎖不同
鎖的粒度不同
死鎖
重要條件:循環等待,多個事務相互等待
處理:1->死鎖避免:人爲規定順序,對數據庫系統不適用
2->死鎖檢測:週期性檢測,存在則選一個殺掉
- 不採用加鎖:分爲讀、驗證、寫三個階段。決定提交時,檢查是否有衝突,存在則終止事務,清空私有工作區;不存在則驗證通過
- 優點:衝突較少時沒有加鎖的開銷
- 缺點:衝突很多時,需要不斷重試,浪費大量資源,甚至無法前進
- Snapshot Isolation 快照 : 提交時檢查衝突,有則回到上一個快照
在某些情況下,並不是可串行化的
(4)Crash Recovery (崩潰恢復)
- Transaction commit後,結果持久有效,crash不消失
- 解決方案->WAL (Write Ahead Logging)
- 事務日誌記錄(記錄寫操作)、commit日誌記錄(提交操作)、abort日誌記錄(回滾操作)->日誌記錄按LSN順序被追加到日誌文件末尾
- Write-Ahead:總是先寫日誌,再去做實際操作
- 如何保證持久度Durability:條件爲日誌是持久的,可根據日誌確定所有操作
- 如何實現?保證日誌記錄先於修改後的數據出現在硬盤上
|
- Checkpoint(檢查點):使崩潰時間可控,內容包括
- 當前活動的事務表:包括事務的最新日誌的LSN
- 當前髒頁表:每個頁最早的尚未寫回硬盤的LSN
- Log Truncation:如果LSN之前的所有日誌記錄都不需要了,那麼就可以刪除LSN之前的Log
- Crash Recovery:分析階段->Redo階段(將系統恢復到未崩潰前)->Undo階段(清除未提交事務的修改)
2.7 數據倉庫
讀取大量數據的分析操作
(1)OLAP
Online Analytical Processing(聯機分析處理),在數據倉庫的基礎上實現的
- 基本數據模型:多維矩陣->data cube
- 基本操作:roll up(date to week)、drill down(week to date)、slice(choose x month)、dice(choose many months)
(2)行式與列式數據庫
- 行式數據存儲:每個記錄中把所有的列相鄰地存放
- 優點:多個列的值,可以一次I/O都得到;適合於OLTP,同時需要讀寫同一個記錄的多個列的值
- 缺點:對於數據分析操作,只使用少數列
- 列式數據存儲:每個列產生一個文件,存儲所有記錄中該列的值
- 優點:降低讀的數據量;每個文件存儲相同數據類型的值,具有更高壓縮比
- 缺點:對於調用多個列的情況下的拼裝代價很大
2.8 分佈式數據庫
(1)系統架構
- 三種類型
- Shared memory 共享內存:多芯片、多核
- Shared disk 共享硬盤:多機連接相同的數據存儲設備
- Shared nothing :由以太網連接多臺服務器,機羣系統
- 關鍵技術
- Partitioning(劃分):把數據分佈在多臺服務器上,通常採用Horizontal partitioning(把不同的記錄分佈在不同的服務器上)
- Hash partitioning: machine ID = hash(key) % MachineNumber->哈希隨機
- Range partitioning:每臺服務器負責一個key的區間,有序劃分不重疊
- Partitioning(劃分):把數據分佈在多臺服務器上,通常採用Horizontal partitioning(把不同的記錄分佈在不同的服務器上)
Join操作的並行執行:
- 若partition key就是join key,可以並行執行,每臺機器單機join
- 不是,則需要在Join key上進行分佈式partitioning,然後再join
- Replication(備份):爲了提高可靠性
(2)分佈式事務處理:事務讀寫的數據分佈在不同機器上,代價昂貴
- 2 Phase Commit
- Participant: 完成分佈式事務的部分讀寫操作;Coordinator: 協調分佈式事務的進行
- phase 1 (voting):Coordinator向每個participant發送是否提交事務的詢問消息,每個participant根據本地情況回答yes 或 no,只要有一個No,整個就不能提交
- phase 2 (completion):1.當所有的回答都是yes, 事務提交,Coordinator向每個participant發送commit消息。Participant 回答acknowledgment,當至少一個的回答是no, transaction 將abort,coordinator向每個participant發送abort消息,Participant 回答acknowledgment
- 崩潰恢復