Download - SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service Provider) 觀念大釐清 乍聽之下,SaaS跟10多年前曾經也風行一時應用軟

Transcript
Page 1: SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service Provider) 觀念大釐清 乍聽之下,SaaS跟10多年前曾經也風行一時應用軟

隨著 雲 端 運 算 環 境 的 興 起, 軟 體 即 服 務

(Software as a Service, SaaS)的營運模式

也開始受到軟體開發商的注意,紛紛投入資源,

將一些既有的應用軟體以及新開發的軟體採用此

種模式推向市場。不同於以往到客戶端安裝(on-

premises),供單一用戶使用的模式,SaaS 的一個

特色是在資料中心安裝,以多租戶(multi-tenants)

方式營運:每個租戶的使用者透過網路使用該應用

軟體,其運作所需的軟硬體設施由資料中心與應用

軟體開發商負責維運,租戶只需按使用量與服務品

質等因素依合約付費。

SaaS、ASP (Application Service Provider) 觀念大釐清

乍聽之下,SaaS 跟 10 多年前曾經也風行一時應用軟

體服務商(Application Service Provider, ASP)的模式

好像是一樣的,難道只是新方式,提供多租戶服務,

而不是一租戶一套設備的方式運作,那種模式只能

稱得上是網路應用程式寄存服務(Web applications

hosting)。在資源共享方面,除了關鍵的虛擬化

(virtualization)技術外,如何讓各個租戶之間可以

共享資料庫也是一個重要技術指標。

五種多租戶資料綱要的設計技巧

如果說一租戶一資料庫的寄存服務是一個極端狀況

(圖一),另一個極端就是所有的租戶都共用一資

料庫(圖二)。顯然的,這兩種情況都不理想,第

一種完全沒有資源共享,第二種則缺乏擴充性,所

有租戶都必須使用同一種資料綱要(data schema),

不易提供租戶客製化的服務。兩者之間,應該有一

些比較彈性的作法存在。本文的目的就是要介紹幾

種介於二者之間的資料綱要設計技巧。

以下我們將用資料庫表格(table)搭配 SQL 查詢指

令的方式,介紹五種可用於多租戶資料綱要的設計

技巧。首先,我們以一租戶一資料庫的情境 ( 沒有共

享資料表格 ) 當作基礎範例,再逐一介紹有共享且具

擴充性的五種作法。

假設我們有三個租戶: Tenant 31, 32, 33,以下(圖

三)是他們都要使用的一個資料庫表格:學生資料。

三個表格都有 AccountID 與 Name 這兩個共同欄位,

但也有個別的欄位,以表達客製化的需求。

根據以上的表格設計,如果我們要查詢 Tenant 31 裡

AccountID 為 1 的 Major 欄位資料,可用 SQL 指令

「SELECT Major FROM Tenant31 WHERE AccountID

= 1」來完成。接著我們以此範例為基礎,介紹五種

多租戶資料綱要的設計技巧。

SaaS 之多租戶資料綱要設計技巧撰稿 | 政大資科系 陳恭教授介紹五種可用於多租戶資料綱要的設計技巧

圖一:一租戶一資料庫

圖三:一租戶一表格之範例

圖二:多租戶共享一資料庫

| 叡揚e論壇 第65期 | SEPTEMBER 201136

技術 e 專欄|Technology

Page 2: SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service Provider) 觀念大釐清 乍聽之下,SaaS跟10多年前曾經也風行一時應用軟

Extension Table

Extension Table 這個作法是將租戶共有的欄

位抽出放置於一個資料庫表格,並以新增

的 TenantID 欄位與 Row 欄位來區分不同租

戶的資料。其它個別租戶專有的資料欄位

(user column)則分別寫入不同的表格中。

圖四以上述的基礎範例來展示這種作法,

其中欄位 Row 是用來標記表格內資料紀錄

(record) 的編號。

SQL 指令範例:( 以查詢 Tenant31 表格裡

AccountID 為 1 的 Major 欄位資料 )

SELECT Tenant31.Major FROM TenantExt

LEFT JOIN Tenant31

ON TenantExt.TenantID = Tenant31.TenantID

AND TenantExt.Row = Tenant31.Row

WHERE TenantExt.AccountID = 1

這種作法的主要優點是可以透過將共有欄

位集中存放,達到較好的資料整合性。但

也有一些缺點:(1)共有表格中需額外增

加一些詮釋欄位(meta-data)來區分不同

的租戶,圖四中紅色框框即代表此表格的

詮釋欄位。(2)讀取某些資料的時候,需

要執行較費時的 join 的指令。(3)跟一租

戶一資料庫的作法一樣,仍然有表格數量

隨租戶數增加而增加的問題。

SELECT Col3

FROM TenantUniversal

WHERE Col1 = 1 AND TenantID = 31 AND

Table = 0

這種作法的主要優點是減少表格的數量,

無論多少個租戶都只需要一個表格。但也

有一些缺點:(1)表格中的欄位數量會增

多;此外,因為不同租戶間的資料差異,

造成部份的欄位會有浪費的情況發生,圖

五中綠色框框即為此類欄位。(2)因租戶

間同時也共用欄位,所以某些資料欄位的

資料會有異質性型別的情況 ( 例如,Col3

有字串也有數字 ),從而可能有輸入錯誤的

