• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

分布式数据 : 分区

武飞扬头像
牧心.
帮助1


对于非常大的数据集,或非常高的吞吐量,仅仅进行复制是不够的:我们需要将数据进行分区(partitions),也称为分片(sharding)。

1. 分区的目的/必要性

分区的主要目的是提高数据处理和查询的性能以及提高数据的可用性和可扩展性,具体包括以下几个方面:

  • 改善查询性能:将数据分割成多个部分可以将查询分布到不同的分区中进行并行处理,从而提高查询性能。

  • 提高可用性:将数据复制到多个分区中可以提高数据的冗余度,从而提高数据的可用性。当某个分区不可用时,可以从其他分区中恢复数据。

  • 提高可扩展性:将数据分割成多个部分可以将数据存储在多个节点中,从而提高数据的扩展性。当需要处理更多的数据时,可以向集群中添加更多的节点。

  • 降低成本:通过分区和复制可以提高数据处理和查询的性能和可用性,从而避免了进行性能优化和数据备份等方面的成本。此外,将数据分割成多个部分可以在硬件资源和存储成本之间进行更好的平衡。

总之,数据分区是设计数据密集型应用程序时的一个重要组成部分,它可以提高性能、可用性和可扩展性,并且可以降低成本。


2. 数据分区的方法

问:假设你有大量数据并且想要分区,如何决定在哪些节点上存储哪些记录呢?

2.1 按键的范围分区

按键的范围分区也称为基于范围的分区。该分区策略根据键的值的大小将数据分成若干个范围,并将每个范围分配给不同的节点或分区。例如,可以将一个范围从1到1000的键分配给第一个节点,范围从1001到2000的键分配给第二个节点,以此类推。

优点:

  • 数据访问非常高效,因为范围内的键值只会存储在一个节点或分区上。
  • 适合有序范围查询,因为每个节点只存储一定范围内的数据。

缺点:

  • 键的范围不一定均匀分布,因为数据也很可能不均匀分布。数据分布不均衡,一些节点可能会收到过多的请求,导致负载不平衡。
  • 节点的数量不能太多或太少,否则会浪费资源或导致节点过于繁忙。

2.2 按键的散列分区

按键的散列分区也称为基于散列的分区。该分区策略通过对键进行散列,将数据散列到不同的节点或分区上。例如,可以使用哈希函数将键值转换为一个数字,然后将该数字模除节点或分区的数量,以确定键值所在的节点或分区。

优点:

  • 数据分布均衡,每个节点或分区都有相同数量的键值。
  • 节点或分区的数量可以随时进行扩展或缩减,以适应业务增长或变化。
  • 适合随机查询,因为键值可以均匀地分布在不同的节点或分区上。

缺点:

  • 不适合范围查询,因为相同范围内的键值可能分布在不同的节点或分区上,需要将查询结果合并。
  • 散列函数的选择和实现会影响数据分布的质量和性能。如果选择不合适的散列函数,可能会导致数据分布不均衡或冲突较多。

综上所述,按键的范围分区和按键的散列分区都是常见的数据分区策略,各有优缺点。根据业务需求和数据特征选择合适的分区策略非常重要。

2.3 数据倾斜和消除热点

在分布式系统中,数据倾斜是指数据在不同节点或分区之间的分布不均衡,导致一些节点或分区负载过重,而其他节点或分区闲置。当数据倾斜达到一定程度时,会导致系统性能下降、响应时间变长、资源浪费等问题。为了解决数据倾斜问题,可以采取消除热点的策略。

消除热点的策略可以分为两类:

2.3.1 预分区

预分区是指在系统启动或数据导入之前,就将数据预先分配到不同的节点或分区上。通过预分区可以确保数据分布均匀,避免出现数据倾斜的问题。预分区的缺点是无法适应数据访问模式的变化,例如随着时间的推移,某些数据可能会变得热门,而其他数据可能会变得冷门,预分区无法自适应这种变化。

2.3.2 动态分区

动态分区是指在系统运行时,根据节点或分区的负载情况动态调整数据的分配策略。例如,当某个节点或分区的负载过重时,可以将一部分数据迁移到其他节点或分区上,以平衡负载。动态分区需要实时监控节点或分区的负载情况,并在需要时进行数据迁移。动态分区的优点是可以适应数据访问模式的变化,缺点是数据迁移会增加系统开销,可能会影响系统性能和响应时间。

综上所述,消除热点是解决数据倾斜问题的关键策略之一。根据系统需求和数据特征,可以选择预分区或动态分区的策略,或者综合使用两种策略。


3. 次级索引

次级索引是指在数据库中为某些字段或属性建立的索引,用于加速特定的查询或过滤操作。次级索引通常是在主索引(如基于主键的索引)的基础上建立的,可以加速对非主键字段的查询和排序操作。次级索引可以分为按文档的二级索引和根据关键词的二级索引两种类型。

3.1 按文档的二级索引

按文档的二级索引是指为文档中的某些属性或字段建立的索引,例如基于时间戳的索引、基于地理位置的索引等。这种索引通常适用于需要按照某些属性或字段进行查询或过滤的场景,例如查询最近一段时间内的数据或在某个地理位置范围内的数据等。

在这种索引方法中,每个分区是完全独立的:每个分区维护自己的二级索引,仅覆盖该分区中的文档。它不关心存储在其他分区的数据。无论何时您需要写入数据库(添加,删除或更新文档),只需处理包含您正在编写的文档ID的分区即可。出于这个原因,文档分区索引也被称为本地索引(local index)。

3.2 根据关键词的二级索引

