Memorizzare ~ 3,5 TB di dati e inserire circa 1 K / sec 24x7 e anche eseguire query a una velocità non specificata, è possibile con SQL Server, ma ci sono altre domande:
- che requisito di disponibilità hai per questo? Tempo di attività del 99,999% o è sufficiente il 95%?
- quale requisito di affidabilità hai? La mancanza di un inserto ti costa $ 1 milione?
- quale requisito di recuperabilità hai? Se perdi un giorno di dati, è importante?
- che requisito di coerenza hai? È necessario garantire che una scrittura sia visibile alla lettura successiva?
Se hai bisogno di tutti questi requisiti che ho evidenziato, il carico che proponi costerà milioni in hardware e licenze su un sistema relazionale, qualsiasi sistema, indipendentemente dagli espedienti che provi (partizionamento, partizionamento, ecc.). Un sistema nosql, per definizione, non soddisfa tutti questi requisiti.
Quindi ovviamente hai già rilassato alcuni di questi requisiti. C'è una bella guida visiva che confronta le offerte nosql in base al paradigma 'scegli 2 su 3' in Guida visiva ai sistemi NoSQL :
Dopo l'aggiornamento del commento OP
Con SQL Server questo sarebbe un'implementazione semplice:
- una singola chiave in cluster di tabella (GUID, ora). Sì, sta per arrivare frammentato diventerà , ma la frammentazione influisce sui read-ahead e i read-ahead sono necessari solo per scansioni a distanza significativa. Poiché richiedi solo GUID e intervalli di date specifici, la frammentazione non avrà molta importanza. Sì, è una chiave ampia, quindi le pagine non foglia avranno una scarsa densità di chiavi. Sì, porterà a un fattore di riempimento scadente. E sì, possono verificarsi divisioni di pagina. Nonostante questi problemi, visti i requisiti, resta la migliore scelta di chiavi cluster.
- partizionare la tabella in base al tempo in modo da poter implementare l'eliminazione efficiente dei record scaduti, tramite una finestra scorrevole automatica . Aumentalo con una ricostruzione della partizione dell'indice in linea dell'ultimo mese per eliminare il fattore di riempimento scadente e la frammentazione introdotti dal clustering GUID.
- abilitare la compressione della pagina. Poiché la chiave clusterizzata viene prima raggruppata in base al GUID, tutti i record di un GUID saranno uno accanto all'altro, fornendo la compressione della pagina una buona possibilità per distribuire la compressione del dizionario.
- avrai bisogno di un percorso IO veloce per il file di registro. Sei interessato a un throughput elevato, non a una bassa latenza per un log per tenere il passo con 1K inserimenti / sec, quindi lo stripping è un must.
Il partizionamento e la compressione delle pagine richiedono ciascuno un SQL Server Enterprise Edition, non funzioneranno su Standard Edition ed entrambi sono molto importanti per soddisfare i requisiti.
Come nota a margine, se i record provengono da una farm di server Web front-end, metterei Express su ciascun server Web e invece di INSERT sul back-end, lo farei SEND
le informazioni nel back-end, utilizzando una connessione / transazione locale sull'Express che si trova insieme al server web. Ciò fornisce una storia di disponibilità molto migliore per la soluzione.
Quindi è così che lo farei in SQL Server. La buona notizia è che i problemi che dovrai affrontare sono ben compresi e le soluzioni sono note. questo non significa necessariamente che sia migliore di quello che potresti ottenere con Cassandra, BigTable o Dynamo. Lascerò che qualcuno più esperto in cose no-sql-ish per discutere il loro caso.
Nota che non ho mai menzionato il modello di programmazione, il supporto .Net e simili. Onestamente penso che siano irrilevanti nelle grandi distribuzioni. Fanno un'enorme differenza nel processo di sviluppo, ma una volta distribuito non importa quanto sia veloce lo sviluppo, se l'overhead ORM uccide le prestazioni :)