Sybase IQ 15.0版本顯著的增強(qiáng)了Intra-operator并行化。許多查詢操作現(xiàn)在可以使用多個(gè)線程并行執(zhí)行。
多數(shù)的表Join操作
(1)Group By操作。
(2)排序(Oder By 與 Merge Joins)。
(3)表中的謂詞執(zhí)行:例如:“WHERE last_name like “%som%”,范圍謂詞,IN條件,“Top N”操作,以及更多。
在Sybase IQ 15.3之前,一個(gè)單獨(dú)的查詢的節(jié)點(diǎn)間(Inter-nodes)和節(jié)點(diǎn)內(nèi)(Intra-Nodes)并行化僅能使用一個(gè)單一服務(wù)器上的CPU資源。當(dāng)時(shí),Multiplex配置在擴(kuò)展支持越來(lái)越多的并發(fā)用戶或者查詢上非常有效,但是對(duì)于利用跨Multiplex的所有計(jì)算帶寬而減少查詢執(zhí)行時(shí)間上無(wú)所作為。新的Sybase IQ 15.3 PlexQ分布式查詢處理功能消除了這種限制,允許一個(gè)查詢使用Sybase IQ Multiplex中所有機(jī)器上的可能的CPU資源。
現(xiàn)在,讓我們?cè)敿?xì)探索Sybase IQ 15.3 PlexQ全共享MPP架構(gòu)中的DQP如何工作?
分布式查詢處理(DQP)將查詢處理分散到Sybase IQ Multiplex中的多個(gè)服務(wù)器上。一個(gè)Sybase Multiplex是一組服務(wù)器,每個(gè)都運(yùn)行Sybase IQ。Multiplex中的服務(wù)器連接到一個(gè)中心存儲(chǔ),比如一個(gè)共享的磁盤(pán)陣列,永久共享數(shù)據(jù)。Sybase IQ Multiplex有一個(gè)混合的集群架構(gòu),包含永久的IQ數(shù)據(jù)的共享存儲(chǔ)、存儲(chǔ)目錄元數(shù)據(jù)的獨(dú)立的節(jié)點(diǎn)存儲(chǔ)、私有的臨時(shí)數(shù)據(jù)、事務(wù)日志。
當(dāng)Sybase IQ查詢優(yōu)化器認(rèn)為一個(gè)查詢可能需要利用多個(gè)節(jié)點(diǎn)上更多的可用CPU資源的時(shí)候,它會(huì)將查詢分為并行的“碎片”,這些“碎片”可以在Multiplex中的其他服務(wù)器上并行執(zhí)行。DQP是這樣一個(gè)過(guò)程:將查詢分解為多個(gè)獨(dú)立的任務(wù)部分,將這些任務(wù)分布到Multiplex中的其他節(jié)點(diǎn)上,將結(jié)果及時(shí)的收集和組織并生成最終的查詢結(jié)果集。
需要重點(diǎn)強(qiáng)調(diào)的是,如果一個(gè)查詢不能完全利用一個(gè)單一機(jī)器上的CPU資源的話,它通常不會(huì)被分布。例如,如果優(yōu)化器將把一個(gè)查詢并行化為7條(保持7個(gè)線程),而CPU有8個(gè)核,則它不會(huì)分布這個(gè)查詢。分布要求網(wǎng)絡(luò)和存儲(chǔ)的開(kāi)銷以分配任務(wù),以及存儲(chǔ)和傳輸即時(shí)的結(jié)果。在一個(gè)DBMS內(nèi)的目標(biāo)就是盡可能快速的執(zhí)行查詢。一個(gè)簡(jiǎn)單的查詢?cè)趩我坏臋C(jī)器上執(zhí)行是快速的。然而,大的、復(fù)雜的查詢,超出了一個(gè)機(jī)器的CPU能力,可能更好的方式就是利用分布式并承擔(dān)因此帶來(lái)的開(kāi)銷。如果性能提高了,那么分布式就是勝利。
DQP對(duì)任何在Multiplex網(wǎng)格配置中部署了Sybase IQ 15.3的客戶都是可用的。當(dāng)你安裝了Sybase IQ,DQP缺省的是打開(kāi)的,所有Multiplex中的服務(wù)器均可被分布式處理所利用。
DQP引入了“Leader”和“Worker”節(jié)點(diǎn)的概念。Leader節(jié)點(diǎn)是查詢發(fā)起的節(jié)點(diǎn),Worker節(jié)點(diǎn)可以是Multiplex中的任何有能力接受分布式查詢處理工作的節(jié)點(diǎn)。所有的Multiplex節(jié)點(diǎn)類型(讀節(jié)點(diǎn)、寫(xiě)節(jié)點(diǎn)、協(xié)調(diào)節(jié)點(diǎn))都可以作為L(zhǎng)eader或Worker節(jié)點(diǎn)。
圖3 一個(gè)運(yùn)行中的分布式查詢
在上圖中,查詢1和查詢2的執(zhí)行被分布到Multiplex中的節(jié)點(diǎn)中。這兩個(gè)查詢由不同的Leader節(jié)點(diǎn)和一組Worker節(jié)點(diǎn)來(lái)完成。這是一個(gè)可能的運(yùn)行場(chǎng)景。你可以非常靈活的配置節(jié)點(diǎn)集(參見(jiàn):下面的“邏輯服務(wù)器”部分)參與一個(gè)分布式的查詢。
Sybase IQ 15.3 也啟用了一個(gè)新的共享DBSpace(數(shù)據(jù)庫(kù)空間)以支持DQP,叫作共享臨時(shí)存儲(chǔ)(Shared Temporary Store)。這個(gè)DBSpace被命名為IQ_SHARED_TEMP,必須存放于可被Multiplex中所有節(jié)點(diǎn)訪問(wèn)和寫(xiě)入的共享磁盤(pán)存儲(chǔ)上。這也是對(duì)IQ_SYSTEM_MAIN和用戶自定義的DBSpace的共同要求。IQ_SHARED_TEMP的目的是允許即時(shí)數(shù)據(jù)在分布式查詢所覆蓋的服務(wù)器間雙向傳遞。IQ_SHARED_TEMP與本地臨時(shí)存儲(chǔ)IQ_SYSTEM_TEMP都使用臨時(shí)緩沖作為數(shù)據(jù)的內(nèi)存緩沖區(qū)。
當(dāng)一個(gè)客戶端向Sybase IQ服務(wù)器提交一個(gè)查詢,查詢優(yōu)化器使用成本分析選擇是否并行化與分布查詢的執(zhí)行。一個(gè)可并行化的查詢被分解為查詢碎片—謂詞和數(shù)據(jù)流動(dòng)的子樹(shù)。只有Sybase IQ引擎支持碎片中包含的所有查詢操作的并行和分布式執(zhí)行時(shí),一個(gè)查詢才被認(rèn)為是適合分布的。
當(dāng)一個(gè)查詢被分布,Leader節(jié)點(diǎn)將查詢碎片分派給Worker節(jié)點(diǎn),并從Worker服務(wù)器收集即時(shí)的結(jié)果。Worker服務(wù)器不決定查詢分布,他們只是簡(jiǎn)單的執(zhí)行分派給自己的任務(wù)并返回結(jié)果。
如果一個(gè)查詢優(yōu)化器作出這樣一個(gè)決定:一個(gè)分布式查詢不適合分發(fā),甚者可能會(huì)降低性能,那么這個(gè)查詢將不會(huì)被分布,而是會(huì)在Multiplex中的單個(gè)節(jié)點(diǎn)上執(zhí)行。查詢可以被分為如下幾類:
(1)不分布的:沒(méi)有碎片在Multiplex的其他節(jié)點(diǎn)上執(zhí)行。該查詢僅在Leader節(jié)點(diǎn)上完成。
(2)部分分布的:一個(gè)或多個(gè)碎片在Multiplex的其他節(jié)點(diǎn)上執(zhí)行,包含“Leader”節(jié)點(diǎn)。
(3)完全分布的:所有碎片在Multiplex的多個(gè)節(jié)點(diǎn)上執(zhí)行。
你可能不總是希望使用Multiplex中的所有服務(wù)器執(zhí)行分布式查詢,而且可能希望用戶使用一個(gè)資源的子集。為了這個(gè)目的,Sybase IQ引入了邏輯服務(wù)器的概念。一個(gè)邏輯服務(wù)器允許一個(gè)Multiplex的一個(gè)或多個(gè)服務(wù)器組合在一起作為一個(gè)邏輯實(shí)體。用戶基于登錄政策授權(quán)訪問(wèn)邏輯服務(wù)器。
有一些內(nèi)建的邏輯服務(wù)器。特別是,內(nèi)建的OPEN邏輯服務(wù)器包含所有不屬于任何用戶自定義的邏輯服務(wù)器的成員的服務(wù)器。如果你不建立任何邏輯服務(wù)器,Multiplex中的所有節(jié)點(diǎn)可能會(huì)參與到DQP中,因?yàn)樗麄兌际荗PEN服務(wù)器的一部分。
用戶登錄政策可能允許訪問(wèn)一個(gè)或多個(gè)邏輯服務(wù)器。一個(gè)用戶將會(huì)連接到一個(gè)物理服務(wù)器上運(yùn)行一個(gè)查詢。Sybase IQ查看用戶登錄政策,決定物理服務(wù)器屬于哪個(gè)邏輯服務(wù)器。然后將查詢執(zhí)行分布到邏輯服務(wù)器的那些成員節(jié)點(diǎn)上。盡管一個(gè)物理服務(wù)器可能屬于不止一個(gè)邏輯服務(wù)器,但是它不可能屬于分配了相同登錄政策的多個(gè)邏輯服務(wù)器。例如,一個(gè)用戶連接到邏輯服務(wù)器A和B,物理服務(wù)器C不屬于邏輯服務(wù)A,B的成員。這確保如果用戶X連接到物理服務(wù)器C,在選擇執(zhí)行查詢的邏輯服務(wù)器時(shí)不會(huì)發(fā)生歧義。你可以動(dòng)態(tài)增加或減少邏輯服務(wù)器的成員服務(wù)器以適應(yīng)不斷變化的應(yīng)用的資源需求。
為了支持參與查詢分布的節(jié)點(diǎn)間的流線式通訊,IQ 15.3引入了Multiplex節(jié)點(diǎn)間通訊(MIPC)框架。MIPC網(wǎng)是一個(gè)點(diǎn)到點(diǎn)的節(jié)點(diǎn)間通訊基礎(chǔ)架構(gòu),是對(duì)IQ15.0中增加的節(jié)點(diǎn)間通訊(INC)協(xié)議的補(bǔ)充。INC用于雙向的心跳監(jiān)測(cè)、版本數(shù)據(jù)同步、以及Multiplex中要求的其他類型的消息和數(shù)據(jù)的傳播。INC允許節(jié)點(diǎn)間通過(guò)協(xié)調(diào)節(jié)點(diǎn)互相對(duì)話,對(duì)當(dāng)個(gè)節(jié)點(diǎn)查詢的相當(dāng)有限的通訊需求來(lái)講已經(jīng)足夠。MIPC允許Multiplex節(jié)點(diǎn)間彼此直接對(duì)話,支持更強(qiáng)健的DQP的通訊需求。
MIPC既有公共的也有私有的配置選項(xiàng)。私有選項(xiàng)允許你指定主機(jī)端口配對(duì)(此時(shí)僅限于TCP/IP協(xié)議),Multiplex服務(wù)器將僅對(duì)DQP相關(guān)的通訊使用該配對(duì)。如果沒(méi)有提供私有的互聯(lián)配置,MIPC使用為其他類型通訊所設(shè)定的主機(jī)端口配對(duì):外部用戶連接和INC連接。
在內(nèi)部測(cè)試階段,一個(gè)私有的MIPC網(wǎng)絡(luò)比一個(gè)共享的MIPC網(wǎng)絡(luò)提供了明顯的性能優(yōu)勢(shì)—在一個(gè)特定的實(shí)例中,一個(gè)分布式查詢,運(yùn)行于私有MIPC網(wǎng)絡(luò)中的2個(gè)節(jié)點(diǎn)上,和使用共享MIPC網(wǎng)絡(luò)的3個(gè)節(jié)點(diǎn)配置的執(zhí)行速度一樣快。
你無(wú)須為激活分布式查詢處理而進(jìn)行任何配置。除非你通過(guò)關(guān)閉dqp_enabled登錄政策選項(xiàng)或dqp_enabled臨時(shí)數(shù)據(jù)庫(kù)選項(xiàng)禁止了DQP,DQP對(duì)合格的查詢自動(dòng)啟用,當(dāng):
(1)該服務(wù)器是Multiplex的一部分。
(2)有一個(gè)邏輯服務(wù)器允許登錄,而且至少一個(gè)節(jié)點(diǎn)可用。缺省的,有一個(gè)叫做OPEN邏輯服務(wù)器的內(nèi)建的邏輯服務(wù)器,所以這個(gè)需求出廠時(shí)即已滿足。
(3)共享臨時(shí)DBSpace有可寫(xiě)的文件。最初,共享臨時(shí)DBSpace中沒(méi)有DBFiles,Multiplex管理員必須增加至少一個(gè)原始設(shè)備DBFile,以激活分布式查詢處理。
一個(gè)查詢操作能被分布,首先必須能夠被并行執(zhí)行。當(dāng)一個(gè)操作并行執(zhí)行的時(shí)候,多個(gè)線程可用于并行執(zhí)行這個(gè)過(guò)程。在IQ15.3中,多數(shù)查詢操作可以被并行化,但不是所有的查詢都可以被分布。
下表顯示了哪些查詢操作可以被分布:
表1 查詢操作分布
具有如下行為的查詢碎片將不會(huì)被分布:
(1)寫(xiě)入數(shù)據(jù)庫(kù)(包括 DDL,INSERT,LOAD,UPDATE和DELETE)
(2)引用臨時(shí)表。
(3)引用存于SYSTEM DBSpace中的表。
(4)引用代理表。
(5)使用不確定的函數(shù),例如NEWID。
需要注意的是,LOAD操作仍然可以被“分布”,通過(guò)使用Multiplex中的多個(gè)節(jié)點(diǎn)并行加載單獨(dú)的表。
Sybase IQ查詢計(jì)劃讓你可以看到查詢是否被分布。查詢計(jì)劃提供了詳細(xì)的信息,指出哪些服務(wù)器參與了查詢處理,評(píng)估任務(wù)如何被分布,以及顯示時(shí)間信息。
當(dāng)一個(gè)客戶端連接到一個(gè)物理服務(wù)器并啟動(dòng)一個(gè)查詢的時(shí)候,DQP開(kāi)始運(yùn)行。這個(gè)服務(wù)器查詢的是Leader節(jié)點(diǎn)。該Leader節(jié)點(diǎn)調(diào)用查詢優(yōu)化器,建立查詢執(zhí)行計(jì)劃。查詢優(yōu)化器建立一個(gè)查詢樹(shù),將查詢分解為碎片。一個(gè)碎片是下列其中之一:
(1)一個(gè)葉條件(一個(gè)謂詞)。
(2)一個(gè)數(shù)據(jù)流動(dòng)的子樹(shù),有特定的分區(qū):范圍分區(qū)或關(guān)鍵詞分區(qū)碎片是查詢樹(shù)的一部分,可以被單獨(dú)執(zhí)行。當(dāng)兩個(gè)碎片可以無(wú)所謂前后順序執(zhí)行時(shí),它們可能被并行執(zhí)行。如果一個(gè)碎片依賴于另一個(gè)碎片的即時(shí)結(jié)果,那么兩個(gè)碎片必須按照適當(dāng)?shù)捻樞驁?zhí)行。如果碎片中所有的查詢操作都是可并行化和可分布的,那么這個(gè)碎片就可以跨所有Worker節(jié)點(diǎn)分布。不能被分布的碎片將完全在Leader節(jié)點(diǎn)上執(zhí)行。這個(gè)優(yōu)化器將每個(gè)查詢操作分解為碎片,作為一組“任務(wù)單元”。一個(gè)任務(wù)單元是一組數(shù)據(jù)集,一個(gè)處理線程基于該數(shù)據(jù)集進(jìn)行工作。
這是一個(gè)查詢計(jì)劃分解查詢碎片的例子。你實(shí)際上不會(huì)在現(xiàn)實(shí)的查詢計(jì)劃中看到下圖中的虛線部分。這僅僅是給你一個(gè)認(rèn)識(shí),一個(gè)查詢可能如何被優(yōu)化器分解。在這個(gè)例子中,碎片1、2、3將會(huì)被并行執(zhí)行:
圖4 描述分布式處理碎片的查詢計(jì)劃樣板
當(dāng)你打開(kāi)創(chuàng)建查詢計(jì)劃文件的數(shù)據(jù)庫(kù)選項(xiàng),整個(gè)查詢的查詢計(jì)劃將在Leader節(jié)點(diǎn)上被創(chuàng)建。
當(dāng)一個(gè)查詢碎片是一個(gè)數(shù)據(jù)流動(dòng)子樹(shù),而且它被分布,參與執(zhí)行該碎片的每個(gè)Worker節(jié)點(diǎn)將為這個(gè)碎片生成一個(gè)本地的查詢計(jì)劃。(注意:你僅需在Leader節(jié)點(diǎn)打開(kāi)查詢計(jì)劃數(shù)據(jù)庫(kù)選項(xiàng),不需要為在Worker節(jié)點(diǎn)上創(chuàng)建查詢碎片計(jì)劃而在Worker節(jié)點(diǎn)上打開(kāi)該選項(xiàng)。)一個(gè)碎片最頂端的查詢操作器管理該碎片的任務(wù)單元并將任務(wù)單元分配到跨所有Worker的線程。
任務(wù)單元的線程分配是一個(gè)高度動(dòng)態(tài)的過(guò)程,允許線程在查詢執(zhí)行時(shí)增加或刪除。線程根據(jù)機(jī)器負(fù)載和資源可用性縱向或回溯擴(kuò)展。臨時(shí)緩沖和CPU時(shí)間的可用性是決定增加或刪除線程的決定性因素。在Sybase IQ DQP中,物理服務(wù)器可以動(dòng)態(tài)地添加到邏輯服務(wù)器上,并且在經(jīng)過(guò)一些初始化之后,一旦新的查詢碎片被安排分布即可開(kāi)始執(zhí)行DQP工作。
圖5 描述分布式處理碎片的查詢計(jì)劃樣板
如果一個(gè)查詢僅有部分被分布,你將會(huì)看到在被分布的節(jié)點(diǎn)之間有一個(gè)三條的黑色豎線。當(dāng)你將鼠標(biāo)移動(dòng)到緊鄰這個(gè)并行線的行計(jì)數(shù)上時(shí),將會(huì)顯示遠(yuǎn)程的行數(shù)(有多少被分布)。最右端的豎線的寬度由遠(yuǎn)程行數(shù)來(lái)決定。
在查詢樹(shù)下,是時(shí)間圖表。最上端,對(duì)每一個(gè)查詢樹(shù)中的節(jié)點(diǎn),你將會(huì)看到執(zhí)行的每個(gè)階段的用時(shí)。現(xiàn)在這包括了Multiplex中所有服務(wù)器的用時(shí)。時(shí)間圖表上關(guān)于CPU使用的部分將顯示所有服務(wù)器的匯總用時(shí)。
在節(jié)點(diǎn)的階段用時(shí)下面是線程顯示。它顯示了在特定的時(shí)間,哪個(gè)服務(wù)器的哪個(gè)線程在執(zhí)行任務(wù)。線程分配以堆棧條圖形顯示:
圖6 查詢計(jì)劃部分顯示Multiplex中的線程和分布
如果你將鼠標(biāo)移動(dòng)到線程條上,你會(huì)看到各種統(tǒng)計(jì),比如:
(1)#53:在正在執(zhí)行的查詢碎片根部的節(jié)點(diǎn)號(hào)。
(2)S∶2:服務(wù)器ID(2),擁有正在執(zhí)行的線程。
(3)T:0-3:正在執(zhí)行的線程的范圍。
(4) A∶2:在那個(gè)時(shí)間段內(nèi)執(zhí)行的線程的平均數(shù)。
(5)N∶3:在那個(gè)時(shí)間段內(nèi)用于計(jì)算線程統(tǒng)計(jì)的樣本數(shù)。
(6)23∶25∶13...— 23∶25∶14:時(shí)間段的起始和結(jié)束時(shí)間。
如果一個(gè)查詢碎片同時(shí)在多個(gè)服務(wù)器上執(zhí)行,你會(huì)發(fā)現(xiàn)線程被碎片堆棧中彼此相鄰且位于上方的碎片的相同的根節(jié)點(diǎn)而阻斷。
下圖的時(shí)間表是特定節(jié)點(diǎn)的詳細(xì)信息:
圖7 查詢計(jì)劃詳細(xì)的特定節(jié)點(diǎn)的信息
對(duì)于一個(gè)特定的節(jié)點(diǎn),你會(huì)發(fā)現(xiàn)任務(wù)是如何被分布到服務(wù)器和線程的。在上面的“碎片1”中,服務(wù)器“kwd_nc1615”的任務(wù)單元的值是“25(2,6,4,4,3,2,3,1)”。這意味著有25個(gè)任務(wù)單元分配到這個(gè)服務(wù)器,而且任務(wù)單元2,6,4,4,3,2,3和1分別被分配到8個(gè)不同的線程。你也會(huì)發(fā)現(xiàn)有多少私有和共享臨時(shí)空間被用于執(zhí)行這個(gè)碎片。
“碎片2”顯示了首先分配到Worker節(jié)點(diǎn)的任 務(wù)單元數(shù)量。大于1意味著Leader節(jié)點(diǎn)在Worker節(jié)點(diǎn)開(kāi)始處理之前首先執(zhí)行了某些任務(wù)。這可能是由于需要開(kāi)始執(zhí)行任務(wù)的Worker產(chǎn)生了一個(gè)延遲。
“碎片3”顯示了“并行下池任務(wù)單元”,即整個(gè)碎片任務(wù)單元的總數(shù)。
DQP可容忍Worker節(jié)點(diǎn)/網(wǎng)絡(luò)的失敗以及Worker節(jié)點(diǎn)的緩慢。如果一個(gè)Worker節(jié)點(diǎn)由于一個(gè)錯(cuò)誤或者超時(shí)沒(méi)能完成任務(wù)單元,這個(gè)任務(wù)單元會(huì)重新回到Leader節(jié)點(diǎn)。如果發(fā)生這種現(xiàn)象,該Worker節(jié)點(diǎn)在碎片執(zhí)行期間將不會(huì)再分配給任務(wù)單元。
盡管一個(gè)Worker節(jié)點(diǎn)可能在執(zhí)行某個(gè)查詢碎片時(shí)發(fā)生失敗,它仍然可以在稍后被分配給不同查詢碎片的任務(wù)單元。