我该如何设置mongodb集群以同时处理20K +

时间:2011-10-22 15:00:30

标签: mongodb cluster-computing connection

我的应用程序使用MongoDB作为数据库。我们期待与mongodb集群的20K +同时连接。如果我想在20台服务器上运行mongodb并以20种方式对集群进行分片,我该如何配置服务器呢?

以下是我到目前为止所做的事情: 在我的20台服务器上,我有一台运行在端口30000上的mongos(路由器),在3台服务器上,我在端口20000上运行mongo配置服务器。然后在每台服务器上运行3个mongod实例。其中一个是主要的。顺便说一句,我有20个mongos,3个mongo-config,60个mongod服务器(20个主要服务器和40个副本服务器)。

然后在我的应用程序中(也在每个服务器上运行并连接到localhost:30000 mongos),我设置了mongoOptions,使得connectionsPerHost = 1000。

所有服务开始后10-15分钟,其中一些变得不再适合了。这些服务器仍然可以ping通。我怀疑连接太多了,导致服务器死机。

我自己的分析如下: 每个连接池1K连接意味着每个分片的主要连接,它将具有1K * 20(分片)= 20K同时连接打开。一些服务器可能会运行多个主服务器,这将使连接数增加一倍或三倍,达到60K。不知怎的,mongod无法处理这么多连接,虽然我改变了系统设置,允许每个进程打开更多文件。

这是'ulimit -a'显示的内容:

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64000000
max memory size (kbytes, -m) unlimited
open files (-n) 320000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
顺便说一下,当我启动mongod / mongos时,我没有指定--maxConns,我也没有更改MONGO.POOLSIZE。

一个侧面问题:如果我的推理是正确的,那么同时连接要求的总数将在每个主要版本上提出,这对我来说似乎不对,这几乎意味着mongodb群集根本不可扩展。有人告诉我,我错了吗?

3 个答案:

答案 0 :(得分:1)

您的群集架构:

在同一台服务器上运行多个mongod实例通常不是一个好主意,你有什么特别的理由这样做吗?每个分片的主服务器会给你的服务器带来沉重的压力,复制也会增加压力,所以混合它们对性能来说并不是很好。 IMO,你应该有6个分片(1个主分区 - 2个辅助分片),并为每个实例提供自己的服务器。 (Conf和仲裁实例不是非常有限的资源,因此可以将它们留在相同的服务器上。)

答案 1 :(得分:1)

有时限制不适用于流程本身。作为测试进入其中一个服务器并获取要通过执行检查的mongo服务的pid

ps axu | grep mongodb

然后再做

cat /proc/{pid}/limit

这将告诉您限制是否已生效。如果限制不起作用,则需要在启动文件中指定限制,然后停止 - 启动mongo服务并再次测试。

确定是否发生这种情况的一种确定方法是在垂死的服务器上执行mongo日志并查看那些“太多文件”消息。

我们将每个服务器的限制设置为20000,并在所有mongod和mongos实例上执行相同操作,这似乎有效。

答案 2 :(得分:0)

我们在4台机器上运行4-shard replicaset。我们在2台主机上有2个碎片原色,在另外2个盒子上有2个碎片复制品,arbiters和配置服务器分散开来。)

我们收到消息:

./checkMongo.bash: fork: retry: Resource temporarily unavailable
./checkMongo.bash: fork: retry: Resource temporarily unavailable
./checkMongo.bash: fork: retry: Resource temporarily unavailable
Write failed: Broken pipe 

检查ulimit -a:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 773713
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited   

好的,因为fork消息,我们可能会遇到进程限制。以下是检查:

的方法
$ ps axo pid,ppid,rss,vsz,nlwp,cmd | egrep mongo
27442     1 36572   59735772 275 /path/mongod --shardsvr --replSet shard-00 --dbpath /path/rs-00-p --port 30000 --logpath /path/rs-00-p.log --fork
27534     1 4100020 59587548 295 /path/mongod --shardsvr --replSet shard-02 --dbpath /path/rs-02-p --port 30200 --logpath /path/rs-02-p.log --fork
27769     1 57948   13242560 401 /path/mongod --configsvr --dbpath /path/configServer_1 --port 35000 --logpath /path/configServer_1.log --fork

所以,你可以看到mongod每个都有275,295和401个子进程/线程。虽然我现在没有达到极限,但我可能更早了。因此,解决方案是:为我们运行的用户在1024到2048(甚至无限制)下更改系统的ulimit。您无法通过

进行更改
ulimit -u unlimited

除非你先sudo或什么东西;我没有这样做的权利。