玩轉GaussDB(DWS)資源負載管理系列 --- DWS資源負載管理的原理是什么,是怎么實現分布式資源管理的呢?
文章目錄

1.?????? 多租戶介紹
2.?????? 計算資源:cpu管控
3.?????? 計算資源:內存管控
4.?????? 存儲資源:磁盤空間
正文
一、什么是多租戶?
所謂多租戶:就是我們一套集群內,可以有多個用戶使用,比如說云上,一個集群中有多個用戶,大家都有自己的業務要運行,假如其中某個用戶A運行了一些很吃資源的業務,一個人就把cpu、內存等資源用得淋漓盡致,那么其他人就只能看著了,自己的業務完全受阻,這時候,就需要多租戶手段,去限制A用戶所使用的資源,比如規定好讓他最多使用1G的內存,最多使用30%的cpu,這樣的話他的作業跑起來也不會影響到其他人,大家相安無事,好好工作。
二、GaussDB for DWS多租戶概述
GaussDB for DWS 用兩層用戶架構組織租戶。一個父租戶下有多個子租戶,一個子租戶只能屬于一個父租戶。我們通過給父租戶分配資源配額,同時限定附屬于該父租戶的子租戶的資源使用。其中,子租戶也可以分配父租戶分配到的資源。
主要涉及的資源有以下幾種:
1)計算資源:CPU資源、內存資源。
2)存儲資源:磁盤空間。
下面我們分別對各種資源的分隔方式進行一個技術分享。
三、計算資源
CPU資源管控
GaussDB for DWS的CPU管控機制,是基于linux自帶機制:CGroup來實現的,CGroup是Linux內核提供的一種限制、記錄、隔離進程組所使用的物理資源(如CPU、 Memory、I/O等)的機制。
我們以一種樹的形式,組織各個分配了資源的租戶,如下圖所示:
圖中是控制組的一個掛載樹,從最上層開始,就分為了兩部分,一部分是屬于Gaussdb的資源,一部分是留給系統其他進程使用的資源,我們使用的資源如圖所示,都是掛載到Gaussdb:gaussdba的,其中第一層又分為兩個控制組,Backend用來預留資源給數據庫常駐的各個工作線程,Class控制組的資源用來分配給各個用戶進行作業執行。
我們每創建一個父租戶,就會對應創建一個UserClass1-n掛載到Class控制組下,去從Class控制組分到對應配額的CPU資源。而我們創建的子租戶,會從他們的父租戶那里分配資源,當前我們支持兩層的架構,父租戶對應數據庫中的組用戶,子租戶對應數據庫中的業務用戶。
總體來說可以這樣表述:給父租戶分配40%的CPU,此時子租戶將父租戶的40%當做100%來分配,比如子租戶A設置配額為50%,那么實際上是相當于分配了整體CPU資源的40%*50%=20%。
2.內存資源管控
Gaussdb for DWS數據庫當前的架構由最早的多進程架構,演變為多線程架構,因此單獨一個數據庫實例,比如一個coordinator或者datanode,都是作為一個進程運行,進程中會用多個線程去負責各種不同的工作,比如有的用來執行用戶作業,有的用來處理后臺的任務,各個cn與dn互相之間由一套獨特的通信架構進行聯絡(基于TCP協議),由cn解析下發客戶端發過來的作業,下推給dn去執行,結果再返回匯總到cn,完成各種業務。
DWS會直接在數據庫進程啟動的時候,就為其分配好內存,為實例分配的一整塊內存中,會根據不同的需要,劃分為各種不同的內存上下文,其中有一塊內存,叫做dynamic_workload_memory,作為作業運行時可以使用的內存,總體大小也會在一開始被規定好,舉個例子,整個進程分配到20G內存,可以給dynamic_workload_memory根據算法從中分配對應的內存,比如會分配20G中的15G用于作業執行。
而我們要說的多租戶內存管控機制,就是從這15G的內存中,按照租戶規定的百分比,對一個租戶可以使用的資源進行限制。當給一個租戶設置了一定額度的內存之后,數據庫中會對他使用的內存進行一個記錄,當他運行的作業所使用的內存要超過對應的內存的時候,就會不再執行,作業進入排隊狀態,等待資源釋放之后再繼續執行。
四、存儲資源
存儲資源主要就是指磁盤空間上的管控,在實際使用的過程中,很容易出現由一條壞SQL一直執行,持續下盤,導致整個磁盤到達使用率100%的狀態,后果非常嚴重,因此,DWS也為了避免出現這種狀況,提供了磁盤管控的功能,在內核8.0版本中,一共提供了三種類型的磁盤空間管控:永久表空間管控、臨時表空間管控、以及SQL執行時的算子羅盤使用的臨時空間管控。日常使用過程中進行下盤的無非這三種場景,我們已經都可以對其進行磁盤額度限制,這個額度和用戶綁定,我們在使用過程中,創建用戶或者修改用戶,都可以指定該用戶可以使用的永久空間,臨時表空間,算子落盤空間。使一個用戶所使用的磁盤空間在可控制的范圍內,一旦超過限制,該用戶將不能再進行落盤的操作,并且如果是當前正在執行的語句導致的磁盤空間膨脹,數據庫內核也會把他找到并且干掉。
具體內部機制可以這樣描述:內核中會記錄每個用戶使用的空間大小,并且在用戶進行落盤等使用到磁盤空間操作時也進行對應記錄,直到用戶所使用的空間達到限額時,內核就會做出對應的策略,不允許該用戶再進行落盤。
此外,內核中還有一個保護機制,就是當某個dn實例使用率達到90%時,整個集群會進入只讀狀態,為防止磁盤達到100%后的未知后果,直接禁止所有的寫入操作。
五、后記
與此同時,對于用戶所使用的資源,DWS也提供了監控功能,從頁面上可以看到當前用戶的資源使用情況,同樣也可以在內核中查詢視圖:pg_total_user_resource_info進行查看。
希望通過本文可以加深讀者對于DWS多租戶功能的認識理解。
數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。