- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个大型 MongoDB 集合,我们希望开始分片。该集合有 3.4B 条记录,大小约为 14.6TB(磁盘上压缩了 5.3TB)。该集合通常每小时写入约 5M,但我们预计这一数字将逐年增长。该集合的索引大小约为 220GB。
所有记录都有一个 feedId
,所有查询都将针对属于特定 feedId
的记录。目前大约有 200 个独特的 feedId
值,但每个值的分布是高度非线性的。在低端,一些 feedId 每天可能只能看到几十条记录。另一方面,前 5 个 feedId 约占数据集的 75%。
记录也有一个时间戳
,查询将始终针对给定的日期范围。 timestamp
字段或多或少是单调的。
feedId
和 timestamp
上已经存在复合索引。
这个集合的典型工作集只是最近几周的数据,因此只占实际数据的很小一部分。对该数据的查询必须非常快,对历史数据的较慢查询是可以接受的。因此,我们计划使用“标签”和/或“区域”将较旧的数据移动到具有更大 HDD 的节点,并将具有 SSD 的节点用于“热”数据。
基于这些因素,使用分片键{feedId: 1, timestamp: 1}
是否合理?我的感觉是,由于 feedId
的非线性和 timestamp
的单调性,它可能会导致“热”节点。向 key 添加“散列”字段会使它变得更好/更坏吗?
最佳答案
所以让我们一点一点地来吧!
The collection has 3.4B records and is ~14.6TB in size (5.3TB compressed on disk)
分片的性质决定了在第一次通过时就做好这一点很重要。我将在这里详细介绍,但 TL;DR 是:
mongodump --query
)提取到暂存集群(例如使用 mongorestore
)现在,让我们深入研究:
There are currently ~200 unique feedId values, but the distribution across each value is highly non-linear. On the low end, some feedId's may only see dozens of records per day. On the other hand, the top 5 feedId's make up ~75% of the dataset.
因此,支持大量查询的一个字段的频率非常低。如果您只是在此字段上进行分片,您肯定会看到热点 1
Records also have a timestamp and queries will always be for a given date range. The timestamp field is more-or-less monotonic.
所以另一个字段支持您的大部分查询,但也不适合分片 2
Records also have a timestamp and queries will always be for a given date range. The timestamp field is more-or-less monotonic.
这对我来说有点暗示您要查询的主要字段是时间。在给定的时间 内,给我具有指定 feedID 的文档。您还将获得有针对性的查询,因为您经常查询分片键(例如,在某个时间范围内,或者在某个时间范围内 + feedId
)。 3
这也支持你的分区想法:
As such, we're planning to use "tags" and/or "zones" to move older data to nodes with larger HDD's and use nodes with SSD's for the "hot" data.
通过分区,您可以使用分片键中的任何键,只要您包含指向该键的整个 前缀即可。所以 { feedId: 1, timestamp: 1 }
将主要支持 feedId 和 时间戳上的区域,这不是您想要的。 4
仅基于这一点,我敢说 { timestamp : 1, feedId : 1 }
会是一个不错的选择。您的测试需要研究的是是否添加低频场到单调递增场提供良好的 block 分布。
现在,就散列而言:
Would adding a "hashed" field to the key make it better/worse?
如果您的意思是,您的文档已经有一些散列字段,那么您绝对可以添加它只是为了随机性。但如果您谈论的是散列分片键,那就另当别论了。 5
区域和散列分片键不能一起玩。散列分片键的性质意味着 block 范围(因此区域)代表散列分片键值。因此,即使您有两个文档的值彼此非常接近,它们也很可能以完全不同的 block 结束。因此,在一系列散列分片键值上创建区域可能不会执行您想要的操作。您可以做一些事情,比如使用带散列分片的区域将整个集合移动到集群中的分片子集,但这不是您想要做的。 6
现在您可能会遇到一个关键问题 - 您有一个庞大 集合。您选择的分片键可能会导致 MongoDB 尝试将您的数据分成 block 的初始拆分问题。请查看我们文档中的以下部分:Sharding an Existing Collection .那里有一个公式供您使用来估计您的分片键可以支持配置的 block 大小(默认为 64MB)的最大集合大小。我猜测您最初需要将 block 大小增加到 128MB 或 256MB。这仅是初始 分片过程所必需的。之后,您可以将 block 大小减小回默认值,让 MongoDB 处理其余部分。
请注意,这会对性能产生影响。您将有 block 在分片之间迁移,加上实际 block 拆分的开销。我建议您发布到我们的 Google Group在此处获取更具体的指导。
关于MongoDB 分片键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671158/
我在 php 方面遇到了一个小问题,我发现很难用语言来解释。我有一个包含键值的关联数组。我想制作一个函数(或者如果已经有一个函数),它将一个数组作为输入并删除重复项,但两种方式都是如此。 例如: 在我
我有一个在系统托盘中运行的应用程序,是否可以允许用户通过 C# 中的 Windows 键 + 键 恢复该应用程序? 谢谢 最佳答案 是的,使用 Windows API。我认为 Windows 键与 C
我正在使用 Waterline通过 Sails 查询 MySQL 数据库。我找到了 2 种方法。 不知道哪个更好? 顺便问一下,如何处理这两种情况的错误? 1. Model.findOne().whe
我正在尝试测试是否按下了 Alt 键。 我的支票类似于: private void ProcessCmdKey(Keys keyData) { if (keyData == Keys.Alt) {
我正在使用 Selenium WebDriver 和 Ruby 进行自动化测试。我需要点击一个按钮。我无法通过 id 或 css 或 xpath 获取按钮元素,因为按钮是透明的。我想使用 Tab 和
我是 IntelliJ 的新手,我看到一个启动提示说,“任何工具窗口中的 ⎋ 键都会将焦点移动到编辑器。”但是,我不知道⎋键是什么。我一直在编程很长时间。我的键盘上可能有一个我多年来一直错过的键吗?
我使用 OMDB API 创建了一个电影搜索页面。我遇到的问题是,如果我搜索一部包含多个单词的电影,此 API 会出错,因为 API 的 URL 必须在 URL 中的每个单词之间有 + 键。所以我想知
我已经用 Elasticsearch 玩了大约一天了,所以我非常陌生。我正在尝试 POST/import 一个简单的文件: { "compression" : "none", "com
enter image description here 在此示例中,要记录带有“title”和“director”键的属性值,使用 obj[key]。因为我们已经处于对象的执行上下文中:在本例中是电
我是新开类。 我使用新的电子邮件 ID 和密码在 openshift 上创建了一个项目。让我们称之为 firstApp 。我做了 rhc 设置和我的 ssh key 与我的项目相关联。 我的 frie
当我使用 Jackson 反序列化 json 字符串时,我通常不想创建所有 bean 类的属性,而且我只需要一些 json 字符串的字段,其他字段我不需要。所以我经常只在我需要的 java 类 bea
我想编写一个带有 keys/keys* 的规范,但能够内联值规范,但不支持 by design ,我明白了其背后的原因。然而,有时,本地图存在特定上下文时,您确实希望(或者只是通过遗留或第三方)键和值
my %fruit_colors = ("apple", "red", "banana", "yellow"); my @fruits = keys %fruit_colors; my @colors
我正在使用 vb.net 2008 和 DataGridView。我正在寻找允许我将 enter 键移动到右侧的下一列而不是在保持在同一列时向下移动一行的代码。 最佳答案 如果您正在确认编辑,只需移动
我刚刚开始学习编码,我遇到了这个我无法理解的问题。 “我们将添加的第二个函数称为搜索,它将以名字作为参数。它将尝试将收到的名字与我们 friend 联系人列表中的任何名字相匹配。如果它找到匹配项,就会
我已经在 Python 中运行了下面的代码,以从文本文件中生成单词列表及其计数。我该如何从“Frequency_list”变量中过滤掉计数为 1 的单词? 另外,如何将底部的打印语句循环导出到CSV
我正在尝试 XSLT 中的查找表示例,但无法使其正常工作
是否可以在 Javascript/Typescript 中编写一个将参数名称/键作为字符串返回的函数? function foo(arg) {...} let user = new User(); f
我正在尝试创建一个带有键/值的对象,但是当我看到该对象时,键没有正确填充.. 我希望键是 - 0,1,2,3 但它显示“索引”作为键。 > categories = ["09/07/2016 00:0
将 Android Studio 从 1.5 升级到 2.0 后,模拟器(现在版本为 25.1.1,我在其上配置了模拟硬件键盘)不再将 [Esc] 键识别为等同于 [Back] 按钮。 如何恢复这个有
我是一名优秀的程序员,十分优秀!