对于一个 SaaS 来说,隔离是一个非常重要的技术架构策略。当隔离的策略和业务不匹配的时候,往往可能会引发一些线上事故/问题,租户间的性能影响等等。
隔离的意义在于创建独立、安全 的运行环境,以保护数据的私密性、保证服务的稳定性,并防止资源的竞争和滥用,从而为每个客户提供高质量且可靠的服务。
隔离的本质
隔离的本质在于实现独立性和安全性,通过这两者,为每个客户提供一个能够有效,安全使用共享资源的环境。
-
独立性: 隔离确保每个租户都有其自己的资源(如CPU时间、内存空间、磁盘空间等),数据,运行环境和网络通信,且这些都是互不干扰的。这使得每个租户都能在其自己的独立环境中运行,无需担心受到其他租户的影响。
-
安全性: 隔离也保护每个租户的数据,防止其数据被其他租户访问或修改。此外,隔离还能限制每个租户的操作权限,使其只能执行一些安全的操作,以防止其执行可能影响其他租户或整个系统安全的操作。
但是实际中我们往往做不到完全的独立性和安全性,需要根据实际的业务情况确定架构,从而有了不同层面的隔离策略。我们在实际工作中,对于隔离策略能感受到的最直接的影响是:一个良好的隔离策略可以在一定程度上改善服务的稳定性,减少因为某些不可预知的突发事件导致的线上问题影响范围。
隔离是一件系统工程,我们从其应用层面和基于租户的落地策略来看这个事情。
隔离策略的应用层面
隔离策略可以应用在多个层面,并且从落地的位置来看,可以分为以下几个层:
-
硬件层隔离:这是最底层的隔离,包括 CPU、内存、硬盘等硬件资源的隔离。例如,虚拟化技术可以在同一硬件平台上创建多个虚拟机,每个虚拟机都有自己独立的 CPU、内存和硬盘等硬件资源。每个租户的数据和应用都在独立的物理设备上运行,这为最高级别的安全性和隔离性提供了保障。然而,这种隔离方式成本高昂,且扩展性差。
-
操作系统层隔离:这是针对操作系统的隔离,包括进程隔离、文件系统隔离、网络隔离等。例如,容器技术如 Docker 和 Kubernetes 可以在操作系统层面提供隔离,每个容器都有自己独立的进程空间、文件系统和网络接口。这种隔离方式使用操作系统级别的技术(例如容器或虚拟机)来隔离不同租户的应用和数据。这提供了良好的隔离性和灵活性,但可能会对性能产生影响。
-
应用层隔离:这种隔离方式在应用层面实现租户隔离,通常通过在应用中实现特定的逻辑来区分不同的租户。这种方法灵活性高,但需要更多的开发工作,并可能复杂化应用的设计和维护。例如我们常常在应用中引入应用概念,针对不同的接入的应用控制用户请求频率或用户上传大小等。
-
数据库层隔离:这是针对数据存储的隔离,其为每个租户提供独立的数据库或数据库模式。这可以有效地隔离数据,但可能会对数据库性能和管理产生影响。因为数据库是应用程序使用的一种重要资源,我们这里将数据库层隔离作为一个独立的层来区分。
-
网络层隔离:这是针对网络通信的隔离,包括 IP 隔离、端口隔离、流量隔离等。例如,虚拟私有网络(VPN)和网络命名空间等技术可以实现网络层面的隔离。使用网络技术来隔离不同租户的流量,可以有效地防止数据在传输过程中的泄露,以及应对流量突发导致的稳定性等问题。
以上这些不同层面的隔离策略通常会结合使用,以提供全方位的隔离保护。
基于租户的隔离策略
在设计一个基于租户的隔离策略时,有几种常见的模式可以考虑。这些模式可以根据应用程序的需求和复杂性,以及所需的数据安全性等级来选择。以下是几种基于租户的隔离策略:
-
单租户隔离:在这种模式中,每个租户都有自己的独立环境,包括服务器、数据库和其他基础设施。这种模式提供最高级别的隔离,但成本和复杂性也最高。
-
数据库级别隔离:每个租户都有自己的数据库,但可能共享相同的服务器或其它基础设施。这种模式的隔离性略低于单租户隔离,但成本和复杂性也相应减少。
-
模式级别隔离:在同一数据库中,每个租户都有自己的模式(schema)。这种模式的隔离性比数据库级别隔离低,但在设施和管理成本上进一步节省。
-
表级别隔离:每个租户在同一个数据库和模式中有自己的表。这种模式的隔离性比模式级别隔离低,但在大多数情况下,它仍然能提供足够的数据安全性。
-
行级别隔离:在这种模式中,所有租户的数据都存储在同一数据库、模式和表中,但每行数据都标有租户ID,以标示数据所属的租户。这种模式的隔离性最低,但在管理、扩展性和成本效益方面可能最优。
选择哪种模式取决于我们的特定需求和约束。例如,如果需要最高级别的安全和隔离,可能会选择单租户隔离。然而,如果应用程序需要处理大量租户并且希望保持较低的成本,行级别隔离可能会是更好的选择。实际落地时可能是多种方式的混合体,比如有些业务是数据库级别隔离,有些是行级别,同时针对超大客户会单租户隔离。
需要考虑什么
在我们考虑隔离策略时,不是凭感觉,需要考虑多种因素来确定最佳策略,这些因素需要我们从实际的业务场景和需求,以及公司实际的情况出发,谨慎评估后再做决策。
以下是一些可能需要考虑的关键因素:
-
安全性:安全性是最重要的因素之一。根据实际的业务和数据类型,我们可能需要一个强大的隔离策略来保护敏感信息。例如,医疗和金融行业通常需要高级别的安全性和隔离。
-
性能:隔离策略可能会影响系统的性能。例如,如果每个租户都有自己的数据库,那么数据库操作可能会比所有租户共享一个数据库的情况慢。
-
成本:不同的隔离策略可能会导致不同的成本。例如,基于硬件的租户级隔离通常要比其他策略更昂贵,因为每个租户都需要自己的物理资源。
-
可扩展性:隔离策略应支持系统的扩展性。例如,如果预计租户数量会迅速增长,那么我们可能需要一个可以轻松添加新租户的隔离策略,比如应用层隔离策略。
-
复杂性:一些隔离策略可能会增加系统的复杂性。例如,如果每个租户都有自己的服务器和数据库,那么对于运维同学来说,管理和维护这些设备工作量可能会很大,并且需要有一个完善的系统来应对这个复杂性。
-
合规性:在某些行业或地区,我们可能需要遵守特定的隐私和数据保护法规,这可能会影响我们选择哪种隔离策略。
-
业务需求:隔离策略应符合实际的业务需求。例如,如果业务模型需要租户之间共享某些数据,那么我们可能需要一个支持这种共享的隔离策略。
在选择隔离策略时,我们可能需要权衡这些因素,并可能需要妥协。例如,我们可能需要在性能和安全性之间做出选择,或者在成本和可扩展性之间做出选择等等。
因此我们在考虑这些因素,在权衡不同的因素来确定适合我们的隔离策略时,可以参考一下下面的一些做步骤,非标准做法,但是建议至少在执行的时候都需要做到位:
-
确定业务需求:明确业务需求是我们一件事情的出发点,了解业务需求,了解业务模板等等。如业务模型是否允许数据共享?租户数量可能会怎样变化?需要处理哪种类型的数据?回答这些问题可以帮助我们确定需要哪种级别的隔离。
-
理解合规需求:合规是一个特殊的业务需求,单独拿出来说下:在某些行业,如医疗、金融和教育,可能存在严格的数据保护和隐私法规。确保我们了解并遵守这些规定,否则会对业务产生严重问题。
-
评估成本和资源:了解预算和可用资源是实施隔离策略的前置条件。例如,如果预算有限,可能需要选择一种成本效益高的策略,如基于数据库的隔离或行级别隔离。
-
考虑性能:选择的隔离策略应尽可能地最小化对性能的影响。需要对不同策略可能带来的性能影响进行评估。
-
预计增长:如果预计租户数量会迅速增长,那么需要选择一个可以轻松扩展的策略。例如,如果选择基于硬件的隔离,就可能需要考虑如何快速地为新租户提供硬件资源。
-
测试不同的策略:在确定策略之前,可能需要进行一些测试。这可以帮助我们理解不同策略在实际应用中的表现如何。当然如果之前已经做过类似的方案或者有成熟的逻辑,也可以不用测试。
-
获取专业建议:如果可能,获取 IT 顾问或合规顾问的建议可能是有帮助的,他们可能能提供关于如何权衡各种因素的专业建议。
请记住,选择隔离策略并非一次性决定,在业务发展过程中,我们可能需要根据业务的变化和技术的发展进行回顾和调整。
什么时候要特别注意隔离
最后我们聊一下在什么时候要特别注意隔离策略。
虽然隔离策略始终是一个重要的考虑因素,但是出现以下的一些情况或场景的时候时需要特别注意,因为这个时候可能因为隔离策略失效而导致一些问题或事故的产生,此时我们需要基于现况重新回顾隔离策略的有效性和合理性。
-
租户数量快速增加:随着租户数量的快速增加,可能会出现一些租户的行为影响到其他租户的情况。在这种情况下,我们需要确保隔离策略能够防止「坏邻居」问题。
-
租户的量级变化或者资源使用差异变大:如果租户之间在资源使用上存在很大的差异,或者某些租户的资源发生量级的变化,那么我们可能需要更严格的隔离策略,以防止资源使用高的租户影响到其他租户。
-
新业务或新模块上线:如果新业务与现有业务有很大的不同,可能需要新的隔离环境。这可以帮助防止新业务的问题影响到现有的业务,并提供一个更加灵活的环境来进行新业务的开发和测试。
-
新的合规性要求/性能要求...... 这个算是业务属性发生了变化,需要考虑新的合规性或性能要求能得到满足
其实上面的这些注意事项如果在出现的时候再考虑就已经晚了,正确的做法是在做隔离策略的时候就已经考虑好了这些点,并且有监控机制能快速发现这些问题或现象,直接执行准备好的预案或策略。
小结
隔离策略是一个复杂的主题,需要根据你的具体业务需求和约束进行定制。在确定隔离策略时,你应该考虑多种因素,包括性能、安全性、可扩展性、成本和复杂性等。
对 SaaS 企业来说,选择和实施正确的隔离策略是非常重要的。它不仅可以帮助企业提供更好的服务,还可以帮助企业满足合规要求,保护数据安全,提高客户满意度。