了解数据库扩展的不同技术,有助于我们选择适合我们需求和目的的合适策略。
因此,在这篇文章中,我们将展示不同的数据库服务器扩展解决方案和技术,分为读取和写入两大类策略。
读取/加载
为了解决应用程序有时负载过大的问题,我们汇总了三种技术:
缓存
缓存技术将频繁请求的数据或费时的计算操作响应存储在临时内存中。缓存中存储的数据需要根据应用程序的性质进行更改,并且可以通过缓存失效和清除技术进行更新,以保持数据的一致性。可以通过缓存过期时间(TTL)方法或其他依赖于所使用的缓存模式来实现。
使用不同的缓存模式可以作为实施缓存解决方案的策略。Caching aside是针对大量读取并且即使缓存失效也能工作的解决方案。Read-through和Write-through一起使用,这是适用于读取密集型工作负载的良好选择,但如果缓存失败会导致系统故障。Write-back则适用于写入密集型工作负载,并且被各种数据库管理系统实现所使用。
缓存
根据要求,例如需要大量读取、大量写入或二者混合,我们可以决定使用哪种模式以更好应对缓存或数据库故障。
数据库复制
复制是一种工作方式,其中有一个被称为“主数据库”的数据库,所有写入请求都流向该数据库。此外,我们将主数据库制作成精确的副本,作为称为“辅助节点”的新节点副本,仅负责处理读取请求。主数据库不断向从节点提供更新的数据,使得我们在集群中的所有节点之间保持数据一致性。
复制是处理容错和维护CAP定理和系统可扩展性的有效策略。假设其中一个节点故障,我们仍然可以提供服务,因为我们在其他节点中进行了相同的数据复制。此外,在集群中,在主节点故障时,一个节点可以接管并成为主数据库。复制还有助于减少应用程序的延迟,因为我们可以将数据库部署并在不同地区进行数据复制,例如CDN,并且可以轻松地由本地用户访问。
数据库复制
同步和异步
随着节点数量的增加,维护副本节点数据的一致性变得更加复杂。根据需求,这个问题可以通过使用同步或异步复制策略来解决。
同步策略的优势在于延迟为零,并且数据始终保持一致,但劣势是性能受到影响,因为需要等待所有副本更新并被发行者确认。在异步策略中,写操作变得更快,因为主节点不需要等待确认,但如果某个副本未能更新数值,则会出现不一致状态的问题。
请记住,并没有万能策略,最佳策略取决于我们的需求。在一致性、可用性或分区(CAP定理)之间必须做出权衡。CAP定理指出我们每次只能保证其中两个。
索引
索引用于定位和快速访问数据,提高数据库活动的性能。一个数据库表可以与之关联的一个或多个索引。
通过索引,查询性能得到提升,数据检索速度更快;索引增强了数据访问效率,减少了检索数据的I/O次数;索引优化了数据排序,因为数据库不需要对整个表进行排序,只需对相关行进行排序;索引使得在数据量增加的情况下仍然能够保持数据一致性;此外,索引还确保了数据库的完整性,避免存储重复数据。
但索引的缺点也很明显——索引需要更多的存储空间,增加了数据库的大小。同时,在表中进行添加、删除和修改时也会增加维护开销。在特定查询或应用程序中选择适当的索引可能会比较困难。
写入
对于频繁向数据库写入大量数据的应用程序,我们可以采用分片(sharding)和NoSQL作为策略。
分片
分片或数据分区允许将大型数据库数据拆分为更小、更快、更易管理的部分,将数据库拆分为多个主要数据库。有两种类型的分片,垂直分片和水平分片。
分片的优势在于查询优化,提供更好的性能和减少延迟。它使得用户数据可以跨不同地理位置进行访问,从而可以更快地为特定地区的用户提供服务。此外,它还避免了单点故障的问题。
但分片的一个缺点是当我们没有正确地将数据在分区之间进行平衡时,可能会导致某些分区负载过重。根据所选择的策略不同,可能会出现一些包含大量数据的分区和一些包含较少数据的分区,从而导致对于大型分区上的查询变慢。另一个缺点是一旦实施了切片策略并将数据拆分到不同的数据库中后,很难回退并恢复到之前无切片策略时的状态。
对于数据进行切片操作可以选择逻辑切片或物理切片。逻辑切片是指在同一台物理机器上具有不同的数据子集,而物理切片可以在一台物理机器上拥有多个分区子集。
在进行数据切片时,我们可以选择算法切片或动态切片。存在不同的算法和动态切片技术,其中基于键的、基于范围的和基于目录的分片是最常用的方法。
垂直分片
对于垂直分片,我们将每个表放置在不同的机器上。例如,用户表、日志表或评论表都放置在不同的机器上。当查询倾向于仅返回数据的子集时,垂直分片是有效的。例如,如果某些查询仅请求名称,而其他查询仅请求地址,则可以将名称和地址分片到单独的服务器上。
垂直分片
水平分片
如果我们有一个非常大的单个表,我们可以应用水平分片。我们将单个表中的一部分相关数据拆分到多台机器上。当查询倾向于返回经常分组的行的子集时,水平分片是有效的。例如,基于短日期范围筛选数据的查询非常适合水平分片,因为日期范围将必然限制查询到仅一部分服务器上。
水平分片
NoSQL
NoSQL不是一个关系型数据库,本质上是一个键值对模型。键值对模型天然能够轻松地在多台不同的机器上进行自动扩展。NoSQL分为四个主要类别,列式存储将数据按列族存储,图形存储将数据存储为节点和边,键值存储将数据存储为键值对,文档存储将数据存储为半结构化文档。
NoSQL 数据库种类
NoSQL数据库允许动态模式,可以在不改变模式结构的情况下适应变化。此外,它提供了水平可扩展性,通过向数据库集群添加更多节点来扩展。它还被设计为高可用性,能够自动处理节点故障,并在集群中的多个节点之间进行数据复制。
与关系型数据库相比,这种非关系型数据库具有多个优点,如可扩展性、灵活性和成本效益。然而,它们也有一些缺点,例如缺乏标准化、缺乏ACID兼容性以及对复杂查询的支持不足。
总结
在本文中,我们介绍了处理数据库可扩展性时可以实施的策略。
我们将策略分为读取和写入两个方面。对于读取方面,我们可以应用不同的缓存机制,使用主副本数据库进行复制,以及实施索引来定位和快速访问数据。对于写入可扩展性,有分片或NoSQL等策略,它们都有各自的优点和缺点。
最后,请记住,没有完美的解决方案,我们需要了解自己的需求,并在选择最佳策略时进行权衡。
作者 | Jailson Evora