行列路由機制
本文為您介紹如何通過行列路由機制,分流業(yè)務(wù)中同時存在的OLTP類業(yè)務(wù)和OLAP類業(yè)務(wù)。
背景信息
PolarDB-X有以下三種類型實例:
主實例:主要用于承擔(dān)事務(wù)處理(TP)類流量,默認(rèn)訪問行存數(shù)據(jù),并對外提供集群地址。該地址不僅支持事務(wù)處理流量的讀寫分離配置,還支持將分析處理(AP)流量轉(zhuǎn)發(fā)給列存只讀實例和普通的只讀實例。
只讀實例:主要用于承擔(dān)事務(wù)處理(TP)類的讀流量,默認(rèn)訪問行存數(shù)據(jù),并與主實例物理隔離(可對外單獨提供連接地址)。常用于應(yīng)用程序自身的讀寫分離配置或ETL(提取、轉(zhuǎn)換、加載)場景。
列存只讀實例:主要用于承擔(dān)分析處理(AP)類的讀流量,只允許訪問列存數(shù)據(jù),并與主實例物理隔離(可對外單獨提供連接地址)。常用于業(yè)務(wù)中有數(shù)據(jù)分析的場景。
因為行存數(shù)據(jù)向列存數(shù)據(jù)同步存在秒級延遲,所以為了避免主實例讀取數(shù)據(jù)時出現(xiàn)不一致的問題,默認(rèn)情況下,主實例和只讀實例都只允許訪問行存數(shù)據(jù)。
在SQL語句前添加如下前綴代碼,可以將該SQL路由到列存只讀實例執(zhí)行:
/*+TDDL: worload_type=ap enable_columnar_optimizer=true*/
主實例和列存只讀實例并存的路由機制
混合負(fù)載場景
如果您的業(yè)務(wù)中,OLAP類型和OLTP類型的SQL只能使用同一個連接訪問數(shù)據(jù)庫,這種情況下您可以直接使用主實例提供的集群地址來訪問數(shù)據(jù)庫。系統(tǒng)會按照SQL的掃描代價自動路由 ,將OLAP流量自動路由給列存只讀實例執(zhí)行,而OLTP流量則繼續(xù)在主實例上執(zhí)行。
自動路由規(guī)則:
掃描代價的預(yù)估值高于閾值的讀流量,會被判定為AP流量,SQL將會被自動路由至列存只讀實例執(zhí)行。
掃描代價的預(yù)估值低于閾值的讀流量、事務(wù)內(nèi)的讀流量和寫入流量都會被判定為TP流量,SQL將會被自動路由到主實例執(zhí)行。
如果一個主實例有多個列存只讀實例,系統(tǒng)會自動采用大規(guī)模多級并行處理(Massively Parallel Processing,MPP)調(diào)度執(zhí)行。
自動路由配置步驟:
在頁面左上角選擇目標(biāo)實例所在地域。
在實例列表頁,單擊PolarDB-X 2.0頁簽。
單擊目標(biāo)主實例ID,進入基本信息頁面。
在連接信息區(qū)域,單擊配置管理。
在配置管理對話框中執(zhí)行以下操作:
在資源配置區(qū)域的可選實例列表中,選擇目標(biāo)列存只讀實例顯示在已選實例列表中。
在列存只讀配置設(shè)置區(qū)域,單擊開啟,再單擊確定。
列存只讀實例和主實例的數(shù)據(jù)同步存在秒級延遲,如果對主實例和列存只讀實例的數(shù)據(jù)有一致性要求,不建議您采用自動路由機制。
負(fù)載分離場景
如果您的業(yè)務(wù)中,OLAP類型與OLTP類型的業(yè)務(wù)基于不同的應(yīng)用程序訪問數(shù)據(jù)庫,則可以分別為應(yīng)用程序配置不同的連接地址,將OLTP業(yè)務(wù)連接到集群地址,而OLAP業(yè)務(wù)程序連接到列存只讀實例的地址,從而實現(xiàn)主實例和列存只讀實例的分流。
主實例和只讀實例并存的路由機制
透明讀寫分離
PolarDB-X提供了透明的強一致讀寫分離能力。該方案的最大優(yōu)勢是應(yīng)用不需要改動代碼,只需要連接主實例的集群地址,系統(tǒng)會自動將一定比例(比例可配置)的讀流量路由到只讀實例。
透明讀寫分離配置步驟:
在頁面左上角選擇目標(biāo)實例所在地域。
在實例列表頁,單擊PolarDB-X 2.0頁簽。
單擊目標(biāo)主實例ID,進入基本信息頁面。
在連接信息區(qū)域,單擊配置管理。
在配置管理對話框中執(zhí)行如下操作:
在資源配置區(qū)域的可選實例列表中,選擇目標(biāo)行存只讀實例顯示在已選實例列表中。
在行存只讀配置設(shè)置區(qū)域按需設(shè)置。
配置項說明:
配置項
選項
說明
強一致性讀
強一致性
路由到只讀DN的請求可以讀取到最新數(shù)據(jù)。只讀DN延遲超過閾值后,系統(tǒng)會自動將業(yè)務(wù)請求路由到其他延遲正常的只讀DN(如果有)或主實例(需設(shè)置只讀流量切回主實例選項為開啟)。
弱一致性
路由到只讀DN的請求只能讀取到只讀DN的最新數(shù)據(jù)。
開啟MPP查詢加速
開啟/關(guān)閉
基于統(tǒng)計信息做代價估算,將AP類的復(fù)雜查詢路由到只讀實例(CN+DN)做MPP加速。
讀寫分離
路由到只讀實例流量的占比
將原先路由給主實例DN的下推查詢按一定的比例路由到只讀DN。
只讀實例延遲閾值(s)
只讀DN延遲超過閾值后,系統(tǒng)會自動將業(yè)務(wù)請求路由到其他延遲正常的只讀DN上或主實例(需設(shè)置只讀流量切回主實例選項為開啟)。
只讀流量切回主實例
開啟狀態(tài)時,只讀DN延遲超過閾值,只讀流量會切回到主實例。
單擊確定。
手動讀寫分離
如果您的業(yè)務(wù)中希望在應(yīng)用側(cè)實現(xiàn)讀寫分離,可以使用不同的連接地址,寫操作配置主實例的連接地址,讀操作配置只讀實例的連接地址。這種方案的最大特點是讀寫流量相互隔離,彼此不受影響。
單主實例的路由機制
在只有主實例的情況下,應(yīng)用默認(rèn)只能訪問行存數(shù)據(jù)。
常見問題
購買主實例和列存只讀實例后,怎么使用列存加速查詢?
答:一般有兩種方式來使用列存只讀實例:
連接列存只讀實例的地址,可以直接訪問列存數(shù)據(jù)。這種方式適用于明確知道哪些查詢適合在列存上執(zhí)行的情況。具體操作,請參見負(fù)載分離場景。
連接主實例的連接地址。在這種情況下,數(shù)據(jù)庫內(nèi)部會基于查詢代價自動將復(fù)雜查詢路由到列存只讀實例執(zhí)行。這種方式更適合混合負(fù)載場景,無需手動區(qū)分查詢類型。具體操作,請參見混合負(fù)載場景。
掃描代價基于統(tǒng)計信息的計算方式是否會出現(xiàn)誤判,導(dǎo)致查詢沒有按預(yù)想路由到列存只讀實例?
答:因為目前統(tǒng)計信息是定時采集,所以會存在統(tǒng)計信息滯后,導(dǎo)致掃描代價計算不準(zhǔn),導(dǎo)致查詢的路由結(jié)果不符合預(yù)期。對于特別重要的復(fù)雜查詢,建議您對該SQL綁定列存HINT,這樣可以確保這些SQL一定會路由給列存只讀實例執(zhí)行。
怎么對特定的SQL綁定HINT列存,且不需要改動應(yīng)用代碼?
答:PolarDB-X提供了執(zhí)行計劃管理功能,對特定SQL執(zhí)行路由綁定操作,之后數(shù)據(jù)庫會自動將這類SQL路由到列存只讀實例執(zhí)行。
查詢在列存只讀實例執(zhí)行,相比主實例執(zhí)行,性能并沒有明顯提升,怎么解決?
答:因為列存只讀實例執(zhí)行的一般是復(fù)雜查詢,該類查詢對實例的規(guī)格要求較高,所以建議您購買至少32C及以上規(guī)格的列存只讀實例(該實例性價比非常高)以獲得更好的性能。