繁体   English   中英

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

[英]How should I set up mongodb cluster to handle 20K+ simultaneous

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

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

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

所有服务开始后10-15分钟,其中一些不再是ssh-able。 这些服务器仍然可以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

顺便说一句,我没有指定--maxConns当我启动mongod / mongos时,我也没有更改MONGO.POOLSIZE。

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

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

ps axu | grep mongodb

然后呢

cat /proc/{pid}/limit

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

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

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

您的集群架构:

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

我们在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或什么东西; 我没有这样做的权利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM