1、什麼是多租戶模式sql
多租戶模式的定義:單個產品實例爲多個用戶提供服務,同時用戶可按需購買使用產品資源,用戶數據相互隔離。數據庫
定義裏的用戶即租戶,租戶狹義上理解就是使用系統的人。廣義上來講還應該包括建立的系統、數據等一切與當前租戶有關的系統資源。微信
2、舉個栗子架構
2.1 傳統模式blog
假設咱們有一個學生管理系統,有課程查詢、成績查詢兩個功能,每一個學生都有帳號能夠登錄,使用系統中的這兩個功能。而後咱們把這個系統賣給不少個學校去使用,這時候須要給每一個學校去部署一套系統。資源
2.2 多租戶模式路由
仍是上面的系統,結合第一章節的定義,咱們看多租戶模式下的系統架構,這時候咱們只有一個學生管理系統實例,每一個學校使用的時候首先以學校爲單位進行租戶建立,而後能夠按需購買系統功能,好比只須要成績查詢,這裏的每一個學校就是一個租戶。開發
3、幾種數據隔離模式部署
3.1 共享數據表,租戶ID隔離產品
這種模式也是咱們平日裏系統隔離用戶使用的模式,既在表中加一個用戶ID字段,多租戶這裏就是在表中多加一個租戶ID字段進行數據區分,登錄哪一個租戶就經過ID查詢到對應租戶的數據。拿成績表的查詢SQL舉例就是:
select * from t_score where tenantid = '租戶的ID'
3.2 共享數據庫,Schema隔離
該模式就是共享一個數據庫實例,而後根據租戶創建多個Schema,以Mysql數據庫爲例,就是創建多個Mysql用戶,每一個Mysql用戶下都有完整的系統表。這裏在系統開發時就須要根據租戶動態進行數據源切換,獲取對應租戶的Schema。
3.3 獨立數據庫
該模式就是徹底獨立數據庫實例,還以Mysql數據庫爲例,就是裝有不少個Mysql服務,每一個租戶對應一個實例 ,每一個實例下具備相同的Schema和表 。這裏也須要在系統開發時根據租戶動態進行數據源切換,獲取對應租戶的數據庫實例。
4、實現多租戶系統的幾個關鍵點
將一個傳統模式的系統,改爲多租戶架構,大的方面來講,只須要作好這兩點便可實現,也是最關鍵的兩點。
4.1 租戶管理
上面3.1 給了一個SQL,這個SQL在實際開發時,會發現是不可用的,知足不了需求,爲何呢?回到上面的學生管理系統,想一想看,學校管理員購買了一個租戶系統,而具體使用系統的人是學生,是學生在查成績,先想一個問題,學生的數據從哪來?
(1)學校管理員添加
也就是學校管理員建立了租戶系統後,在後臺經過學生添加功能進行學生信息錄入,這不就有了學生信息了,也容易關聯上租戶ID,看着好像沒有問題,咱們來捋一下執行過程。
學生訪問系統 -> 輸入帳號密碼,點登錄後 -> 3.1 模式由於數據源是一個,因此直接連上查t_student表 -> 對比用戶名、密碼 - > 找到且密碼正確即認爲登錄成功。
例外狀況1:假如學生張三由學校A轉到了學校B,這時候學校A的租戶和學校B的租戶都有了張三的信息,這時候有兩條數據,怎麼比對?這時候就不對了,租戶ID還沒法肯定。這時候就須要下面的兩種方案。
例外狀況2:假如使用的是3.2 或 3.3 的數據隔離模式,至關於有多個數據源,這時候登錄時鏈接哪個數據源查?這時候也就不對了。租戶ID還沒法肯定。這時候一樣須要下面的兩種方案。
(2)學生註冊爲租戶
方式一:學校想添加學生A,能夠輸入學生A的郵箱地址,發送邀請,學生A收到郵件邀請,登錄平臺註冊爲租戶(不建立系統),註冊後自動進入發送邀請學校的學生庫。
方式二:學生A直接登錄平臺註冊爲租戶,學生A將註冊信息提供給學校管理員,學校管理員添加到學生庫。
存儲租戶的租戶表自己是共享的。而後須要 「租戶學生表」 (建立系統的租戶ID,學生租戶ID)
這時候登錄並查詢成績流程就是:學生輸入用戶名、密碼 -> 查詢租戶表 -> 登錄成功 -> 查詢租戶學生表 -> 選擇對應的租戶學校 -> 進入租戶系統首頁 -> 查詢成績
(3)特定登錄地址
即給每一個租戶購買系統後,生成特定獨有的登錄地址,帶有學校的租戶ID,而後將登錄地址共享給學生便可。這也能夠解決租戶ID沒法肯定的問題。並且無需學生註冊爲租戶。
4.2 數據路由
數據路由是數據隔離後的關鍵點,3.1 模式下即實現SQL的包裝,作一層AOP,查詢的時候在原來的SQL上附加
where tenantid = '' and studentid = ''
3.二、3.3 則須要根據租戶ID動態切換數據源,代碼層面即獲取不一樣的Connection,實現細節限於篇幅,此處不展開了。
5、總結
其實若是拋開商業模式來講,淘寶、京東包括咱們常見的系統從技術架構上看均可以算是一種多租戶系統,爲何?
由於首先是單實例能夠支持多用戶的,其次數據是能夠根據用戶ID隔離的(同第三章節「共享數據表,租戶ID隔離」 模式)。
從總體架構上看又不是,爲何?首先不知足的是系統功能不是按需付費,像淘寶每一個會員進去功能都是同樣的,不能按需挑選功能,你說我不要訂單功能,可能嗎?顯然不可能,你要不要訂單功能就在那。另外功能免費。
還有就是商業模式的問題,不是將軟件自己做爲服務銷售,還拿淘寶來講,它售賣的是淘寶上的商品,而不是淘寶軟件自己的功能。因此模式上不是SAAS,嚴格上就不算多租戶系統。
最後給你們一個公式,完整的多租戶模式 = 多租戶商業模式 + 多租戶技術架構。
PS :可關注「風象南講全棧」公衆號,有機會成爲做者微信私人好友