Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何设置mongodb集群来处理20K+;同时的_Mongodb_Cluster Computing_Connection - Fatal编程技术网

我应该如何设置mongodb集群来处理20K+;同时的

我应该如何设置mongodb集群来处理20K+;同时的,mongodb,cluster-computing,connection,Mongodb,Cluster Computing,Connection,我的应用程序使用MongoDB作为数据库。我们期望有20K+的同时连接到mongodb集群。如果我想在20台服务器上运行mongodb并以20种方式共享集群,我应该如何配置服务器 以下是我迄今为止所做的工作: 在我的20台服务器中,每台都有一台mongos(路由器)在端口30000上运行,在3台服务器上,我在端口20000上运行MongoConfig服务器。然后在每台服务器上运行3个mongod实例。其中一个问题是主要问题。换句话说,我有20个mongos,3个MongoConfig,60个mo

我的应用程序使用MongoDB作为数据库。我们期望有20K+的同时连接到mongodb集群。如果我想在20台服务器上运行mongodb并以20种方式共享集群,我应该如何配置服务器

以下是我迄今为止所做的工作: 在我的20台服务器中,每台都有一台mongos(路由器)在端口30000上运行,在3台服务器上,我在端口20000上运行MongoConfig服务器。然后在每台服务器上运行3个mongod实例。其中一个问题是主要问题。换句话说,我有20个mongos,3个MongoConfig,60个mongod服务器(20个主服务器和40个副本)

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

所有服务启动10-15分钟后,其中一些服务不再支持ssh。这些服务器仍然可以ping。我怀疑连接太多,导致服务器死机

我个人的分析如下: 每个连接池1K连接意味着对于每个碎片的主节点,它将有1K*20(碎片)=20K个同时打开的连接。少数服务器上可能会运行多个主服务器,这将使连接数增加一倍或三倍,达到60K。尽管我更改了系统设置,允许每个进程打开更多文件,但mongod无法处理这些连接

以下是“ulimit-a”所展示的内容: 顺便说一句,我没有指定--maxConns当我启动mongod/mongos时,我也没有更改MONGO.POOLSIZE


一个附带的问题:如果我的推理是正确的,那么在每个主节点上会出现同时连接的需求总数,这在我看来是不对的,这几乎意味着mongodb集群根本不可伸缩。有人告诉我我错了吗?

a关于您的群集体系结构:


在同一台服务器上运行几个mongod实例通常不是一个好主意,您有什么特别的理由这样做吗?每个分片的主服务器都会给服务器带来沉重的压力,复制也会增加io压力,因此混合使用这些分片并不会真正提高性能。在我看来,您应该拥有6个碎片(1个主碎片-2个辅助碎片),并为每个实例提供自己的服务器。(Conf和arbiter实例的资源不太协调,因此可以将它们保留在相同的服务器上)。

有时限制不适用于进程本身。作为测试,进入其中一台服务器,通过执行以下操作获取您想要检查的mongo服务的pid

ps axu | grep mongodb
然后呢

cat /proc/{pid}/limit
这将告诉你限制是否生效。如果限制没有取消,那么您需要在启动文件中指定限制,然后停止-启动mongo服务并再次测试

要知道是否发生了这种情况,一个可靠的方法是跟踪一个垂死的服务器上的mongo日志,并观察那些“文件太多”的消息


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

我们在4台机器上运行一个4片复制集。我们在2台主机上有2个分片原色,在其他2台机器上有2个分片副本,仲裁器和配置服务器分散在一起)

我们收到消息:

./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个。虽然我现在没有达到极限,但我可能更早。因此,解决方案是:将我们运行的用户的系统ulimit从1024更改为2048(甚至无限)。你不能通过电话换

ulimit -u unlimited

除非你先做什么;我没有特权去做那件事。

你没有说你要做什么样的手术。是写重、读重、更新重、混合重吗?这一切都不同。连接的数量基本上是不相关的,重要的是连接将做什么。你真的需要20k个并发连接还是只需要20k个并发用户?这是不同的。MongoDB为每个连接使用一个线程。这是真的,但解决写锁争用可能是个例外。因为每个mongod进程都有自己的全局写锁,在一个实例上运行多个mongod实际上可能会提高总体写操作throughput@RemonvanVliet即使10gen自己也会这样做:-)我个人注意到,在一个盒子上运行多个mongod碎片实例时,性能有所提高(由于全局写锁,我相信)那么我应该再试一次
ulimit -u unlimited