0. 前言
前幾天跟朋友聚會的時候,朋友說他們公司准備自己搞一套saas系統,以實現多個第三方平台的業務接入需求。聊完以后,實在手癢難耐,於是花了兩天時間自己實現了兩個saas系統多租戶數據隔離實現方案。俗話說“獨樂樂不如眾樂樂”,所以我把我的“研究成果”寫出來,讓大家樂呵樂呵。
在分享我的研究成果之前,我們先了解一下相關的定義吧。如果對這部分內容熟悉的同學,可以直接略過。
1. 什么是saas系統
引用百度百科上面的描述, “SaaS平台是運營saas軟件的平台。SaaS提供商為企業搭建信息化所需要的所有網絡基礎設施及軟件、硬件運作平台,並負責所有前期的實施、后期的維護等一系列服務,企業無需購買軟硬件、建設機房、招聘IT人員,即可通過互聯網使用信息系統。SaaS 是一種軟件布局模型,其應用專為網絡交付而設計,便於用戶通過互聯網托管、部署及接入。”
也就是說,我只需要能連接上互聯網,並且給saas平台交租金,我就能用saas平台給我提供的系統服務。這方面最典型的例子就是各種雲平台,例如阿里雲。既然我能通過互聯網使用saas平台提供的服務,那么其他人當然也是可以的。於是這就產生了一個多租戶的問題。
2. 什么是多租戶
多租戶問題,簡單來說,是一種架構設計方式,就是在一台或者一組服務器上運行的saas系統,可以為多個租戶(客戶)提供服務,目的是為了讓多個租戶在互聯網環境下使用同一套程序,且保證租戶間的數據隔離。從這種架構設計的模式上,不難看出來,多租戶架構的重點就是同一套程序下多個租戶數據的隔離。由於租戶數據是集中存儲的,所以要實現數據的安全性,就是看能否實現對租戶數據的隔離,防止租戶數據不經意或被他人惡意地獲取和篡改。
3. 數據隔離方案
目前saas多租戶系統的數據隔離有三種解決方案,即為每個租戶提供獨立的數據庫、獨立的表空間、按字段區分租戶,每種方案都有其各自的適用情況。下面我們依次講解這3種方案。
3.1 每個租戶提供獨立的數據庫系統
這種方案的實現方式是所有租戶共享同一個應用,但應用后端會連接多個數據庫系統,一個租戶單獨使用一個數據庫系統。這種方案的用戶數據隔離級別最高,安全性最好,租戶間的數據能夠實現物理隔離。但成本較高。
3.2 每個租戶提供獨立的表空間
這種方案的實現方式,就是所有租戶共享同一個應用,應用后端只連接一個數據庫系統,所有租戶共享這個數據庫系統,每個租戶在數據庫系統中擁有一個獨立的表空間。
3.3 按租戶id字段區分租戶
這種方案是多租戶方案中最簡單的設計方式,即在每張表中都添加一個用於區分租戶的字段(如租戶id或租戶代碼)來標識每條數據屬於哪個租戶,其作用很像外鍵。當進行查詢的時候每條語句都要添加該字段作為過濾條件,其特點是所有租戶的數據全都存放在同一個表中,數據的隔離性是最低的,完全是通過字段來區分的。
4. 三種數據隔離方案的優劣勢分析
隔離方案 |
成本 |
支持租戶數量 |
優點 |
不足 |
獨立數據庫系統 | 高 | 少 | 隔離級別最高,安全性最好,能夠滿足不同租戶的獨特需求,出現故障時恢復數據比較容易 | 數據庫需要獨立安裝,維護成本和購置成本高 |
共享數據庫,獨立表空間 | 中 | 較多 | 提供了一定程度的邏輯數據隔離,一個數據庫系統可支持多個租戶 | 出現故障的情況下,數據恢復相對而言比較復雜 |
按租戶id字段區分 | 低 | 非常多 | 維護和購置成本最低,每個數據庫能夠支持的租戶數量最多 | 隔離級別最低,安全性也最低,數據備份和恢復非常復雜,需要逐表逐條備份和還原 |
5. 為土豪准備的解決方案
前面咱們說的那三種數據隔離解決方案,都是多個租戶共享一個應用實例的。如果你是土豪,非常的不差錢,那這里就還有一種一個租戶一個應用實例的解決方案,直接為土豪量身定制,純24k鈦合金的。
這種方案是在多實例系統的基礎上進行負載均衡,將租戶的訪問請求路由到其專屬的租戶系統上去。這種多實例的部署架構,可以為每個租戶定制代碼,以及提供特色服務。當然,使用這種解決方案提供服務的租戶,那也肯定不差錢,能負擔高額租金的“大客戶”了。
總結
saas系統中需要解決的最核心的問題是租戶的數據隔離問題,我們看到解決這個問題有好幾種方式,這就需要我們在業務場景中去根據實際情況進行選擇。
下一篇文章,我們就來看一下,如何根據租戶id字段來實現同一張表中不同租戶的數據的crud(即增刪改查)。提前劇透一下,我們將使用 springboot + mybatis plus 來實現這種數據隔離方案。
參考資料
https://www.mingzhe.org/blog/2017/08/01/multiple-tenants-architecture-introduction/