SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service...
Transcript of SaaS 之多租戶資料綱要設計技巧 - 叡揚資訊 · SaaS、ASP (Application Service...
隨著 雲 端 運 算 環 境 的 興 起, 軟 體 即 服 務
(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
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
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