Com o Couchbase Server 3.0, você tem uma nova e excelente opção para alterar a maneira como usamos a memória para armazenar em cache suas chaves e metadados. A nova opção é chamada de "ejeção total". Veja como a ejeção total é diferente:
Com a versão 2.x, armazenamos em cache todas as chaves e metadados na memória e permitimos a ejeção apenas dos valores. Isso é ótimo para o acesso de baixa latência a qualquer parte dos seus dados. Entretanto, algumas cargas de trabalho não exigem acesso de baixa latência a todas as partes dos dados e preferem ter a memória reservada para as partes mais "quentes" do conjunto de trabalho. Imagine um banco de dados enorme que esteja coletando telemetria de sensores ou um sistema de IoT (Internet das Coisas) que esteja coletando pontos de dados enormes de todos os dispositivos, mas que consulte principalmente as últimas 24 horas de dados. Com a versão 3.0, para bancos de dados grandes com um conjunto de trabalho ativo menor, é possível ativar a "ejeção total" e ejetar chaves e metadados de partes dos dados que raramente são acessadas. Mesmo que você considere as chaves e os metadados pequenos, com um grande número de chaves, a memória usada para chaves e metadados pode aumentar. Com o modo de ejeção total, você pode usar a memória de forma mais eficiente para armazenar em cache partes maiores do seu conjunto de trabalho.
- A ativação da opção é fácil e pode ser feita por bucket no console de administração. A alteração é transparente para os aplicativos, portanto, não há nada que precise ser feito no tamanho do aplicativo para aproveitar a configuração.

Vamos dar uma olhada em alguns números para ver como isso pode ser eficaz para grandes bancos de dados. Os gráficos abaixo mostram a memória consumida para armazenar metadados durante o carregamento de dados para os clusters 2.5.1 e 3.0 que têm configuração idêntica. O 2.5.1 e as versões anteriores do 2.x se comportam da mesma forma em relação ao armazenamento em cache, portanto, isso também pode ser repetido com qualquer versão do 2.x.
- O gráfico à esquerda mostra a quantidade de metadados na memória ao longo do tempo na versão 2.x que é executada no modo de ejeção de valores (já que esse é o único modo de armazenamento em cache permitido).
- O gráfico à direita mostra o comportamento da versão 3.0 sob ejeção total.

À medida que os dados se acumulam, você pode ver que o Couchbase Server 2.x consome cada vez mais memória, chegando a 3 GB. No lado direito, você vê o consumo de memória em torno de 80 MB com o 3.0. Com a ejeção total no Couchbase Server 3.0, a mesma operação consome um pedaço muito menor de memória, pois ejeta continuamente chaves e metadados. A memória liberada pela ejeção de chaves e metadados está disponível para novas chaves e metadados, bem como para os valores dos dados que estão sendo carregados. Redução de ordens de grandeza na memória usada para metadados... O teste é feito com a contagem de réplicas definida como 1, tamanho médio do valor em torno de 0,5K e, por fim, ambos os bancos de dados atingem cerca de 50 milhões de documentos durante a operação de carregamento de dados visualizada nos gráficos.
Então, o que acontece quando o aplicativo precisa acessar chaves e metadados que foram ejetados na versão 3.0? Há um compromisso aqui e o Couchbase faz E/S adicional para trazer a chave e os metadados, bem como os valores, de volta à memória sob ejeção total. Operações como Adicionar, Excluir, Tocar e CAS ainda precisam de metadados. No entanto, o Set tem uma otimização especial: O Couchbase pode ignorar a recuperação da chave e dos metadados e simplesmente presumir que a versão anterior foi invalidada.
Antes de encerrar, quero deixar claro que a nova opção de ejeção total traz uma grande eficiência para grandes conjuntos de dados. No entanto, se você tiver aplicativos que precisam de latências baixas e agressivas para todos os acessos a dados, deverá continuar a usar a opção de ejeção de valor. Os armazenamentos de cookies ou de sessões, os aplicativos de carrinho de compras e os armazenamentos de perfis são ideais para fixar todas as chaves e metadados na memória e, portanto, devem usar a ejeção de valores.
Muito obrigado e, como sempre, todos os comentários são bem-vindos.
-cihan