temos um aplicativo Ruby on Rails com um banco de dados MySQL (no AWS RDS). Algumas de nossas tabelas têm um grande número de registros ~ 100 milhões e esse número está aumentando rapidamente a cada mês. A maioria dos registros dessas tabelas estão inativos e são acessados apenas ocasionalmente para alguns relatórios que os usuários podem acessar.
Estamos agora enfrentando vários problemas:
- o tempo de consulta nessas tabelas aumentou significativamente mesmo com a otimização do índice
- restaurar a partir de um backup em caso de emergência levaria muito tempo devido ao grande tamanho das tabelas
Nossos requisitos são:
- os dados precisam ser persistidos indefinidamente em algum lugar
- (rápido) acesso de leitura aos dados
- nenhum acesso de gravação adicional é necessário após um certo período desde a criação de um registro
- baixo custo
Estávamos, portanto, planejando fazer o seguinte:
- depois que um registro ficar "inativo" (isso é amplamente determinado por um período de tempo que se passou desde a criação), criaríamos um registro no DynamoDB espelhando os dados em nosso banco de dados sql.
- depois de vários dias, excluímos o registro sql do banco de dados mysql
- o registro ainda pode ser lido através do dynamodb
Nossa pergunta era se esse tipo de abordagem é convencional e se existem maneiras potencialmente melhores de alcançar o que queremos. Qualquer entrada seria muito apreciada.
O DynamoDB pode ser uma boa opção para isso. Defina sua classe de tabela como "Padrão - Acesso Infrequente", pois você planeja ter muitos dados relativos às leituras/gravações. Você terá acesso de leitura muito rápido (recuperações em milissegundos), com o modo On Demand você nem precisaria pagar a menos que estivesse fazendo recuperações, e você pode configurá-lo e esquecê-lo.
O DynamoDB é o melhor? Depende de detalhes que você não quantificou. Se por "rápido" você quer dizer um segundo ou dois, então você tem mais opções. O "baixo custo" significa que você prefere executar seus próprios servidores para economizar alguns dólares? Então, novamente, você tem mais opções.
Com preços Standard-IA de 10c/GB e se cada item tiver cerca de 1KB, então você verá 100.000.000 * 1KB = 100 GB = $ 10/mês para armazenamento.
Se você ler a uma taxa de 10 recuperações por segundo, isso é 10 RCU * $ 0,00013/RCU-hr = $ 0,94/mês para leituras.
Sem custo para gravações após o carregamento inicial (que, se cada item tiver 1 KB, seria cerca de US$ 18 para 100 milhões de itens usando o modo Provisionado).