Attualmente stiamo valutando la possibilità di passare da Postgres a CouchDB per un'applicazione di monitoraggio dell'utilizzo. Alcuni numeri:Struttura del documento consigliata per CouchDB
Circa 2000 connessioni, interrogate ogni 5 minuti, per circa 600.000 nuove righe al giorno. In Postgres, archiviamo questo dato, diviso per giorno:
t_usage {service_id, timestamp, DATA_IN, data_out}
t_usage_20100101 eredita t_usage.
t_usage_20100102 eredita t_usage. ecc.
Scriviamo i dati con un proc ottimizzato memorizzato che presume che la partizione esista e la crei se necessario. Possiamo inserire molto rapidamente.
Per la lettura dei dati, il nostro casi d'uso, in ordine di importanza e le prestazioni attuali sono:
* Servizio singolo, Festa e getta: la buona prestazione
* Servizi multipli, Mese Uso: Prestazione scarsa
* Singolo Servizio, mese di utilizzo: scarso rendimento
* Servizi multipli, Mesi multiple: prestazioni molto scarse
* Servizi multiple, giorno singola: buona prestazione
Ciò ha senso perché le partizioni sono ottimizzati per giorni, che è di gran lunga il nostro più imp caso d'uso ortant. Tuttavia, stiamo esaminando i metodi per migliorare i requisiti secondari.
Spesso è necessario parametrizzare la query per ore, ad esempio, dando solo risultati tra le 8 e le 18, quindi le tabelle di riepilogo sono di uso limitato. (Questi parametri cambiano con frequenza sufficiente che la creazione di più tabelle di dati di riepilogo è proibitiva).
Con questo background, la prima domanda è: CouchDB è appropriato per questi dati? Se lo è, visti i casi di utilizzo di cui sopra, come modellerebbero meglio i dati nei documenti CouchDB? Alcune opzioni Ho messo insieme fino ad ora, che siamo nel processo di analisi comparativa sono (_id, escluso _rev):
un documento per collegamento giornalieri
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
circa 60.000 nuovi documenti al mese. La maggior parte dei nuovi dati sarebbero aggiornamenti di documenti esistenti, piuttosto che nuovi documenti.
(Qui, gli oggetti in uso sono immessi nel timestamp del sondaggio e i valori in byte e fuori).
un documento per connessione al mese
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
circa 2.000 nuovi documenti al mese. Sono necessari aggiornamenti moderati ai documenti esistenti.
un documento per riga dei dati raccolti
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
circa 15 milioni di nuovi documenti al mese. Tutti i dati sarebbero un inserto in un nuovo documento. Inserti più veloci, ma ho domande su quanto sarà efficiente dopo un anno o 2 anni con centinaia di milioni di documenti. Il file IO sembrerebbe proibitivo (anche se sono il primo ad ammettere di non comprendere appieno la meccanica di esso).
Sto cercando di avvicinarmi a questo in un modo orientato al documento, anche se interrompere l'abitudine RDMS è difficile :) Il fatto che tu possa solo parametrizzare solo minimamente le viste mi ha un po 'preoccupato. Detto questo, quale di questi sarebbe il più appropriato? Ci sono altri formati che non ho considerato che funzioneranno meglio?
Grazie in anticipo,
Jamie.
CouchDB avvierà più processi di sistema affinché il server di visualizzazione elabori una vista, quindi viene ridimensionata su più core. Il resto di CouchDB è in Erlang ed è ottimo per l'uso di più core. – mikeal
Hai ragione. Ho eseguito un test e inserisco 2000 di questi documenti di grandi dimensioni (20 processi che inseriscono 100 ciascuno, contemporaneamente) in un'istanza di v0.9 Couch. Su un Mac Pro 4 core 2,66G, questi sono stati inseriti in fondamentalmente 3m30s. Il divano ha preso il 350% della CPU. Alla fine il file del disco era ~ 2G. Anche dopo la compattazione, non è cambiato affatto. Al contrario, l'inserimento di 2000 documenti "giorno singolo" ha richiesto circa 18 anni. Molto più veloce, ovviamente. 3m30s è troppo vicino alla finestra di 5m che hanno. 18s è molto meglio. La compattazione ha richiesto quasi 3m. –
Grazie mille per questo, è un ottimo punto di partenza. Abbiamo eseguito alcuni benchmark e trovato più o meno lo stesso di te. Il problema principale che dovremo fare è l'aggiornamento costante dei dati - sembra che diventerà proibitivo per i documenti "tutto il mese". Finché possiamo regolarmente compattare, speriamo di essere ok. È un peccato non poter andare per un documento per punto dati, ma come sospetti il file IO sembra proibitivo. Purtroppo per aggiornare qualsiasi altro tipo di documento, abbiamo bisogno di leggere prima di poter scrivere, al fine di ottenere il _rev ... – majelbstoat