根据关键词的二级索引是指为文档中的某些关键词或词组建立的索引,例如基于全文搜索的索引、基于标签或分类的索引等。这种索引通常适用于需要进行全文搜索或基于关键词进行查询或过滤的场景,例如搜索某个关键词或者某个标签下的所有文档等。

我们可以构建一个覆盖所有分区数据的全局索引,而不是给每个分区创建自己的次级索引(本地索引)。但是,我们不能只把这个索引存储在一个节点上,因为它可能会成为瓶颈,违背了分区的目的。全局索引也必须进行分区,但可以采用与主键不同的分区方式。

关键词分区的全局索引优于文档分区索引的地方点是它可以使读取更有效率:不需要分散/收集所有分区,客户端只需要向包含关键词的分区发出请求。全局索引的缺点在于写入速度较慢且较为复杂,因为写入单个文档现在可能会影响索引的多个分区(文档中的每个关键词可能位于不同的分区或者不同的节点上) 。


4. 分区再平衡

随着时间的推移,数据库会有各种变化:

  • 查询吞吐量增加,所以您想要添加更多的CPU来处理负载。
  • 数据集大小增加,所以您想添加更多的磁盘和RAM来存储它。
  • 机器出现故障,其他机器需要接管故障机器的责任。

所有这些更改都需要数据和请求从一个节点移动到另一个节点。 将负载从集群中的一个节点向另一个节点移动的过程称为再平衡(reblancing)。

无论使用哪种分区方案,再平衡通常都要满足一些最低要求:

  • 再平衡之后,负载(数据存储,读取和写入请求)应该在集群中的节点之间公平地共享。
  • 再平衡发生时,数据库应该继续接受读取和写入。
  • 节点之间只移动必须的数据,以便快速再平衡,并减少网络和磁盘I/O负载。

4.1 固定数量的分区

有一个相当简单的解决方案:创建比节点更多的分区,并为每个节点分配多个分区。 例如,运行在10个节点的集群上的数据库可能会从一开始就被拆分为1,000个分区,因此大约有100个分区被分配给每个节点。

现在,如果一个节点被添加到集群中,新节点可以从当前每个节点中窃取一些分区,直到分区再次公平分配。

只有分区在节点之间的移动。分区的数量不会改变,键所指定的分区也不会改变。唯一改变
的是分区所在的节点。

原则上,您甚至可以解决集群中的硬件不匹配问题:通过为更强大的节点分配更多的分区,可以强制这些节点承载更多的负载。

在这种配置中,分区的数量通常在数据库第一次建立时确定,之后不会改变。

如果数据集的总大小难以预估(例如,如果它开始很小,但随着时间的推移可能会变得更大),选择正确的分区数是困难的。由于每个分区包含了总数据量固定比率的数据,因此每个分区的大小与集群中的数据总量成比例增长。如果分区非常大,再平衡和从节点故障恢复变得昂贵。但是,如果分区太小,则会产生太多的开销。当分区大小“恰到好处”的时候才能获得很好的性能,如果分区数量固定,但数据量变动很大,则难以达到最佳性能。

4.2 动态分区

对于使用键范围分区的数据库,具有固定边界的固定数量的分区将非常不便:如果出现边界错误,则可能会导致一个分区中的所有数据或者其他分区中的所有数据为空。手动重新配置分区边界将非常繁琐。

出于这个原因,按键的范围进行分区的数据库(如HBase和RethinkDB)会动态创建分区。当分区增长到超过配置的大小时(在HBase上,默认值是10GB),会被分成两个分区,每个分区约占一半的数据。与之相反,如果大量数据被删除并且分区缩小到某个阈值以下,则可以将其与相邻分区合并。

动态分区的一个优点是分区数量适应总数据量。如果只有少量的数据,少量的分区就足够了,所以开销很小;如果有大量的数据,每个分区的大小被限制在一个可配置的最大值。

需要注意的是,一个空的数据库从一个分区开始,因为没有关于在哪里绘制分区边界的先验信息。数据集开始时很小,直到达到第一个分区的分割点,所有写入操作都必须由单个节点处理,而其他节点则处于空闲状态。为了解决这个问题,HBase和MongoDB允许在一个空的数据库上配置一组初始分区(这被称为预分割(pre-splitting))。在键范围分区的情况中,预分割需要提前知道键是如何进行分配的。

动态分区不仅适用于数据的范围分区,而且也适用于散列分区。

4.3 按节点比例分区

通过动态分区,分区的数量与数据集的大小成正比,因为拆分和合并过程将每个分区的大小保持在固定的最小值和最大值之间。另一方面,对于固定数量的分区,每个分区的大小与数据集的大小成正比。在这两种情况下,分区的数量都与节点的数量无关。

Cassandra和Ketama使用的第三种方法是使分区数与节点数成正比——换句话说,每个节点具有固定数量的分区。在这种情况下,每个分区的大小与数据集大小成比例地增长,而节点数量保持不变,但是当增加节点数时,分区将再次变小。 由于较大的数据量通常需要较大数量的节点进行存储,因此这种方法也使每个分区的大小较为稳定。当一个新节点加入集群时,它随机选择固定数量的现有分区进行拆分,然后占有这些拆分分区中每个分区的一半,同时将每个分区的另一半留在原地。


5. 总结

在文中,我们探讨了将大数据集划分成更小的子集的不同方法。数据量非常大的时候,在单台机器上存储和处理不再可行,则分区十分必要。分区的目标是在多台机器上均匀分布数据和查询负载,避免出现热点(负载不成比例的节点)。这需要选择适合于您的数据的分区方案,并在将节点添加到集群或从集群删除时进行再分区。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfhfig
系列文章
更多 icon
同类精品
更多 icon
继续加载