当前位置: 首页 > 科技观察

分区如何在分片数据库系统中提高性能

时间:2023-03-17 01:08:16 科技观察

分区如何提高分片数据库系统的吞吐量和性能。然而,本文将介绍另一种常用技术,即分区,它为分片数据库提供了性能和管理方面的额外优势。它还将描述如何有效地处理查询和摄取工作负载的分区,以及如何管理读取。需要完全不同的冷热分区。分片与分区分片是一种在分布式数据库系统中拆分数据的方法。每个分片中的数据不必共享CPU或内存等资源,可以并行读取或写入。图1是分片数据库的示例。例如,美国50个州的销售数据分为4个分片,每个分片包含12或13个州的数据。通过为每个分片分配一个查询节点,可以将读取所有50个状态的作业拆分到这四个并行运行的节点上,与一个节点读取所有50个状态的设置相比,其执行速度将快四倍。图1销售数据分为四个分片,每个分片分配给一个查询节点。分区是一种将每个分片中的数据拆分为不重叠的分区以进行进一步并行处理的方法。这减少了不必要数据的读取,并允许有效地执行数据保留策略。在图2中,每个分片的数据按销售日进行分区。如果需要创建特定日期(例如2022年5月1日)的销售报表,查询节点只需要读取其对应分区2022.05.01的数据即可。图2.每个分片的销售数据进一步拆分为不重叠的日期分区。本文的其余部分将重点关注分区的影响,并将了解如何有效地管理冷热数据查询和摄取工作负载的分区。.分区效果数据分区的三个最常见的好处是数据修剪、节点内并行性和快速数据删除。数据修剪一个数据库系统可能包含几年的数据,但大多数查询只需要读取最近的数据(例如“最近三天有多少订单?”)。将数据划分为不重叠的分区,如图2所示,可以轻松跳过整个越界分区,只读取和处理相关的非常小的数据集以快速返回结果。节点内并行多线程和流??式数据对于数据库系统充分利用可用的CPU和内存并实现最佳性能至关重要。将数据分成小分区可以更容易地实现每个分区执行一个线程的多线程引擎。对于每个分区,可以生成更多线程来处理该分区内的数据。了解分区统计信息(例如大小和行数)将有助于将最佳数量的CPU和内存分配给特定分区。快速数据删除许多企业只保留最近的数据(例如,最近三个月)并希望尽快删除旧数据。通过在不重叠的时间窗口上对数据进行分区,删除旧分区变得像删除文件一样容易,而无需重新组织数据和中断其他查询或摄取活动。如果必须保留所有数据,本文后面的部分将介绍如何对新旧数据进行不同的管理,以确保数据库系统在所有情况下都提供出色的性能。存储和管理分区针对查询工作负载进行了优化分区已经包含一部分数据,因此不希望将分区存储在许多较小的文件中(或者在内存数据库的情况下为块)。一个分区应该只包含一个或几个文件。最小化分区中的文件数量有两个重要的好处。它既减少了读取数据以执行查询的I/O操作,又改进了数据编码/压缩。改进的编码反过来又降低了存储成本,更重要的是,通过读取更少的数据提高了查询执行速度。针对摄取工作负载优化Naive摄取。为了将一个分区的数据保留在一个文件中,以方便上述的读取优化,每次摄取一组数据,都必须将其解析并拆分到正确的分区中,然后合并到现有文件中,以供其使用相应的分区,如图3所示。由于I/O的高成本以及对分区数据的混合和编码,将新数据与现有数据合并的过程通常需要时间。这将导致向客户端返回数据已成功摄取的响应以及对新摄取数据的查询的长时间延迟,因为它不会立即在存储中可用。图3原始摄取,其中新数据立即与现有数据合并到同一文件中低延迟摄取。为了保持每次摄取的低延迟,该过程可以分为两个步骤:摄取和压缩。摄取在摄取步骤中,摄取的数据被拆分并写入其自己的文件,如图4所示。它不会与分区的现有数据合并。一旦摄取的数据成功持久化,摄取客户端将收到成功信号,新摄取的文件将可用于查询。如果摄取率很高,分区中会堆积很多小文件,如图5所示。在这个阶段,需要从分区中获取数据的查询必须读取分区的所有文件。当然,这对于查询性能来说并不理想。下面描述的压缩步骤将这种文件累积保持在最低限度。Figure4Writenewlyingesteddatatonewfiles图5在高摄取数据工作量下,一个分区会积累很多文件查询性能和压缩。例如,图6显示将分区2022.05.01中的所有文件合并为一个文件,将分区2022.05.02中的所有文件合并为两个文件,每个文件小于100MB。关于压缩频率和压缩文件大小的决定因系统而异,但共同的目标是通过减少I/O(即文件数量)并使文件足够大以有效压缩来保持高查询性能。图6将一个分区的多个文件压缩成一个或多个文件热分区与冷分区经常被查询的分区称为热分区,而很少被读取的分区称为冷分区。在数据库中,热分区通常是包含最近数据的分区,例如最近的销售日期。冷分区通常包含不太可能被读取的旧数据。此外,当数据变旧时,通常会以更大的块查询,例如按月甚至按年。下面是一些示例,可以清楚地将数据从热到冷分类:热:本周的数据。不太热:前几周但当月的数据。冷:前几个月但当年的数据。更冷:去年和更早的数据。为了减少冷热数据之间的歧义,需要找到两个问题的答案。首先,需要数据来量化热、不太热、冷、更冷,甚至可能更冷。其次,需要考虑读取冷数据时如何实现更少的I/O。每个文件代表一天的数据分区,一个人不想为了获得去年的销售额而读取365个文件。分层分区如图7所示,分层分区为这两个问题提供了答案。一周中每一天的数据都存储在其自己的分区中。该月前几周的数据按周细分。今年前几个月的数据按月细分。较旧的数据按年份细分。可以通过定义活动分区而不是当前日期分区来放宽模型。活动分区之后到达的所有数据将按日期分区,而活动分区之前的数据将按周、月和年分区。这允许系统根据需要保留尽可能多的最近使用的小分区。尽管本文中的所有示例都按时间对数据进行分区,但只要可以为分区及其层次结构定义表达式,非时间分区的工作方式类似。图7分层分区分层分区减少了系统中的分区数量,使其更易于管理,并减少了查询更大和更旧的块时需要读取的分区数量。分层分区的查询过程与非分层分区相同,因为它会应用相同的数据剪枝策略来只读相关分区。摄取和压缩过程稍微复杂一些,因为在定义的层次结构中组织分区更加困难。聚合分区许多企业不想保留旧数据,而是希望聚合数据,例如每个月的订单数和每个产品的总销售额。这是通过聚合数据并按月对其进行分区来支持的。然而,由于聚合分区存储聚合数据,它们将具有与非聚合分区不同的模式,这将导致额外的摄取和查询工作。有不同的方法来管理这些冷的和聚合的数据,但它们是未来的大话题。文章标题:分片数据库系统中的性能分区,作者:NgaTran