2012-11-15 2 views
7

La nostra applicazione utilizza le repliche filtrate CouchDB per spostare i dati tra i database utente e un database master. Come si aumenta il numero di utenti, repliche iniziano in mancanza con questo messaggioPerché, dopo aver aumentato max_dbs_open, le repliche continuano a fallire con "aumentare max_dbs_open"?

Source and target databases out of sync. Try to increase max_dbs_open at both servers. 

Abbiamo fatto che, aumentando il numero di max_dbs_open ad un numero ridicolmente alto (10.000), ma i fallimenti ei messaggi rimangono gli stessi. Ovviamente qualcos'altro è sbagliato. Qualcuno sa di cosa si tratta?

risposta

10

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

  1. è stato necessario aumentare l'ulimit sul processo per permettergli di avere più connessioni aperte

  2. 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.

+0

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

0

Per me questo errore è stato prodotto perché la "instanceStartTime" restituito dal database di destinazione da GET /{targetDB}/ non era valido.