轉(zhuǎn)自: https://mp.weixin.qq.com/s/f8H9jsplxGtVnVRhIEU1MQ
在設(shè)計(jì)多租戶SaaS應(yīng)用程序時(shí),您必須仔細(xì)選擇最適合您應(yīng)用程序需求的租戶模型。租戶模型確定每個(gè)租戶的數(shù)據(jù)如何映射到存儲(chǔ)。您選擇的租戶模式會(huì)影響應(yīng)用程序設(shè)計(jì)和管理死遭。以后切換到另一個(gè)模型有時(shí)代價(jià)昂貴圣猎。關(guān)于可選擇的租戶模型的討論如下。
01? 如何選取合適的租戶模型
一般來(lái)說(shuō)狸页,租賃模式不會(huì)影響應(yīng)用程序的功能落恼,但它可能會(huì)影響整體解決方案的其他方面箩退。以下標(biāo)準(zhǔn)用于評(píng)估每個(gè)模型:
可擴(kuò)展性(Scalability)
租戶的數(shù)量級(jí)
每個(gè)租戶的存儲(chǔ)級(jí)別
整體存儲(chǔ)
工作負(fù)載
租戶隔離性(Tenant isolation)
數(shù)據(jù)隔離和性能(是否一個(gè)租戶的負(fù)載會(huì)影響到其他租戶)
單租戶成本(Per-tenant cost)
數(shù)據(jù)庫(kù)成本
開(kāi)發(fā)復(fù)雜度(Development complexity)
數(shù)據(jù)結(jié)構(gòu)的變化
查詢語(yǔ)句的變化
運(yùn)維復(fù)雜度(Operational complexity)
性能監(jiān)控
數(shù)據(jù)結(jié)構(gòu)schema管理
租戶數(shù)據(jù)恢復(fù)
災(zāi)備
可定制化程度(Customizability)
根據(jù)租戶的需求自定義架構(gòu)的容易程度
這個(gè)租戶的討論集中在數(shù)據(jù)層。但考慮一下應(yīng)用層领跛。應(yīng)用程序?qū)颖灰暈橐粋€(gè)整體實(shí)體乏德。如果將應(yīng)用程序劃分為許多小型組件撤奸,您的租戶模型選擇可能會(huì)發(fā)生變化吠昭。對(duì)于租戶和存儲(chǔ)技術(shù)或使用的平臺(tái),您可以對(duì)其他組件進(jìn)行不同的處理
02 獨(dú)立的單租戶應(yīng)用+獨(dú)立的單租戶數(shù)據(jù)庫(kù)
應(yīng)用層隔離
在這個(gè)模型中胧瓜,對(duì)于每一個(gè)租戶矢棚,整個(gè)應(yīng)用程序需要重復(fù)安裝一次。應(yīng)用程序的每個(gè)實(shí)例都是獨(dú)立實(shí)例府喳,因此它不會(huì)與任何其他獨(dú)立實(shí)例交互蒲肋。每個(gè)應(yīng)用程序?qū)嵗挥幸粋€(gè)租戶,因此只需要一個(gè)數(shù)據(jù)庫(kù)钝满。租戶擁有自己的數(shù)據(jù)庫(kù)兜粘。
每個(gè)應(yīng)用程序?qū)嵗及惭b在獨(dú)立的Azure資源組中。資源組可以屬于軟件供應(yīng)商或租戶擁有的訂閱弯蚜。無(wú)論哪種情況孔轴,供應(yīng)商都可以為租戶管理軟件。每個(gè)應(yīng)用程序?qū)嵗寂渲脼檫B接到其相應(yīng)的數(shù)據(jù)庫(kù)碎捺。
每個(gè)租戶數(shù)據(jù)庫(kù)都作為獨(dú)立數(shù)據(jù)庫(kù)進(jìn)行部署路鹰。該模型提供了最大的數(shù)據(jù)庫(kù)隔離贷洲。但隔離需要為每個(gè)數(shù)據(jù)庫(kù)分配足夠的資源來(lái)處理其高峰負(fù)載。這里重要的是晋柱,彈性池不能用于部署在不同資源組或不同訂閱中的數(shù)據(jù)庫(kù)优构。這種限制使得這種獨(dú)立的單租戶應(yīng)用程序模型成為從整體數(shù)據(jù)庫(kù)成本角度來(lái)看最昂貴的解決方案。
供應(yīng)商管理
即使應(yīng)用程序?qū)嵗惭b在不同的租戶訂閱中雁竞,供應(yīng)商也可以訪問(wèn)所有獨(dú)立應(yīng)用程序?qū)嵗械乃袛?shù)據(jù)庫(kù)钦椭。訪問(wèn)是通過(guò)SQL連接實(shí)現(xiàn)的。這種跨實(shí)例訪問(wèn)可以使供應(yīng)商能夠集中化架構(gòu)管理和跨數(shù)據(jù)庫(kù)查詢以用于報(bào)告或分析目的碑诉。如果需要這種集中式管理玉凯,則必須部署一個(gè)目錄,將租戶標(biāo)識(shí)符映射到數(shù)據(jù)庫(kù)URI联贩。Azure SQL數(shù)據(jù)庫(kù)提供了與SQL數(shù)據(jù)庫(kù)一起使用以提供目錄的分片庫(kù)漫仆。分區(qū)庫(kù)被正式命名為彈性數(shù)據(jù)庫(kù)客戶端庫(kù)( Elastic Database Client Library)。
03 支持多租戶的應(yīng)用+每一個(gè)租戶獨(dú)立數(shù)據(jù)庫(kù)
這個(gè)模式使用具有多個(gè)數(shù)據(jù)庫(kù)的多租戶應(yīng)用程序泪幌,均為一個(gè)租戶一個(gè)數(shù)據(jù)庫(kù)盲厌。為每個(gè)新租戶提供一個(gè)新的數(shù)據(jù)庫(kù)。通過(guò)為每個(gè)節(jié)點(diǎn)添加更多資源來(lái)垂直擴(kuò)展應(yīng)用程序?qū)踊隼帷吗浩;蛘咄ㄟ^(guò)添加更多節(jié)點(diǎn)來(lái)橫向擴(kuò)展應(yīng)用程序?qū)印没隘?s放基于應(yīng)用程序的工作負(fù)載懂扼,并且與個(gè)體數(shù)據(jù)庫(kù)的數(shù)量或規(guī)模無(wú)關(guān)。
租戶的可定制化
與獨(dú)立的應(yīng)用程序模式一樣右蒲,使用單租戶數(shù)據(jù)庫(kù)可以提供強(qiáng)大的租戶隔離阀湿。可以為租戶定制和優(yōu)化任何給定數(shù)據(jù)庫(kù)的模式瑰妄。此自定義不會(huì)影響應(yīng)用中的其他租戶陷嘴。也許租戶可能需要超出所有租戶所需的基本數(shù)據(jù)字段的數(shù)據(jù)。此外间坐,額外的數(shù)據(jù)字段可能需要一個(gè)索引灾挨。
使用每個(gè)租戶一個(gè)數(shù)據(jù)庫(kù),為一個(gè)或多個(gè)獨(dú)立租戶定制架構(gòu)很容易實(shí)現(xiàn)竹宋。應(yīng)用程序供應(yīng)商必須設(shè)計(jì)程序來(lái)小心管理架構(gòu)自定義劳澄。
彈性池
當(dāng)數(shù)據(jù)庫(kù)部署在同一資源組中時(shí),可以將它們分組為彈性數(shù)據(jù)庫(kù)池蜈七。這些池提供了跨多個(gè)數(shù)據(jù)庫(kù)共享資源的具有成本效益的方式秒拔。該池選項(xiàng)比要求每個(gè)數(shù)據(jù)庫(kù)足夠大以容納它所經(jīng)歷的使用高峰要便宜。即使匯集的數(shù)據(jù)庫(kù)共享資源訪問(wèn)權(quán)限宪潮,他們?nèi)匀豢梢詫?shí)現(xiàn)高度的性能隔離溯警。
Azure SQL數(shù)據(jù)庫(kù)提供了配置趣苏,監(jiān)視和管理共享所需的工具。池級(jí)別和數(shù)據(jù)庫(kù)級(jí)別的性能指標(biāo)均可在Azure門戶中以及通過(guò)Log Analytics獲得梯轻。這些指標(biāo)可以深入了解總體和租戶特定的性能食磕。各個(gè)數(shù)據(jù)庫(kù)可以在池之間移動(dòng),為特定租戶提供預(yù)留資源喳挑。這些工具使您能夠以經(jīng)濟(jì)高效的方式確保良好的性能彬伦。
運(yùn)維的可伸縮性
Azure SQL Database平臺(tái)具有許多旨在管理大量數(shù)據(jù)庫(kù)的管理功能,例如超過(guò)100,000個(gè)數(shù)據(jù)庫(kù)伊诵。這些功能使每租戶數(shù)據(jù)庫(kù)模式合理单绑。
例如,假設(shè)系統(tǒng)只有一個(gè)1000租戶數(shù)據(jù)庫(kù)作為其唯一的一個(gè)數(shù)據(jù)庫(kù)曹宴。數(shù)據(jù)庫(kù)可能有20個(gè)索引搂橙。如果系統(tǒng)轉(zhuǎn)換為擁有1000個(gè)單租戶數(shù)據(jù)庫(kù),則索引數(shù)量將增至20,000笛坦。在SQL Database中区转,作為自動(dòng)調(diào)整(Automatic tuning)的一部分,默認(rèn)情況下啟用自動(dòng)索引功能版扩。自動(dòng)索引為您管理所有20,000個(gè)索引及其正在進(jìn)行的創(chuàng)建和刪除優(yōu)化废离。這些自動(dòng)化操作發(fā)生在單個(gè)數(shù)據(jù)庫(kù)中,并且不會(huì)被其他數(shù)據(jù)庫(kù)中的類似操作所協(xié)調(diào)或限制礁芦。自動(dòng)索引處理繁忙數(shù)據(jù)庫(kù)中的索引與繁忙數(shù)據(jù)庫(kù)中的索引不同蜻韭。如果這種巨大的管理任務(wù)必須手動(dòng)完成,那么這種類型的索引管理定制對(duì)于每租戶數(shù)據(jù)庫(kù)規(guī)模而言將是不切實(shí)際的柿扣。
另外在可伸縮性管理上肖方,還擁有以下特色:
* 內(nèi)置備份
* 高可用
* 磁盤加密
* 性能遙測(cè)
自動(dòng)化
管理操作可以通過(guò)devops模型編寫和提供。這些操作甚至可以自動(dòng)化并在應(yīng)用程序中公開(kāi)窄刘。
例如窥妇,您可以自動(dòng)將單個(gè)租戶恢復(fù)到較早的時(shí)間點(diǎn)舷胜∶浼恢復(fù)只需要恢復(fù)存儲(chǔ)租戶的一個(gè)單租戶數(shù)據(jù)庫(kù)。這種恢復(fù)對(duì)其他租戶沒(méi)有影響烹骨,這證實(shí)了管理運(yùn)營(yíng)處于每個(gè)租戶的細(xì)粒度級(jí)別翻伺。
04 支持多租戶的單應(yīng)用+支持多租戶的單數(shù)據(jù)庫(kù)
另一種可用模式是將多租戶存儲(chǔ)在多租戶數(shù)據(jù)庫(kù)中。應(yīng)用程序?qū)嵗梢跃哂腥我鈹?shù)量的多租戶數(shù)據(jù)庫(kù)沮焕。多租戶數(shù)據(jù)庫(kù)的模式必須具有一個(gè)或多個(gè)租戶標(biāo)識(shí)符列吨岭,以便可以選擇性地檢索來(lái)自任何給定租戶的數(shù)據(jù)。此外峦树,該模式可能需要一些僅由租戶子集使用的表或列辣辫。但是旦事,靜態(tài)代碼和參考數(shù)據(jù)僅存儲(chǔ)一次,并由所有租戶共享急灭。
犧牲了租戶的隔離
數(shù)據(jù):多租戶數(shù)據(jù)庫(kù)必然會(huì)犧牲租戶隔離姐浮。多個(gè)租戶的數(shù)據(jù)一起存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)中。在開(kāi)發(fā)過(guò)程中葬馋,確保查詢不會(huì)暴露來(lái)自多個(gè)租戶的數(shù)據(jù)卖鲤。SQL數(shù)據(jù)庫(kù)支持行級(jí)安全性,它可以強(qiáng)制將查詢返回的數(shù)據(jù)限定為單個(gè)租戶畴嘶。
處理:多租戶數(shù)據(jù)庫(kù)跨所有租戶共享計(jì)算和存儲(chǔ)資源蛋逾。數(shù)據(jù)庫(kù)作為一個(gè)整體可以被監(jiān)控,以確保它的性能可以接受窗悯。但是区匣,Azure系統(tǒng)沒(méi)有內(nèi)置的方法來(lái)監(jiān)視或管理單個(gè)租戶使用這些資源。因此蒋院,多租戶數(shù)據(jù)庫(kù)會(huì)增加遭遇嘈雜鄰居的風(fēng)險(xiǎn)沉颂,其中一個(gè)過(guò)于活躍的租戶的工作負(fù)載會(huì)影響同一數(shù)據(jù)庫(kù)中其他租戶的性能體驗(yàn)。附加的應(yīng)用程序?qū)拥谋O(jiān)視可以監(jiān)視租戶層的性能悦污。
更低的成本
一般來(lái)說(shuō)铸屉,多租戶數(shù)據(jù)庫(kù)的租戶成本最低。獨(dú)立數(shù)據(jù)庫(kù)的資源成本低于同等規(guī)模的彈性池切端。此外彻坛,對(duì)于租戶只需要有限存儲(chǔ)的情況,潛在的數(shù)百萬(wàn)租戶可能存儲(chǔ)在單個(gè)數(shù)據(jù)庫(kù)中踏枣。沒(méi)有彈性池可以包含數(shù)百萬(wàn)個(gè)數(shù)據(jù)庫(kù)昌屉。但是,每個(gè)池中包含1000個(gè)數(shù)據(jù)庫(kù)的解決方案(包含1000個(gè)池)可能會(huì)達(dá)到數(shù)百萬(wàn)的規(guī)模茵瀑,有可能變得難以管理间驮。
以下將討論多租戶數(shù)據(jù)庫(kù)模型的兩種變體,分片多租戶模型是最靈活和可擴(kuò)展的马昨。
05 支持多租戶的單應(yīng)用+支持多租戶的單數(shù)據(jù)庫(kù)(不分片)
最簡(jiǎn)單的多租戶數(shù)據(jù)庫(kù)模式使用單獨(dú)的獨(dú)立數(shù)據(jù)庫(kù)來(lái)為所有租戶托管數(shù)據(jù)竞帽。隨著越來(lái)越多的租戶被添加,數(shù)據(jù)庫(kù)被擴(kuò)大了更多的存儲(chǔ)和計(jì)算資源鸿捧。這種放大可能是所需要的屹篓,盡管總是有一個(gè)最終的限制。但是匙奴,在達(dá)到這個(gè)限制之前堆巧,數(shù)據(jù)庫(kù)變得難以管理。
針對(duì)單個(gè)租戶的管理操作在多租戶數(shù)據(jù)庫(kù)中實(shí)施起來(lái)要復(fù)雜得多。大規(guī)模的這些行動(dòng)可能會(huì)變得無(wú)法接受地緩慢谍肤。一個(gè)很壞的例子就是嘗試只恢復(fù)某一個(gè)租戶的某一時(shí)間點(diǎn)的數(shù)據(jù)啦租。
06 支持多租戶的單應(yīng)用+支持多租戶的單數(shù)據(jù)庫(kù)(分片)
大多數(shù)SaaS應(yīng)用程序一次只能訪問(wèn)一個(gè)租戶的數(shù)據(jù)。此訪問(wèn)模式允許租戶數(shù)據(jù)分布在多個(gè)數(shù)據(jù)庫(kù)或分片中荒揣,其中任何一個(gè)租戶的所有數(shù)據(jù)都包含在一個(gè)分片中刷钢。結(jié)合多租戶數(shù)據(jù)庫(kù)模式,分片模型允許幾乎無(wú)限的規(guī)模乳附。
管理分片
分片增加了設(shè)計(jì)和運(yùn)營(yíng)管理的復(fù)雜性内地。需要在其中維護(hù)租戶和數(shù)據(jù)庫(kù)之間的映射的目錄。此外赋除,還需要管理程序來(lái)管理碎片和租戶人口阱缓。例如,必須設(shè)計(jì)程序以添加和刪除分片举农,并在分片之間移動(dòng)租戶數(shù)據(jù)荆针。一種擴(kuò)大規(guī)模的方法是添加一個(gè)新的分片并將其填入新租戶。在其他時(shí)候颁糟,您可能會(huì)將人口稠密的分片分成兩個(gè)密度較小的分片航背。幾個(gè)租戶搬遷或停產(chǎn)后,可能會(huì)將人口稀少的分片合并在一起棱貌。合并將導(dǎo)致更具成本效益的資源利用率玖媚。租戶也可能在分片之間移動(dòng)以平衡工作量。
SQL數(shù)據(jù)庫(kù)提供了一個(gè)拆分/合并工具婚脱,與分片庫(kù)和目錄數(shù)據(jù)庫(kù)一起使用今魔。提供的應(yīng)用程序可以拆分和合并分片,并可以在分片之間移動(dòng)租戶數(shù)據(jù)障贸。該應(yīng)用程序還在這些操作過(guò)程中維護(hù)目錄错森,在移動(dòng)它們之前將受影響的分片租戶標(biāo)記為離線。移動(dòng)后篮洁,應(yīng)用程序再次使用新映射更新目錄涩维,并將租戶標(biāo)記為重新聯(lián)機(jī)。
更小的數(shù)據(jù)庫(kù)更容易管理
通過(guò)將租戶分布在多個(gè)數(shù)據(jù)庫(kù)中袁波,分片多租戶解決方案可生成更輕松管理的小型數(shù)據(jù)庫(kù)瓦阐。例如,將特定租戶恢復(fù)到以前的時(shí)間點(diǎn)現(xiàn)在涉及從備份恢復(fù)單個(gè)較小的數(shù)據(jù)庫(kù)锋叨,而不是包含所有租戶的較大數(shù)據(jù)庫(kù)垄分。可以選擇數(shù)據(jù)庫(kù)大小和每個(gè)數(shù)據(jù)庫(kù)的租戶數(shù)量來(lái)平衡工作負(fù)載和管理工作娃磺。
shema中的租戶標(biāo)識(shí)符ID
根據(jù)所使用的分片方法,可能會(huì)對(duì)數(shù)據(jù)庫(kù)模式施加額外的約束叫倍。SQL Database拆分/合并應(yīng)用程序要求Schema包含分片KEY偷卧,通常是租戶標(biāo)識(shí)符ID豺瘤。租戶標(biāo)識(shí)符ID是所有分片表主鍵中的主要元素。租戶標(biāo)識(shí)符使分離/合并應(yīng)用程序能夠快速定位和移動(dòng)與特定租戶相關(guān)聯(lián)的數(shù)據(jù)听诸。
分片的彈性池
分片多租戶數(shù)據(jù)庫(kù)可以放置在彈性池中坐求。一般來(lái)說(shuō),在一個(gè)池中擁有許多單租戶數(shù)據(jù)庫(kù)的成本效率與在少數(shù)多租戶數(shù)據(jù)庫(kù)中擁有許多租戶相當(dāng)晌梨。當(dāng)有大量相對(duì)不活躍的租戶時(shí)桥嗤,多租戶數(shù)據(jù)庫(kù)是有利的。
混合分片多租戶數(shù)據(jù)庫(kù)
在混合模型中仔蝌,所有數(shù)據(jù)庫(kù)在其Schema中都有租戶標(biāo)識(shí)符泛领。這些數(shù)據(jù)庫(kù)都能夠存儲(chǔ)多個(gè)租戶,并且數(shù)據(jù)庫(kù)可以被分割敛惊。所以在架構(gòu)意義上說(shuō)渊鞋,它們都是多租戶數(shù)據(jù)庫(kù)。然而在實(shí)踐中瞧挤,其中一些數(shù)據(jù)庫(kù)只包含一個(gè)租戶锡宋。無(wú)論如何,存儲(chǔ)在給定數(shù)據(jù)庫(kù)中的租戶數(shù)量對(duì)數(shù)據(jù)庫(kù)架構(gòu)沒(méi)有影響特恬。
移動(dòng)租戶
在任何時(shí)候执俩,您都可以將特定租戶遷移到自己的多租戶數(shù)據(jù)庫(kù)。在任何時(shí)候癌刽,您都可以改變主意并將租戶移回包含多個(gè)租戶的數(shù)據(jù)庫(kù)奠滑。在供應(yīng)新數(shù)據(jù)庫(kù)時(shí),您還可以將租戶分配給新的單租戶數(shù)據(jù)庫(kù)妒穴。
當(dāng)可識(shí)別的租戶群體的資源需求存在較大差異時(shí)宋税,混合模式就會(huì)發(fā)光。例如讼油,假設(shè)參與免費(fèi)試用的租戶無(wú)法保證與訂購(gòu)租戶相同的高性能水平杰赛。該政策可能適用于免費(fèi)試用階段的租戶存儲(chǔ)在所有免費(fèi)試用租戶共享的多租戶數(shù)據(jù)庫(kù)中。當(dāng)免費(fèi)試用租戶訂閱基本服務(wù)級(jí)別時(shí)矮台,租戶可以轉(zhuǎn)移到另一個(gè)租戶較少的多租戶數(shù)據(jù)庫(kù)乏屯。支付高級(jí)服務(wù)級(jí)別的用戶可以轉(zhuǎn)移到其新的單租戶數(shù)據(jù)庫(kù)。
池
在這種混合模式中瘦赫,用戶租戶的單租戶數(shù)據(jù)庫(kù)可以放置在資源池中辰晕,以降低每個(gè)租戶的數(shù)據(jù)庫(kù)成本。這也是在數(shù)據(jù)庫(kù)每租戶模型中完成的确虱。