当前位置 博文首页 > weixin_ccjz9527的博客:用于SaaS的MySQL共享模型

    weixin_ccjz9527的博客:用于SaaS的MySQL共享模型

    作者:[db:作者] 时间:2021-07-05 21:59

    MySQL是一种流行的数据库技术,用于构建许多现代SaaS应用程序,从简单的生产力工具到金融和医疗行业的关键业务应用程序。

    几乎所有由MySQL支持的大规模SaaS应用程序都使用分片来扩展。 在本文中,我们将讨论分片选择,因为它们适用于这些类型的应用程序。

    在MySQL中,不像一些更现代的技术,如蒙古数据库,没有大多数应用程序使用的标准分片实现。 事实上,如果说有什么不同的话,”没有标准”就是标准。 通常的做法是使用你自己的分片框架,就像著名的MySQL部署,比如脸书和推特。 MySQL集群—内置自动分片功能的MySQL软件—很少部署(出于各种原因)。 MySQL结构一直是官方的分片框架,也没有吸引力。

    今天进行分片时,您可以选择从头开始滚数据库同步软件 动自己的系统,使用全面的分片平台,如维特斯,或者使用代理解决方案来帮助您进行分片。 对于代理解决方案,MySQL路由器是官方解决方案。 但实际上,第三方解决方案,如开源ProxySQL、商业ScaleArc和半商业马里亚数据库最大规模被广泛使用。 但是,请记住,流量路由只是大规模分片实现中存在的问题之一。

    在应用程序数据库连接框架或数据库代理的所有这些”前端”选择之下,有一些较低级别的决策需要您去做。 也就是说,围绕您的数据将如何在MySQL节点上被导出和组织。

    谈到SaaS的申请,至少有一个答案很简单。 使用某种映射表按”客户”或”组织”来划分数据通常是有意义的。 在绝大多数情况下,单个节点(或复制集群(应该足够强大,能够处理来自每个客户的所有数据和负载。

    接下来你应该问自己的问题是关于你的SaaS申请:

    • 您为每位客户创造了多少收入?
    • 您的客户(或法规(需要数据隔离吗?
    • 所有的顾客都差不多吗,还是有异常值?
    • 您的所有客户都运行相同的数据库模式吗?

    我在下面的章节中给出了答案。

    你为每个客户创造了多少收入是一个重要的数字。 它定义了每个客户可以承受的基础架构成本。 在”免费增值”模式的情况下,如果客户平均每月收入不到1美元,您可能需要确保每个客户的低开销(即使您不得不在客户隔离上妥协).

    通常,对于低收入客户,您必须将数据放在同一个MySQL实例中(甚至可能是同一个表). 在高收入客户的情况下,隔离在单独的MySQL实例(甚至是容器或虚拟化操作系统实例(中是可能的。

    隔离是另一个需要考虑的重要方面。 一些企业客户可能要求他们的数据在物理上与其他数据分开。 还可能有政府法规要求将客户数据存储在特定的物理位置。 如果是这种情况,您将看到完全专用的客户环境。 或者至少是独立的数据库实例(这带来了额外的成本).

    客户规模和要求也很重要。 一个被设计用来处理所有规模大致相同的客户的系统(例如,个人会计(将与你从事博客托管业务的系统不同。 有些博客可能比普通博客受欢迎10000倍。

    最后,还有一个大问题,即您的所有客户是否运行相同的数据库模式和相同的软件版本。 如果您想要支持不同的软件版本(例如,如果您的客户需要协商的软件升级维护窗口(或不同的数据库模式(例如,如果模式依赖于客户可能使用的定制功能和模块),那么将这些客户保持在不同的MySQL模式中是有意义的。

    这让我们看到了以下分段隔离模型,从最低到最高:

    • 客户共享模式。 当你有大量低收入客户时,这是最好的选择。 在这种情况下,您可以将多个客户映射到同一组表,并包含类似 客户编号 字段来过滤客户数据。 这种方法最大限度地减少了客户开销,减少了客户隔离。 为单个客户备份/恢复数据更难,引入可能会访问其他客户数据的编码错误也更容易。

      这种方法并不意味着只有一个模式,而是模式和客户之间存在一对多的关系。 例如,每个MySQL实例可能有100个模式,每个模式处理1000到10000个客户(取决于应用程序). 请注意,通过设计良好的分片实现,您应该能够将客户单独映射到模式。 这允许您将关键客户数据存储在专用模式中,甚至存储在专用节点上。

    • 每个客户的模式。 这可能是MySQL支持的SaaS应用程序中最常见的分片方法。 尤其是那些收入可观的(每月/每位客户10美元以上). 在这个模型中,每个客户的数据都存储在自己的模式(数据库(中。 这使得备份/恢复单个客户变得非常容易。 它允许客户有不同的模式(即e .,添加自定义表). 如果需要,它还允许他们运行不同版本的应用程序。

      这种方法允许应用程序服务器使用代表不同客户连接的不同MySQL用户,这增加了额外的保护级别,防止意外(或有意(访问属于不同客户的数据。 每个客户的模式方法也使得移动碎片更容易,并且限制了维护影响。 这种方法的缺点是开销较高。 它还会导致每个实例有大量的表,并且可能会有更多的文件(这可能很难管理).

    • 每个客户的数据库实例。 通过每个客户拥有一个MySQL实例,您可以实现更好的隔离。 然而,这种方法进一步增加了开销。 最近轻型虚拟化技术和容器的兴起减少了它的使用。
    • 每个客户的操作系统实例/容器。 这种方法允许您进一步改善隔离。 它可以用于任何客户,但也可以应用于模型中的选定客户,该模型对大多数客户使用”每个客户的模式”模型。 具有改进的隔离和更好的性能服务级别协议的专用操作系统实例可能是某些高级客户层的一个特征。

      这种方法不仅允许更好的隔离,还能让你更好地处理异常值。 您可以选择在性价比最高的硬件(或云实例(上运行大多数客户,也可以将一些较大的客户放在性能最高的节点上。

    • 每个客户的环境. 最后,如果您一路走来,您可以为客户构建完全独立的环境。 这包括数据库、应用服务器和其他必需的组件。 如果您需要在客户附近部署应用程序(包括设备模型),或者在客户的数据中心或云提供商部署应用程序,这一点尤其有用。 如果客户的数据必须存储在特定的位置,这也允许您容纳客户。 这通常是由于政府的规定。

      值得注意的是,许多SaaS应用程序,即使每个客户没有一个环境,也有多个独立的环境。 这些通常位于不同的位置或可用性区域。 这种设置允许您将大规模故障的影响仅降低到您的一部分客户。 这避免了客户服务团队负担过重,并允许运营组织专注于修复较小的环境。

    沿着这条路线走得越远—从共享模式到每个客户的环境—自动化程度越高就越重要。 有了共享模式,您通常只需要很少的自动化(以及一些手动设置的环境),并且所有的模式都是预先创建的。 如果客户注册需要设置专用数据库实例或整个环境,则手动实施无法扩展。 对于这种类型的设置,您需要最先进的自动化和编排。

    我希望这能帮助你理解你对MySQL分片模型的选择。 由MySQL支持的SaaS应用程序的每一种不同的分片模型都有优点和缺点。 正如您所看到的,这些方法中有许多需要您在MySQL中处理大量的表—这将是我下一篇文章的主题!

    cs