2009-02-17 9 views
7

Per decine di migliaia di richieste/secondo Voglio vedere 60.000 -> +90.000 richieste/secondo.(Come può/cosa dovrebbe) Implementare un database che scala fino alle decine di migliaia di richieste/secondo?

Il mio programma di installazione è costituito dai seguenti:

utente ---> Web App -> coda di messaggi -> parser -> database?

Devo dire che il parser al momento può analizzare/roba circa 18750 record/secondo usando COPY quindi siamo limitati a tale scopo fino a quando non iniziamo ad aggiungere altri parser - questa non è una grande preoccupazione per me ora.

Ho un sistema che richiede la possibilità di caricare in blocco il più velocemente possibile il maggior numero di record che posso. Questo stesso sistema (o può essere diverso a seconda di come ci si avvicina a esso) dovrebbe essere in grado di rispondere alle domande di tipo analitico di questo tipo:

 
wonq = "select sum(amount) from actions where player = '@player' and " + 
     "(type = 'award' or type = 'return') and hand = hand_num" 
lostq = "select sum(amount) from actions where player = 'player' and " + 
     "type != 'award' and type != 'return' and hand = hand_num" 

..... 10-15 mila volte (per utente) poiché sono trasferiti su un'altra tabella. Inutile dire che per ora paghiamo questi risultati a 10/pagina.

