处理 500GB MongoDb 数据库的专业架构
Professional architecture to handle a 500GB MongoDb database
我们有一个大型数据库,我想解释一下我们的设置有多基础。所以,我想知道如果你不是我们,你的架构是什么。
- 560GB 是 MongoDb 的 /data/ 文件夹的总大小(因此纯数据大小要低得多)
- 数据库服务器和 Web 服务器托管在单个专用服务器上
- 不存在 SSD
- OS 是 Windows 服务器 2012
- MongoDb 是 运行 作为单个实例,只是作为一个 EXE 文件
- 据估计,平均每分钟大约有 50 个 findAndModify、20 个 INSERT 和 10 个 GET 查询
- 一些 INSERT 包含大约 1MB 的大型文档
- 数据库中有2600个集合
- 一些集合将用于存储大型文档 - 大小在 10kb 到 600kb 之间 - 在极少数情况下会更高
- 索引可用于两个字符串键
- CPU 使用率约为 6%,RAM 几乎可用。总内存 16GB,已用 4GB
现在我们遇到了一些问题,尤其是在 I/O 速度方面。插入性能令人满意,但更新和查询性能较差。将对包含 3M 文档的集合进行一些查询,这解释了为什么它很差。
所以我们正在寻找解决方法。您有什么建议,请告诉我们什么是更高效的架构。请考虑您的建议中的预算。我们都知道 10 个独立的 SSD 服务器将是一个很好的解决方案。
我们目前的选择是:
- 添加第二个 SSD HDD
- 添加集群linux数据库专用服务器-旋转磁盘HDD
- 分片数据库 VPS
- 让我们知道其他选项
任何建议,我们的错误提醒和提示都会很棒。
========================
回答?
正在编制索引!索引错误是关键问题。我们修改了所有索引键,一切都解决了。现在 RAM 使用 100%,性能非常好。我们听到了索引,我们说没问题!但是,需要多加注意。
我从未在 Windows 上使用过 MongoDB,但我会更改两件事:
- MongoDB 喜欢 SSD。将您的数据移动到一个
- 考虑将网络和 MongoDB 拆分到两个服务器
在 Linux 系统上只使用 4GB RAM 会很奇怪,但我不知道 Windows。
我不认为分片是个好主意,而且对于同一个数据库中的 2600 个集合,这会有点复杂。如果您要 运行 阅读它,副本集可能是一个解决方案。
另一种选择是将 2600 个集合拆分到多个数据库中,以便为每个数据库获取写锁。
我们有一个大型数据库,我想解释一下我们的设置有多基础。所以,我想知道如果你不是我们,你的架构是什么。
- 560GB 是 MongoDb 的 /data/ 文件夹的总大小(因此纯数据大小要低得多)
- 数据库服务器和 Web 服务器托管在单个专用服务器上
- 不存在 SSD
- OS 是 Windows 服务器 2012
- MongoDb 是 运行 作为单个实例,只是作为一个 EXE 文件
- 据估计,平均每分钟大约有 50 个 findAndModify、20 个 INSERT 和 10 个 GET 查询
- 一些 INSERT 包含大约 1MB 的大型文档
- 数据库中有2600个集合
- 一些集合将用于存储大型文档 - 大小在 10kb 到 600kb 之间 - 在极少数情况下会更高
- 索引可用于两个字符串键
- CPU 使用率约为 6%,RAM 几乎可用。总内存 16GB,已用 4GB
现在我们遇到了一些问题,尤其是在 I/O 速度方面。插入性能令人满意,但更新和查询性能较差。将对包含 3M 文档的集合进行一些查询,这解释了为什么它很差。
所以我们正在寻找解决方法。您有什么建议,请告诉我们什么是更高效的架构。请考虑您的建议中的预算。我们都知道 10 个独立的 SSD 服务器将是一个很好的解决方案。 我们目前的选择是:
- 添加第二个 SSD HDD
- 添加集群linux数据库专用服务器-旋转磁盘HDD
- 分片数据库 VPS
- 让我们知道其他选项
任何建议,我们的错误提醒和提示都会很棒。
========================
回答?
正在编制索引!索引错误是关键问题。我们修改了所有索引键,一切都解决了。现在 RAM 使用 100%,性能非常好。我们听到了索引,我们说没问题!但是,需要多加注意。
我从未在 Windows 上使用过 MongoDB,但我会更改两件事:
- MongoDB 喜欢 SSD。将您的数据移动到一个
- 考虑将网络和 MongoDB 拆分到两个服务器
在 Linux 系统上只使用 4GB RAM 会很奇怪,但我不知道 Windows。
我不认为分片是个好主意,而且对于同一个数据库中的 2600 个集合,这会有点复杂。如果您要 运行 阅读它,副本集可能是一个解决方案。
另一种选择是将 2600 个集合拆分到多个数据库中,以便为每个数据库获取写锁。