型別資料到表格的情況發生。(3)缺乏索

引 (index) 的支援,無法利用 TenantID 欄位

與 Table 欄位來指定任一所需資料。

AND Col = 2

AND Row IN

( SELECT Row

FROM PivotInt

WHERE TenantID = 31

AND Table = 0

AND Col = 0

AND Int = 1

)

這種作法的主要優點是加入了資料型別的

處理,同時也不會有欄位浪費的情況發生。

但共有表格中需額外增加不少的詮釋欄位

(meta-data)來區分不同的租戶,圖六中

紅色框框即代表此表格的詮釋欄位。

圖五:Universal Table 多租戶資料綱要

圖六:Pivot Table 多租戶資料綱要

圖四:Extension Table 多租戶資料綱要

Universal Table

Universal Table 這個作法也是將所有租戶的

資料放置於一個共用的資料庫表格,但為

支援租戶之間資料欄位的差異性,它是採

稀疏矩陣的方式來存放資料。具體而言,

共用表格的資料欄位是所有租戶的聯集,

簡單以流水號命名(Col1, Clo2, …),並以

新增的 TenantID 欄位與 Table 欄位來區分

不同租戶的資料。圖五以上述的基礎範例

來展示這種作法。

SQL 指令範例 : ( 以查詢 Tenant31 Table 裡

AccountID 為 1 的 Major 欄位資料 )

Pivot Table

Pivot Table 這個作法是將所有租戶的資料依

資料的型別來分別存放在不同的表格,即

同一型別的資料放置於同一個資料庫表格,

並以新增的 TenantID 欄位、Table 欄位、

Col 欄位以及 Row 欄位來區分不同租戶的

資料。其餘的欄位用來放置租戶的資料。

圖六以上述的基礎範例來展示這種作法。

SQL 指令範例 : ( 以查詢 Tenant31 Table 裡

AccountID 為 1 的 Major 欄位資料 )

SELECT Str

FROM PivotStr

WHERE TenantID = 31

AND Table = 0

SEPTEMBER 2011 | 叡揚e論壇 第65期 | 37

Page 3: SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service Provider) 觀念大釐清 乍聽之下,SaaS跟10多年前曾經也風行一時應用軟

SQL 指令範例 : ( 以查詢 Tenant31 Table 裡

AccountID 為 1 的 Major 欄位資料 )

SELECT Str1

FROM ChunkTable

WHERE TenantID = 31

AND Table = 0

AND ChunkNo = 1

AND Row IN

( SELECT Row

FROM ChunkTable

WHERE TenantID = 31

AND Table = 0

AND ChunkNo = 0

AND Int1 = 1

)

這種作法的相對於 Pivot Table 的作法有下

列優點:(1)減少詮釋欄位與實際資料的

比例。(2)由於只使用一個表格,所以方

便還原建立各租戶的原始資料。除此之外,

還有一些相對於 Universal Table 的優點:

(1)可以透過詮釋欄位來建立索引。(2)

減少欄位的數量。(3)加入資料型別的概

念。但同時也潛藏一些資料欄位有浪費現

象發生的可能,圖七中綠色框框即為部份

欄位浪費的情況。

SQL 指令範例 : ( 以查詢 Tenant31 Table 裡

AccountID 為 1 的 Major 欄位資料 )

SELECT Str1

FROM ChunkRow

WHERE TenantID = 31

AND Table = 0

AND Chunk = 0

AND Row IN

( SELECT Row

FROM TenantCommon

WHERE TenantID = 31

AND AccountID = 1

)

這種作法除了保有 Chunk Table 的主要優點

外,還可以透過將共有欄位集中存放,達

到較好的資料整合性。

Chunk Table

Chunk Table 這 個 作 法 參 考 Pivot 與

Universal table 的方式而有所改良。首先,

也是將所有租戶的資料放置於同一個資料

庫表格,但它改良 Universal table,加入

了資料型別的考量,將租戶資料依其型別

存放於不同的欄位內,一欄位一型別,稱

之為 chunk,而不是像 Pivot table,一型

別一表格的作法。並以新增的 TenantID 欄

位、Table 欄位、ChunkNo 欄位以及 Row

欄位來區分不同租戶的資料。其餘的欄位

用來放置該租戶的資料。圖七以上述的

基礎範例來展示這種作法,在本例中,

有整數與字串兩種資料型別,所以有 Int1

與 Str1 兩個 Chunks,同一筆資料紀錄的

相同型別的資料以 ChunkNo 來區別。例

如,Tenant 31 的 AccountId 與 Grade 欄

位皆為整數型別,但它們的資料可以透過

ChunkNo 的值來區別。

Chunk Folding

Chunk Folding 這個作法修改 Chunk table 的

方式,將租戶共有的欄位抽出放置於一個

資料庫表格,並以新增的 TenantID 欄位與

Row 欄位來區分不同租戶的資料。其它個

別租戶專有的資料欄位則分別寫入另一個

ChunkRow Table 中。圖八以上述的基礎範

例來展示這種作法。

圖七:Chunk Table 多租戶資料綱要

圖八:Chunk Folding Table 多租戶資料綱要

| 叡揚e論壇 第65期 | SEPTEMBER 201138

技術 e 專欄|Technology