当前位置 博文首页 > weixin_ccjz9527的博客:用于SaaS的MySQL共享模型
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应用程序,即使每个客户没有一个环境,也有多个独立的环境。 这些通常位于不同的位置或可用性区域。 这种设置允许您将大规模故障的影响仅降低到您的一部分客户。 这避免了客户服务团队负担过重,并允许运营组织专注于修复较小的环境。
沿着这条路线走得越远—从共享模式到每个客户的环境—自动化程度越高就越重要。 有了共享模式,您通常只需要很少的自动化(以及一些手动设置的环境),并且所有的模式都是预先创建的。 如果客户注册需要设置专用数据库实例或整个环境,则手动实施无法扩展。 对于这种类型的设置,您需要最先进的自动化和编排。
我希望这能帮助你理解你对MySQL分片模型的选择。 由MySQL支持的SaaS应用程序的每一种不同的分片模型都有优点和缺点。 正如您所看到的,这些方法中有许多需要您在MySQL中处理大量的表—这将是我下一篇文章的主题!
cs