当前位置: 首页 > 后端技术 > Node.js

MySQL-Scalability2可扩展性策略:自己的钱和脑子自己选

时间:2023-04-03 20:17:43 Node.js

如果只是简单的把应用的所有数据都放在一个MySQL服务器实例上,就没必要谈可扩展性了。但如果业务能够稳定持续增长,那么应用肯定会遇到性能瓶颈。对于很多类型的应用来说,购买更高性能的机器可以解决大部分的性能问题,也就是我们常说的“纵向扩展”或者“向上扩展”。相反的方法是在多台机器上分配任务,这通常被称为“水平扩展”或“向外扩展”。接下来,我们将讨论如何同时使用纵向扩展和横向扩展,以及如何使用集群方法进行扩展。最后,大多数应用程序还会有一些很少或根本不需要的数据。这些数据可以被清理或归档。我们可以将此解决方案称为“缩减”。1向上扩展向上扩展(也称为垂直扩展)意味着购买更强大的机器。这种策略有很多优点:更容易维护和开发,大大节省开销;单台服务器的备份和恢复比较简单,不需要关心一致性;因此,就复杂性的成本而言,大多数时候,向上扩展比向外扩展更简单。另外,不要认为向上扩张会很快走到“尽头”,而要相信技术进步的速度。如今,具有0.5TB内存、32核(或更多)CPU以及更强大I/O性能的商用服务器随处可见。优秀的应用和数据库设计,加上良好的性能优化技巧,已经可以满足大部分商业应用。不幸的是,虽然高性能服务器相对容易获得,但MySQL并没有扩展到相应的规模。为了更好的在大型服务器上运行MySQL,一定要尽可能选择最新的版本。即便如此,目前合理的“收益递减点”机器配置大约是:256GRAM32核CPUPCIe闪存如果继续提升硬件配置,MySQL性能可以提升,但性价比会降低。因此,我们建议,如果系统确实有可能触及可规划性天花板,造成严重的业务问题,那么就不要规划无限向上扩展。对于庞大的应用,短期内可以购买更好的服务器,但最终还是需要横向扩展。2ScaleoutScaleout(也称scaleout或scaleout)策略通常分为三个部分:复制、拆分和数据分片。最常见的横向扩展形式是读写分离。数据通过复制的方式分布到多台服务器上,然后备库用于读查询。此技术适用于以读取为中心的应用程序。另一种更常见的横向扩展方法是将工作负载分布到多个“节点”。接下来我们要了解的主要是这个扩展方法。在此之前,我们先明确下一个节点的概念。在MySQL架构中,一个节点就是一个功能单元。一般我们会用一个服务器作为一个点。但是如果我们考虑节点的高可用,那么一个节点通常可能有以下几种类型:master-master复制双机结构,有一个activeserver和一个passiveserver。一个主数据库和多个备用数据库。一台活动服务器,并使用分布式复制块设备(DRBD)作为备用服务器。基于存储区域网络(SAN)的“集群”。2.1按功能拆分按功能拆分,或按职责拆分,是指不同的节点执行不同的任务。比如你有一个网站,各个部分不需要共享数据,你可以按照网站的功能区域划分。像我们常见的门户网站,通常会将不同的栏目放在一起,但实际上网站新闻、论坛、支持等功能都可以放在一个专门的MySQL服务器上。如图2-12.2所示,数据分片是目前最普遍、最成功的大规模MySQL应用扩展方式。它将数据分成一小块,或者一块块,存储在不同的节点中。在使用分片之前,请记住一个一般原则:除非必要,否则尽量不要分片。在此之前,对于分片,我们只分片我们需要的数据。这里的“所需数据”通常是增长非常大的数据。用户信息等全局数据一般存储在单个节点上,通常是像redis这样的缓存。对于分片,我们通常要考虑以下几个问题:选择合适的分区键(partitionkey)。您需要多个分区键吗?如何处理跨分片查询?如何分片数据、分片和节点?如何在节点上部署分片?如何生成全球唯一ID?2.3通过多实例进行扩展正如上面所说,MySQL不能充分利用现代硬件的性能。当扩展到超过24个CPU内核时,MySQL的性能开始趋于平稳并停止上升。内存超过128G时也是如此。在这种情况下,我们可以通过多实例策略充分发挥硬件的性能。多实例策略的基本思想是:数据分片足够小,可以在每台机器上放置多个分片;每个服务器运行多个实例;每个实例被划分为服务器硬件资源;可以看出,这是scale-up和scale-out的结合。这种方法还通过将每个MySQL实例绑定到特定的CPU内核来优化性能。这种优化有两个主要好处:由于MySQL内部的可扩展性限制,当核心数量较少时,每个核心可以获得更好的性能;当实例在多核上运行线程时,由于需要在多核上同步共享数据,所以会有额外的开销。我们将实例绑定到CPU核心后,就可以减少CPU核心的直接切换和交互。请注意,通过将进程绑定到具有相同物理插槽的内核可以获得最佳结果。3缩减处理不断增长的数据和负载的最简单方法是归档和清理不再需要的数据。这种操纵会产生戏剧性的效果。这种做法不能替代其他策略,但它可以用作争取时间的短期策略,或作为处理大数据量的长期计划之一。在设计归档和清理策略时需要考虑以下几点:对应用程序的影响。设计良好的归档系统可以在不影响事务处理的情况下从负债累累的OLTP服务器中删除数据。要存档的行。考虑可以清理或归档哪些数据。保持数据一致性。当数据之间存在关联时,归档任务系统必须能够保证数据的逻辑一致性。避免数据丢失。归档时,确保归档数据已成功保存,然后删除源数据。取消存档。考虑归档系统中的解档策略。可以通过设置一些检查点让系统检查是否有数据需要归档。如果旧数据不能及时归档和清理,我们也可以通过冷热数据隔离来提高性能,方法如下:将表分成几个部分。拆分大表中的冷热数据,保证加载到内存的数据中热数据的比例;MySQL分区。使用MySQL内置的分区功能可以帮助我们在内存中保留最新的数据;基于时间的数据分区。如果应用程序尽可能不断地有新数据,通常新数据总是比旧数据更活跃。因此,我们可以将新数据原封不动地保存在内存中,通过复制来保证主库出现故障时有备份,而旧数据则放在别处。总结氪金向上,氪脑向外。三思而后行。如果不能分片,尽量不要分片。