Ho guardato il seguente: (. Reg corsa del RDBMS mulino) (presupponendo che siano tutte sullo stesso server)

  • mysql - è stato in grado di entrare in 15-20 mille richieste/secondo intervallo; nelle condizioni attuali, se tentiamo di ridimensionarlo, abbiamo bisogno di un host/database separato ogni volta che dobbiamo ridimensionarlo - non è fattibile

  • couchdb (document oriented db) - non ha infranto 700 richieste al secondo; Speravo davvero che questo mi avrebbe salvato il culo, non una possibilità!

  • vertica (indirizzamento colonnare db) - stava colpendo 60000 richiesta/secondo, fonte chiusa, molto costoso; questa è ancora un'opzione ma personalmente non mi è piaciuta affatto

  • tokyocabinet (db basato su hash) - attualmente sta pesando in 45.000 inserti/secondo e 66.000 selezioni/secondo; ieri, quando ho scritto questo, stavo usando un adattatore basato su FFI che stava eseguendo circa 5555 richieste al secondo; questo è di gran lunga il database più impressionante più veloce che abbia mai visto !!

  • terracotta - (vm cluster) attualmente valutando questo insieme a jmaglev (non vedo l'ora che Maglev venga fuori) - questo è IL PIÙ BASSO!

forse sono solo affrontare questo problema sbagliato ma ho sempre sentito dire che RDBMS erano lento come l'inferno - Allora, dove sono questi sistemi super veloce che ho sentito parlare?

Controlli delle condizioni ::

Just so ppl conoscono le mie specifiche sulla mia casella di dev sono:

 
dual 3.2ghz intel, 1 gig ram 

MySQL MySQL.modifiche CNF erano:

 
key_buffer = 400M    # was 16M 
innodb_log_file_size = 100M  # non existent before 
innodb_buffer_pool_size = 200M # non existent before 

UPDATE ::

Si scopre che in terracotta potrebbe avere un posto nella nostra struttura dell'applicazione, ma fuori casa non sostituirà la nostra in qualsiasi momento del database non appena è velocità sono terribili e il suo utilizzo dell'heap fa schifo.

D'altra parte, sono stato molto felice di vedere che la libreria di rubini NON-FFI di tokyocabinet (che significa tiranno/armadio) è super veloce e in questo momento è il primo posto.

+0

feydr - potresti approfondire come hai testato Terracotta? Vorrebbe sapere di più perché credi che la terracotta sia lenta. La maggior parte delle persone lo trova estremamente veloce, quindi forse è un caso di cattiva utilità - o potrebbe esserci qualche regolazione? Mi piacerebbe saperne di più ... –

+0

taylor: certamente è probabile. un caso di cattivo uso; lo stiamo ancora valutando e probabilmente lo faremo per un po 'di tempo ma, come primo test per la semplice condivisione di un elenco di oggetti su un'istanza server-client, siamo stati in grado di inserire solo gli oggetti in ~ 50/secondo rispetto alla maggior parte delle altre opzioni ~ 600/sec – eyberg

+0

taylor: ho appena notato che il tuo blog parla di 3500 txn/secondo - la terracotta garantita si ridimensionerà molto più facilmente (il che significa che ha ancora un posto per noi) ma penso che la velocità txn sia solo relativamente parlando modo rallentare per sostituire i nostri rdbms – eyberg

risposta

6

Per scalabilità crazy-grande, ti consigliamo di concentrarsi su due cose:

  • Sharding: Dividi il tuo insieme di dati in gruppi che non si sovrappongono. Avere un modo semplice e veloce per mappare da una richiesta ad un server. (Player che inizia con af, server 1; gq, server 2 ... ecc ...)
  • Caching: utilizzare Memcache per ricordare l'output di alcune query di selezione molto comuni, quindi non è necessario andare su disco come spesso.
1

Bene, il grande giocatore nel gioco è Oracle, ma questo è un sacco di soldi.

Se si vuole andare a buon mercato allora si dovrà pagare il prezzo in termini diversi:

  • dal partioning DB su più istanze e la distribuzione del carico.
  • Risultati di memorizzazione nella cache potenziali in modo da ridurre l'effettivo accesso al DB.
0

utente ---> web app -> coda messaggi -> parser -> database?

A cosa serve la coda dei messaggi? Questi sono normalmente un grosso problema di prestazioni.

+0

buona domanda, tuttavia, la coda dei messaggi aggiunge quasi NESSUN risultato notevole delle prestazioni ... la ragione per cui esiste è che alla fine vogliamo avere più parser da cui estrarre e voglio che i lavori dal server web vengano IMMEDIATAMENTE lanciati nel fare la fila così il server web può fare meglio è – eyberg

0

Sharding e caching come detto ojrac.

Un'altra opzione è fare un passo indietro e capire di eseguire il lavoro con meno query! Dalle poche informazioni che hai dato non posso fare a meno di pensare "ci deve essere un modo migliore". Dagli esempi che hai fornito alcune tabelle riassuntive (con la memorizzazione nella cache opzionale) potrebbe essere una vittoria facile.

Hypertable etc offre prestazioni migliori per alcuni modelli di accesso ai dati, ma il tuo suono è molto adatto per i database tipici.

E sì, CouchDB è deludentemente lento.

+0

non aveva idea che CouchDB fosse così debole! Ho immaginato che fosse come 10k –

+0

in passato abbiamo fatto delle tabelle di riepilogo che più o meno funzionavano, ma al momento sono tornato alle ossa nude "quanto velocemente possiamo buttare cose dentro e afferrarle" – eyberg

0

hai provato postgresql? dovrebbe essere più veloce di mysql. ma in ogni caso, è necessario bilanciare il carico su più server (database diviso). puoi avere più database (ad esempio per ogni cliente) e uno centralizzato che si sincronizzerà con quelli piccoli ...

+0

I non ho ancora provato postgresql, anche se l'ho usato in progetti passati ed è la forza della qualità del settore - so dalle esperienze passate che non ha la velocità che richiedo comunque .. – eyberg

0

Hai provato redis? Promettono la velocità di 110000 SET/secondo, 81000 GET/secondo. È un db con valore chiave avanzato con supporto per elenchi e set.

+0

effettivamente valutato redis e mi piace parecchio - Ho comunque molti problemi con questo problema - il principale è che hai bisogno di memoria sufficiente per abbinare ciò che vuoi archiviare .... senza essere distribuito è un grande trucco – eyberg

+0

Sì, per lo stesso motivo per cui Redis non lo fa sembra molto adatto al nostro progetto In questo contesto, il progetto LightCloud sembra interessante poiché costruisce database di valori-chiave distribuiti su Tokyo Tyrant o Redis. – AlexD

0

Dubito che qualsiasi sistema ti fornisca le prestazioni immediatamente necessarie. Probabilmente inizierai a colpire i limiti della macchina su cui ti trovi (con quasi tutti i db ad alta intensità di scrittura avrai limiti di I/O abbastanza veloci).Potrebbe essere necessaria qualche analisi, ma il collo è quasi sempre il collo di bottiglia. Più RAM aiuterà, così come usare i dischi a stato solido.

Tuttavia, sarà probabilmente necessario un clustering di qualche tipo indipendentemente dal db effettivo che si utilizza. Puoi dividere i dati stessi, o con MySQL, l'impostazione di read-slaves diffonderà il carico tra i nodi e dovrebbe darti il ​​throughput che stai cercando.

Inoltre: MongoDB è fantastico. Potrebbe meritare un'occhiata.

+0

ho guardato su mongodb e mi piace molto meglio del divano (essendo entrambi doc-oriented dbs) visto che è molto più veloce .. Stavo ricevendo 8.000-10.000 richieste/secondo sul mio portatile hai ragione riguardo al clustering ... a partire da ora stiamo cercando di usare hdfs/hbase nello stack di hadoop .. non così veloce ma dovrebbe fare ciò di cui abbiamo bisogno – eyberg

0

Il modo tipico per archiviare i dati in modo duraturo in un'app di scrittura pesante consiste nell'utilizzare un registro append-only. Se correttamente schierato il file di registro si trova sul proprio disco rotante, il tempo di ricerca del disco è ridotto al minimo per operazione di scrittura/aggiunta.

Uno può aggiornare i metadati per conoscere l'offset per alcune chiavi primarie dopo ogni scrittura.

C'è un motore di archiviazione mysql che esegue questa operazione se si desidera utilizzare mysql. Un'altra opzione è uno dei nuovi database nosql come fleetdb.

Hai provato a utilizzare anche un SSD?

Esistono molte opzioni per risolvere questo problema, ma è probabile che richiedano un po 'di lavoro manuale.