Armazenar ~ 3,5 TB de dados e inserir cerca de 1 K / s 24x7, e também consultar a uma taxa não especificada, é possível com o SQL Server, mas há mais perguntas:
- qual requisito de disponibilidade você tem para isso? 99,999% de tempo de atividade ou 95% o suficiente?
- qual requisito de confiabilidade você tem? A falta de uma pastilha custa US $ 1 milhão?
- qual requisito de recuperabilidade você tem? Se você perder um dia de dados, isso importa?
- qual requisito de consistência você tem? Uma gravação precisa ser garantida para ser visível na próxima leitura?
Se você precisa de todos esses requisitos que destaquei, a carga que você propõe vai custar milhões em hardware e licenciamento em um sistema relacional, qualquer sistema, não importa quais truques você tente (fragmentação, particionamento etc.). Um sistema nosql, por sua própria definição, não atenderia a todos esses requisitos.
Obviamente, você já relaxou alguns desses requisitos. Há um bom guia visual comparando as ofertas do nosql com base no paradigma 'escolher 2 de 3' no Guia Visual para Sistemas NoSQL :
Após a atualização do comentário OP
Com o SQL Server, isso seria uma implementação direta:
- uma única chave agrupada de tabela (GUID, hora). Sim, ficará fragmentado , mas a fragmentação afeta as leituras antecipadas e as leituras antecipadas são necessárias apenas para varreduras de alcance significativo. Como você consulta apenas GUID e intervalo de datas específicos, a fragmentação não importa muito. Sim, é uma chave larga, portanto, as páginas não-folha terão densidade de chave baixa. Sim, isso levará a um fator de preenchimento ruim. E sim, podem ocorrer divisões de página. Apesar desses problemas, dados os requisitos, ainda é a melhor opção de chave em cluster.
- particionar a tabela por tempo para que você possa implementar a exclusão eficiente dos registros expirados, por meio de uma janela deslizante automática . Aumente isso com uma reconstrução da partição de índice online do último mês para eliminar o fator de preenchimento deficiente e a fragmentação introduzidos pelo agrupamento GUID.
- habilite a compactação de página. Uma vez que os grupos de chaves agrupados por GUID primeiro, todos os registros de um GUID estarão próximos uns dos outros, dando à compactação de página uma boa chance de implantar a compactação de dicionário.
- você precisará de um caminho IO rápido para o arquivo de log. Você está interessado em alto rendimento, não em baixa latência para que um log acompanhe 1K inserções / s, então a remoção é uma obrigação.
O particionamento e a compactação de página requerem um Enterprise Edition SQL Server, eles não funcionam no Standard Edition e ambos são muito importantes para atender aos requisitos.
Como uma observação lateral, se os registros vierem de um farm de servidores Web front-end, eu colocaria Express em cada servidor Web e, em vez de INSERT no back-end, colocaria SEND
as informações no back-end, usando uma conexão / transação local no Express co-localizado com o servidor da web. Isso dá uma história de disponibilidade muito melhor para a solução.
Então é assim que eu faria no SQL Server. A boa notícia é que os problemas que você enfrentará são bem compreendidos e as soluções, conhecidas. isso não significa necessariamente que seja melhor do que o que você poderia conseguir com Cassandra, BigTable ou Dynamo. Vou deixar alguém mais conhecedor de coisas não-sql para argumentar seu caso.
Note que eu nunca mencionei o modelo de programação, suporte .Net e tal. Sinceramente, acho que eles são irrelevantes em grandes implantações. Eles fazem uma grande diferença no processo de desenvolvimento, mas uma vez implantados, não importa o quão rápido o desenvolvimento foi, se a sobrecarga do ORM prejudicar o desempenho :)