Come risulta, il messaggio a increase max_dbs_open
è nel migliore dei casi una risposta parziale e nel peggiore dei casi è fuorviante. Nel nostro caso il problema non era il numero di database aperti ma apparentemente il numero di connessioni HTTP utilizzate dalle nostre numerose repliche.
Ogni replica può utilizzare min(worker_processes + 1, http_connections)
dove worker_processes
sono il numero dei lavoratori addetti a ciascuna replica e http_connections
è il numero massimo di connessioni HTTP assegnato per ciascuna replica come descritto in this document.
Così il numero totale di connessioni utilizzate è
number of replications * min(worker_processes + 1, http_connections)
Il valore predefinito di worker_processes
è 4 e il valore predefinito di http_connections
è 20. Se ci sono 100 repliche, il numero totale di connessioni HTTP utilizzata dalla replica è 500. Un'altra impostazione, max_connections
, determina il numero massimo di connessioni HTTP che un server CouchDB consentirà come descritto in this document. Il valore predefinito è 2048.
Nel nostro caso, ogni utente ha due repliche: una dall'utente al database master e un'altra dal database master all'utente. Quindi, nel nostro caso, con le impostazioni predefinite, ogni volta che aggiungevamo un utente, aggiungevamo 10 connessioni HTTP aggiuntive che passavano attraverso il valore predefinito max_connections
.
Dal momento che le nostre repliche sono minime e solo una piccola quantità di dati viene spostato da parte dell'utente al master e dal master per l'utente, abbiamo composto di nuovo il numero di worker_processes
, http_connections
, aumentato max_connections
e tutto va bene.
UPDATE
Un paio di altri reperti
è stato necessario aumentare l'ulimit sul processo per permettergli di avere più connessioni aperte
Creazione di repliche troppo in fretta anche causati i problemi. Se ho richiamato indietro la velocità con cui ho creato nuove repliche, ho anche facilitato il problema. YMMV.
Questo problema è stato causato dal fatto che le repliche di ciascun database utente e del database master erano tra due diversi processi CouchDB? Sto provando a fare qualcosa di simile, ma i database utente e il database master sono ospitati sullo stesso server, quindi spero di evitare di utilizzare qualsiasi IPC. – pokstad