簡體   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