Ho un piccolo set di repliche di tre server mongod (16 GB di RAM ciascuno, almeno 4 core CPU e veri HDD) e un arbitro dedicato. I dati replicati hanno attualmente circa 100.000.000 di record. Quasi tutti questi dati si trovano in una raccolta con un indice su _id
(l'ID Mongo generato automaticamente) e date
, che è un campo di data Mongo nativo. Periodicamente posso eliminare vecchi dischi di questa collezione utilizzando l'indice data, qualcosa di simile (dalla shell mongo):MongoDB cancellazioni molto lente
db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}})
Questo funziona, ma funziona molto, molto lentamente. Uno dei miei nodi ha un I/O più lento degli altri due, avendo solo una singola unità SATA. Quando questo nodo è primario, le eliminazioni vengono eseguite a circa 5-10 documenti al secondo. Usando rs.stepDown() ho retrocesso questo primario più lento e ho forzato un'elezione per ottenere un primario con un migliore I/O. Su quel server, sto ottenendo circa 100 docs/sec.
La mia domanda principale è, dovrei essere preoccupato? Non ho i numeri prima di introdurre la replica, ma so che l'eliminazione è stata molto più veloce. Mi chiedo se la sincronizzazione del set di repliche stia causando l'attesa di I/O, o se c'è qualche altra causa. Sarei totalmente felice di disattivare temporaneamente gli aggiornamenti di sincronizzazione e indice fino a quando l'istruzione delete non termina, ma non conosco alcun modo per farlo al momento. Per qualche ragione, quando disabilito due dei tre nodi, lasciando solo un nodo e l'arbitro, il nodo rimanente viene abbassato di livello e le scritture sono impossibili (l'arbitro non dovrebbe risolvere il problema?).
Per fornire indicazioni sulla prestazione generale, se si rilasciano e si ricrea l'indice della data, sono necessari circa 15 minuti per eseguire la scansione di tutti i documenti da 100 M.
il motivo per cui non è possibile disabilitare due dei quattro nodi è che non può esserci un primario senza la maggioranza del set disponibile. Perché hai quattro membri, a proposito? Non è necessario un arbitro con tre nodi in un set di repliche. –
Gotcha - Al momento ho solo quattro nodi perché al 5 ° nodo manca un disco rigido e l'ho rimosso dal cluster :) Ironia della sorte, ho sollevato un arbitro per garantire che ci sarebbe sempre un vincitore in un'elezione principale. Ad ogni modo, l'arbitro è una piccola VM che uso anche per altre cose overhead basse come i server di configurazione in altri cluster sharding. – SteveK
ti serviva un arbitro quando avevi quattro nodi (per avere cinque voti) ma quando rimuovi il quinto nodo dal set di repliche dovresti rimuovere anche l'arbitro, in modo che rimangano tre membri. –