持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
TokuMX 分区和分片的区别
TokuMX 中的一个特性——分区集合—,旨在让处理时间序列数据变得更容易和更快,在使用过程中用户可能不会立即理解对集合进行分区和对集合进行分片之间的区别。在这篇文章中,我希望能分享一下自己的理解。
从表面上看,对集合进行分区和对集合进行分片看起来很相似。这两个操作都会收集一个集合并将其分解为更小的部分,以获得一些性能优势。此外,在讨论其他技术时,这些术语有时可以互换使用。但对于 TokuMX 来说,这两个功能在目的和实现上大不相同。在描述每个特性的目的和实现时,我希望澄清这两个特性之间的区别。
分片
分片的目的是将一个集合分布在多台机器上(即“横向扩展”),以便分布对集合的写入和查询。主要思想是,对于大数据,单台机器只能做这么多。不管你的一台服务器有多强大,它仍然会受到一些资源的限制,无论是 IOPS、CPU 还是磁盘空间。因此,为了获得更好的集合性能,可以使用分片将集合分布到多台服务器上,从而通过增加硬件数量来提高性能。
要执行这些任务,分片集合应该在分片之间具有相对均匀的分布。因此,它应该具有以下属性:
- 用户的写入应该分布在机器(或分片)之间。毕竟,如果所有写入都针对单个分片,那么它们就不是分布式的,我们也没有扩展
- 为了保持数据分布相对均匀,如果发现某个分片的数据过多或过少,后台进程会在分片之间迁移数据
由于这些属性,每个分片都包含集合数据的随机子集。
分区
分区的目的是将集合分成更小的集合,以便可以非常有效地删除大块数据。一个典型的例子是为网站保留 6 个月的滚动期日志数据。另一个例子是保留最近 14 天的 oplog 数据,就像我们在 TokuMX 1.4 中通过分区所做的那样。在此类示例中,通常只有一个分区(最新的一个)正在获取新数据。我们会定期但不经常地删除最旧的分区以回收空间。对于日志数据示例,每月一次我们可能会丢弃一个月的数据。对于 oplog,我们每天丢弃一天的数据。
为了执行这些任务,我们不关心负载分配,因为几乎所有的写入通常都到最后一个分区。我们不会在机器上分散分区。使用分区,每个分区都保存连续范围的数据(例如,2 月份的所有数据),而使用分片,每个分片都保存来自整个键空间的小随机数据块。
尽管如此,在考虑分区集合和分片集合的模式设计时仍然存在相似之处。就查询而言,设计分区键与设计分片键有相似之处。如果分片集合上的查询针对单个分片,则它们的性能会更好。同样,如果分区集合上的查询针对单个分区,则它们的性能会更好。不能将查询视为分片和分区集合的“分散/聚集”。
希望本文能阐明分区集合和分片集合之间的区别。