SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service...

3
著 雲 端 運 算 環 境 的 興 起, 軟 體 即 服 務 Software as a Service, SaaS)的營運模式 也開始受到軟體開發商的注意,紛紛投入資源, 將一些既有的應用軟體以及新開發的軟體採用此 種模式推向市場。不同於以往到客戶端安裝(on- premises),供單一用戶使用的模式,SaaS 的一個 特色是在資料中心安裝,以多租戶(multi-tenants方式營運:每個租戶的使用者透過網路使用該應用 軟體,其運作所需的軟硬體設施由資料中心與應用 軟體開發商負責維運,租戶只需按使用量與服務品 質等因素依合約付費。 SaaSASP 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 2011 36 技術 e 專欄 Technology

Transcript of SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service...

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