Infrastruttura per DB altamente simultaneo e ad alta scrittura


17

I miei requisiti sono:

  • 3000 connessioni
  • 70-85% Scrivi vs Leggi

Attualmente, stiamo esaurendo un'istanza extra-CPU ad alta CPU con 700 connessioni. Tutti gli 8 core sono al massimo. Pensiamo che sia il numero di connessioni simultanee poiché la memoria va bene. La scrittura stessa è molto semplice (le convalide rallentano le cose). Per scalare a 3000, dobbiamo andare su più server, le opzioni attuali:

  • MySQL Sharding
  • Cluster MongoDB
  • cassandra
  • Hadoop e MySQL (cache Hadoop, dump singolo su MySQL)
  • MongoDB e MySQL (invece di Hadoop, utilizziamo mongo per la cache)

Per gestire questo numero di connessioni, una serie di domande:

  1. MySQL Sharding può gestire le connessioni simultanee?
  2. Può un singolo master gestire queste connessioni simultanee o è un multi-head come Mongo un'opzione migliore?

Mi scuso se non sto descrivendo bene il mio problema. Si prega di porre domande.


4
Qual è il carico di lavoro? Una connessione che non fa alcun lavoro consuma memoria ma nessuna CPU, un'app vincolata alle scritture consuma anche poca CPU poiché è sempre in attesa sull'I / O. Se hai le CPU al massimo, significa che stai facendo una sorta di calcolo; è qui che si trova il collo di bottiglia, non sul numero di connessioni di per sé, né sull'attività di scrittura.
Gaius,

Grazie per la risposta. mysqlslap test Purtroppo, quando si sale verso l'alto di più connessioni, tutto viene tassato. 1 -> 100 -> 500 -> 1000. A 3000 connessioni simultanee mysqlslap si uccide semplicemente. CPU e I / O attraverso questo semplice test iniziano a essere spazzati via da 700 connessioni. Questo è ciò che stiamo vedendo, ma peggio, dato che siamo più dati.
Giustino,

Risposte:


5

Se si utilizza MySQL come database principale, è consigliabile prendere in considerazione l'utilizzo di una topologia a stella tramite MySQL Replication.

Ora, prima di dire UGHHH, ROFL e OMG a MySQL Replication, ascoltami.

Una topologia a stella consente di scrivere su un server DB (chiamato Distribution Mster [DM]) e inviare i comandi SQL a più server DB. Come si configura tale infrastruttura DB?

Ecco la descrizione

Hai 5 server DB (server A, B, C, D, E)

Server A

  • Nella configurazione di MySQL Replication, sarà il Master
  • Svolge un ruolo speciale come DM
  • Master dei server B, C, D, E
  • Tutte le tabelle utilizzano il motore di archiviazione BLACKHOLE (/ dev / null)
  • Memorizza solo i registri binari
  • Macchina di metallo nudo
  • Benefici
    • Scritture molto veloci poiché tutte le tabelle sul DM usano BLACKHOLE
    • La latenza di rete è meno problematica poiché le letture rappresentano il 15-30% dell'attività DB
    • Tutti gli slave vengono aggiornati rigorosamente dal DM

Server B, C, D, E

  • Schiavo di A
  • Server una base per SELECT pesanti
  • Il server può essere virtuale o bare metal
  • Per tutti i server le cui tabelle utente utilizzano il motore di archiviazione InnoDB
    • Può essere utilizzato come DB Server warm standby
    • È possibile eseguire backup non invadenti
  • Per tutti i server le cui tabelle utente utilizzano il motore di archiviazione MyISAM
    • Configurato con oprion di sola lettura
    • Le tabelle possono avere i loro formati di riga rifatti per accelerare le letture

Ho scritto post su questo prima

Per mantenere la replica MySQL in perfetta forma


2

MySQL Cluster potrebbe essere un altro approccio allo sharding. Controlla il post qui .

Sono anche un grande fan di Cassandra, ma dipende molto dal tuo modello di dati e dalle query che desideri eseguire. Cassandra è velocissima da scrivere, perché sono sempre sequenziali su disco.


2

Se hai intenzione di utilizzare la modalità multi-head (cosa che probabilmente ti servirà se hai davvero bisogno di connessioni attive 3K) probabilmente guarderei Riak o forse Cassandra. Dipende davvero da cosa fa la tua app per quanto bene si adatteranno, ma da quello che hai descritto penso che si adatterebbe a qualcosa come Riak.

Detto questo, un approccio frammentato sembra abbastanza fattibile, se riesci a trovare un buon modo per segmentare i dati e puoi ridurre al minimo qualsiasi necessità di cose cross-shard. Starei lontano da qualsiasi cosa di ring / star / mmm in mysql e mi limiterei a stare dritto in sharding. In realtà, se tu fossi disposto a usare Postgres, potresti prototipare abbastanza facilmente usando schemi su qualcosa come heroku, e poi biforcare e dividere i database mentre iniziano a diventare più grandi dei singoli nodi.

Oh, e mentre penso che potresti provare a ridimensionare qualcosa del genere verticalmente (nodo singolo che gestisce tutti i conn 3K), non penso che tu possa farlo nel cloud.


1

Se è un'opzione per la tua specifica applicazione, forse puoi usare un modo asincrono per scrivere i dati nel tuo database (coda di lavoro, inserti in batch ...) e / o spostare le numerose connessioni client dal tuo database con un proxy in primo piano .

Con lo sharding puoi generalmente ridimensionare bene (2x db-server == 2x connessioni), ma dipende fortemente dalla natura del tuo set di dati e da come puoi dividerlo tra i frammenti.


1

Personalmente preferisco MongoDB per la sua facilità di amministrazione, scalabilità, facilità d'uso generale. Inoltre, a meno che non abbia effettivamente bisogno di un RDBMS, userò un no-SQL.

Detto questo, scegli il DB che ha più senso per la tua applicazione. Se hai bisogno di Transazioni o non riesci a progettare la tua app senza Join (o semplicemente ha più senso con loro) allora usa un RDBMS (MySQL, PostGres, ecc.)

Mentre personalmente preferisco MongoDB, l'idea che MySQL non ridimensioni o non possa gestire un alto tasso di transazioni è puramente falsa. Il team di ingegneria di Facebook (e il team MySQL al suo interno) approfondisce i dettagli. Dai un'occhiata anche al blog del team Etsy Ops; adorano anche MySQL.

Infine, non userei MongoDB per una cache MySQL; usa Memcached per quello.

Redis è anche un archivio di valori-chiave in-RAM adatto per la gestione di determinati casi d'uso. Ci sono alcune voci di blog su blog.agoragames.com che descrivono alcuni casi d'uso.

Dovresti anche dare un'occhiata a CouchDB se stai pensando a No-SQL. Basta essere consapevoli del fatto che richiede una manutenzione regolare per mantenere basso l'utilizzo del disco. (Scambia velocità e convenienza per l'utilità del disco ...)

Infine, la pianificazione della capacità non è facile da prevedere. Devi testare il più realistico possibile ed essere pronto a rimediare in base a ciò che vedi. Purtroppo "Informatica" è tanto arte quanto scienza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.