Background :
ho creato un'applicazione Web che vorrei poter ridimensionare ragionevolmente bene. So di non essere Google o Twitter, ma la mia app utilizza una quantità abbastanza grande di dati per ciascun utente e quindi ha requisiti di dati abbastanza elevati. Voglio essere pronto a ridimensionare ragionevolmente bene senza dover riprogettare tutto in seguito.
Mi considero uno sviluppatore di software, non un esperto di database. Ecco perché sto postando qui. Spero che qualcuno con molta più esperienza nel database possa darmi consigli.
Con un numero relativamente elevato di utenti, ma nulla di simile ai numeri di Facebook, mi aspetto di avere un DB simile a questo:
Un "grande tavolo":
- 250 milioni di dischi
- 20 colonne
- Circa 100 GB di dati
- Ha una chiave esterna indicizzata bigint (20)
- Ha una colonna index_id varchar (500) indicizzata
- Ha una colonna "value" int (11)
4 altri tavoli:
- 10 milioni di record ciascuno
- Circa 2-4 GB di dati ciascuno
- ognuna di queste tabelle ha 4 - 8 colonne
- una colonna è datetime data_creata
- una colonna è la colonna varchar (500) string_id
- una o due colonne di ciascuna di queste tabelle saranno selezionate in un join
Una di queste tabelle viene utilizzata per l'archiviazione delle medie - il suo schema è bigint (20) id, varchar (20) string_id, datetime date_created, float average_value
Cosa voglio fare - due query relativamente costose:
Calcola nuovi valori medi:
- Utilizzando una chiave esterna, selezionare fino a diversi milioni di record separati dalla tabella grande.
- Calcola una nuova media, raggruppando per string_id.
- Inserisci i risultati nella tabella delle medie.
- Come attualmente costruito, questa query utilizza due join.
Crea record non normalizzati di sola lettura per servire gli utenti:
- Utilizzare una chiave esterna per selezionare ovunque tra 1.000 e 40.000 record dal tavolo grande.
- Unisciti a ciascuna delle altre quattro tabelle sul record più recente con la colonna ID stringa.
- Inserisci i risultati in una tabella non normalizzata.
- Questi record sono utilizzati dal front-end per visualizzare informazioni agli utenti.
- Come attualmente costruito, questa query utilizza quattro join.
Ho intenzione di eseguire ciascuna di queste costose query su un database back-end batch che invierà i suoi risultati a un server DB front-end in tempo reale che gestisce le richieste degli utenti. Queste query verranno eseguite a intervalli regolari. Non ho deciso con che frequenza. La query media potrebbe essere eseguita forse una volta al giorno. La query di de-normalizzazione dovrà essere più frequente, forse ogni pochi minuti.
Ognuna di queste query attualmente viene eseguita in pochi secondi in MySQL su una macchina di fascia bassa con un set di dati con record da 100K nella "tabella grande". Sono preoccupato sia della mia capacità di ridimensionamento che dei costi del ridimensionamento.
Domande :
- Questo approccio sembra valido? C'è ovviamente qualcosa di sbagliato in questo dal punto di vista generale?
- Un RDBMS è lo strumento giusto o dovrei guardare altre soluzioni "big data" come qualcosa della famiglia Hadoop? La mia inclinazione è quella di usare un RDBMS perché i dati sono strutturati e si adattano perfettamente al modello relazionale. Ad un certo punto, però, capisco che potrei non essere più in grado di utilizzare un RDBMS. È vero? Quando sarebbe necessario questo interruttore?
- Funzionerà? Queste query possono essere eseguite in un tempo ragionevole? Posso aspettare forse ore per la query n. 1, ma la query n. 2 dovrebbe finire in pochi minuti.
- Cosa devo considerare dal punto di vista hardware? Quali sono i miei colli di bottiglia nella RAM e nella CPU? Presumo che mantenere gli indici nella RAM sia importante. C'è qualcos'altro che dovrei considerare?
- Ad un certo punto probabilmente dovrò partizionare i miei dati e usare più server. Il mio caso d'uso sembra essere già in quella categoria o sarò in grado di ridimensionare una singola macchina in verticale per un po '? Funzionerà con 10 volte i dati? 100x?