併發執行,主要爲了增大吞吐,下降延遲,提升數據庫的可用性數據庫
先區分一組概念,parallel和distributed的區別架構
總的來講,parallel是指在物理上很近的節點,好比本機的多個線程或進程,不用考慮通訊代價
distributed,要充分的考慮通訊代價,failover的問題,更爲複雜併發
先解釋一下概念,高併發
process model,指數據庫系統架構設計,用於支持多用戶的併發請求線程
worker,用於執行客戶端tasks的DBMS組件架構設計
一般的process model有3種,設計
Process Per Worker,每一個worker都是一個系統進程,3d
進程最大優勢,隔離好,不會由於一個worker影響整個庫,但問題確定是過重,比較低效,支持不了高併發
早期的數據庫每每採用這個方案,是由於那個時候線程的方案還不成熟blog
Process Pool,這個方案和上面的沒有本質不一樣,只是worker從只用一個進程,到使用一個進程pool
Pool的好處,一個worker能夠同時相應多個請求,並且一個進程hang住了,不會影響worker工做進程
壞處,一個client的連續的請求會分配到不一樣的進程,那麼CPU cache locality上就不是很好
Thread Per Worker
這個是當前主流的process model,
一個數據庫實例是一個進程,worker經過線程實現,這樣由DBMS本身進行線程調度
線程模型明顯更加輕量,更容易應對高併發的場景,並且線程間通訊的成本很低
最大的問題是隔離性很差,一個線程可能把整個庫搞掛
並行有兩種,
不一樣的query,並行的執行
一條query中不一樣的operation並行的執行
Inter-query,很容易理解,要解決的也就是併發控制問題,這個後面會講
這裏重點說下Intra-query,它也是包含兩種類型,
首先是Intra-operator,水平並行,MPP
把數據水平分紅多份,分別執行,有個Exchange,相似latch,等待全部分片都執行完,作相應的merge而後再往上發送
而後是,Inter-operator,DAG方式,pipeline,streaming process
前面光說了,平行處理,可是數據庫的瓶頸大部分在磁盤IO
因此若是要並行計算,關鍵是數據要能劃分開,並行的讀取
一些比較簡單的方法以下,
人爲的分多塊盤,或是用raid0,raid1
可是若是要在表級別作劃分,就須要更爲複雜的方法,對數據作partition
劃分又分爲兩種,
垂直劃分,列存
水平劃分,sharding