我正在尝试使用MongoDB处理我希望能够对其执行查询的超大型数据集,但遇到了一个看起来像配置问题的问题,但是我似乎无法弄清楚
设置
我目前在群集中有4台计算机,并且它们都具有相同的规格(2个8核Xeon E5-2667 @ 3.5Ghz,512Gb的Ram,100Gb / s Infiniband网络)。我将一台计算机用作“客户端”,将其他三台用作mongodb集群。我在所有群集计算机上使用mongodb docker容器。一个可能的问题是计算机上没有本地连接的存储,它们的所有存储都是通过Ceph在100Gb / s Infiniband上提供的。
我有点作弊,将路由器和配置服务器与第一个mongodb节点放在同一台机器上,其他两台机器只有mongodb节点。因为数据已经通过Ceph复制,所以我选择对数据库进行分片并将每个节点设置为一个具有复制集的分片,每个复制集只有一台机器。 (也许这是我的问题的一部分,但这对我来说很有意义)
我还应该提到我所有的查询/插入都是使用pymongo从客户端完成的。
数据
我拥有的数据集是一堆时间序列数据,数据中根本没有任何关系,因此对于no-sql类型的db来说似乎是理想的选择。我只想插入一部分数据,每个时间步长大约550个数据点,大约6亿个时间步长。我将数据库分片到一个字段中,该字段将数据分为大约86,000个段,因此我认为这是一个不错的选择。
我可以轻松插入数据,数据库不是瓶颈,限制因素是我的客户端能够以多快的速度处理现有数据文件(它们目前在csvs中)。
问题
插入所有文档后,数据库大小约为1.4TB。在3个节点之间,我有1.5TB的内存,但是有开销,docker容器等。我没想到整个数据集都可以容纳在内存中,但是应该已经很接近了。但是,当我查看节点时,每个节点仅使用100GB到150GB之间的内存。所以这对我来说似乎是错误的,我认为mongo会将尽可能多的数据库存储在内存中。我没有在mongo或docker上设置任何资源限制。
如果我查询一个索引字段,我会得到一个非常快的响应,这是可以预期的,首先,我只索引了我分片的字段。后来我添加了另一个索引,该索引花了一段时间才确定我在周末运行了多长时间。
如果我执行的任何查询都涉及到需要永久使用的未索引字段,那么我会让它运行一整夜,但仍然没有结果。
我发现奇怪的是,当我查看mongo节点时,只有一个内核正在工作,也许在大约50%的负载下,内存仍然几乎座无虚席,并且网络几乎没有被使用(〜10Mbps,导致我相信Ceph不是瓶颈)。
所以我可以添加更多的节点,但是此时硬件似乎还不是瓶颈。此外,我什至不知道应该对诸如此类的秒,分钟,小时数进行合理的查询?我觉得如果大多数数据在内存中不应该花费数小时。
我只是觉得自己丢失了一些东西,所以我想我会伸出援手,看看这是明显的东西还是我只是期望太多或错误的东西。感谢您的帮助,不胜感激。
编辑: 这是我用于每个节点的docker compose文件。
节点1:
version: '3'
services:
mongosn1:
container_name: mongosn1
image: mongo
hostname: snode1
extra_hosts:
- "snode1:10.0.2.107"
- "snode2:10.0.2.108"
- "snode3:10.0.2.109"
- "cfgnode1:10.0.2.107"
- "rtnode1:10.0.2.107"
command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27019 --smallfiles
ports:
- "27019:27019"
expose:
- "27019"
volumes:
- /mnt/work/db/mongo/data/shard1:/data/db
- /etc/localtime:/etc/localtime:ro
mongocfg1:
container_name: mongocfg1
image: mongo
hostname: cfgnode1
extra_hosts:
- "snode1:10.0.2.107"
- "snode2:10.0.2.108"
- "snode3:10.0.2.109"
- "cfgnode1:10.0.2.107"
- "rtnode1:10.0.2.107"
command: mongod --configsvr --replSet mongors1conf --dbpath /data/db -- port 27018 --smallfiles
ports:
- "27018:27018"
expose:
- "27018"
volumes:
- /etc/localtime:/etc/localtime:ro
- /mnt/work/db/mongo/data/config1:/data/db
mongort1:
container_name: mongort1
image: mongo
hostname: rtnode1
depends_on:
- mongocfg1
extra_hosts:
- "snode1:10.0.2.107"
- "snode2:10.0.2.108"
- "snode3:10.0.2.109"
- "cfgnode1:10.0.2.107"
- "rtnode1:10.0.2.107"
command: mongos --configdb mongors1conf/cfgnode1:27018 --port 27017 -- bind_ip 0.0.0.0
ports:
- "27017:27017"
expose:
- "27017"
volumes:
- /etc/localtime:/etc/localtime:ro
节点2:
version: '3'
services:
mongosn1:
container_name: mongo
image: mongo
hostname: snode2
extra_hosts:
- "snode1:10.0.2.107"
- "snode2:10.0.2.108"
- "snode3:10.0.2.109"
- "cfgnode1:10.0.2.107"
- "rtnode1:10.0.2.107"
command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017 --smallfiles
ports:
- "27017:27017"
volumes:
- /mnt/work/db/mongo/data/shard2:/data/db
- /etc/localtime:/etc/localtime:ro
节点3:
version: '3'
services:
mongosn1:
container_name: mongo
image: mongo
hostname: snode3
extra_hosts:
- "snode1:10.0.2.107"
- "snode2:10.0.2.108"
- "snode3:10.0.2.109"
- "cfgnode1:10.0.2.107"
- "rtnode1:10.0.2.107"
command: mongod --shardsvr --replSet mongors3 --dbpath /data/db --port 27017 --smallfiles
ports:
- "27017:27017"
volumes:
- /mnt/work/db/mongo/data/shard3:/data/db
- /etc/localtime:/etc/localtime:ro