digoal
2016-11-07
postgresql , 多租戶 , schema , database , pdb , oracle 12c
oracle 12c提出了資料庫多租戶的概念,即pdbs(私有資料庫),因為早期oracle的設計是以schema為隔離的,schema的隔離不夠徹底,原因是通過賦權就很容易獲得不同schema下的資料。
pdb的設計與postgresql的database概念非常相似,是以postgresql實際上很适合用來實作類似pdb的場景,也即是多租戶的場景。
實際上如果不需要徹底的隔離,可以考慮繼續使用schema。
使用資料庫或schema作為多租戶的基礎,各有優劣。
1. 優點
資料庫隔離較為徹底,從認證層面就開始隔離了,資料庫與資料庫之間也無法直接通路,必須要登陸到對方的資料庫中才能通路對方的資料(即使使用fdw, dblink也是有登陸的過程的)。
登陸時可以通過pg_hba.conf控制來源ip,使用者是否有權限登陸目标庫。
同時在資料庫中的權限體系中還可以配置是否允許使用者通路目标庫,或者在目标庫建立schema。
2. 缺點
因為每個資料庫對應了各自的元資訊,大概有幾百個檔案,是以如果租戶比較多,資料庫也會比較多。
單個資料庫,多個schema的方式,比較輕巧,如果是企業私有的多租戶,可以這樣使用。
通過資料庫的權限體系隔離使用者,通路不同schema。
無法通過pg_hba.conf控制schema的權限,權限隔離可能不夠徹底。
使用者可通過檢視元表,觀察到其他schema的對象,定義等資訊,不安全。如果是企業内部私有的,并且這部分缺陷不敏感時可以使用。
建立租戶和删除租戶需要産生大量中繼資料,或删除大量中繼資料,可能導緻standby長時間延遲。詳見
<a href="https://github.com/digoal/blog/blob/master/201610/20161012_01.md">《postgresql daas設計注意 - schema與database的抉擇》</a>
例如通過用戶端application_name或者用戶端ip位址,區分不同的租戶。
每個租戶的模闆完全一樣,隻是使用了不同的schema。
客戶使用search_path修改路徑,完成對路由的選擇。
一套程式,完成多租戶的方法:
建立會話後,首先選擇路由(即根據用戶端ip或設定的application_name,設定對應的路由)。
也可以每次設定路由(開銷大,較浪費)。
後續的操作則會自動比對對應的schema.
以application_name為schema命名
接下來的sql都會首先搜尋psql中的對象。
如果schema很多,而且要經常調用,建議寫成c function,使用更高效的比對算法,例如hash search。
在業務函數中封裝選擇函數的例子。