Desde o início deste ano, nós (Equipe de Indexação do Couchbase) realizamos um projeto para aprimorar serviço de indexação em Capela. Este blog discute os objetivos que planejamos alcançar no início deste projeto e a lista de melhorias realizadas para atingir esse objetivo. Observe que a maioria desses aprimoramentos - embora direcionados ao Capella (banco de dados em nuvem do Couchbase) - também é válida para clusters autogerenciados do Couchbase Server.

Objetivos

    • Operações de dimensionamento mais rápidas: Para bancos de dados em nuvem, o dimensionamento pode ser uma atividade muito frequente, portanto, precisa ser rápido.
    • Melhorar o suporte para hardware de baixo custo: Os usuários podem começar com um hardware de baixo custo e, posteriormente, fornecer mais hardware de alto custo, conforme e quando a demanda do aplicativo aumentar.
    • Aprimorar o suporte à entrada/saída lenta do disco: As implementações em nuvem usam o armazenamento do tipo EBS, que provavelmente será mais lento do que os SSDs conectados diretamente. Portanto, o custo de uma única operação de E/S é multiplicado em um ambiente de nuvem. 

O objetivo final era melhorar a experiência geral do usuário.

As seções a seguir explicam o melhorias no serviço de índice feitas na versão 7.2.2 do Couchbase Server e como essas melhorias atingem os objetivos mencionados acima.

Operações de dimensionamento mais rápidas

A carga de trabalho do aplicativo do usuário pode aumentar/diminuir com frequência. Quando os usuários esperam que a carga de trabalho do aplicativo aumente, eles podem "adicionar mais nós (ou seja, aumentar a escala)", "aumentar a CPU/memória dos nós (ou seja, aumentar a escala)" ou fazer as duas coisas. 

Para expandir, Capela adiciona mais nós de serviço de índice (com a mesma configuração dos nós existentes) ao cluster. Isso é seguido por Rebalanceamento do servidor Couchbaseem que os índices podem ser movidos de seu nó de host atual para qualquer outro nó no cluster. Esse movimento é realizado para obter uma distribuição de carga equilibrada em todos os nós do indexador.  

Para aumentar a escala, Operação de dimensionamento da Capella aciona internamente uma sequência de funções do servidor couchbase rebalanceamento de swap operações. Cada rebalanceamento de swap adiciona um novo nó (com a configuração atualizada) e remove um nó antigo (com a configuração antiga). Quando todos os nós antigos tiverem sido substituídos por novos nós, a operação de dimensionamento será concluída. Durante o rebalanceamento de swap, o serviço de índice precisa mover os índices do nó antigo para o novo nó, para que os índices não sejam perdidos.

O serviço de índice executa a movimentação do índice ao (1) reconstruir o índice usando Protocolo de alteração de dados (DCP) no nó de destino e, em seguida, (2) excluir o índice do nó de origem. Como a reconstrução de índices no nó de destino pode consumir muita CPU, o serviço de índice move os índices em lotes. Cada lote exigirá a leitura do fluxo de dados do serviço de dados, e os índices são criados nos nós do serviço de índice. Depois que um lote de índices é movido para o nó de destino, esse lote de índices pode servir Consultas N1QL (varreduras de índice) do nó de destino. 

Exemplo de aumento de escala

Os diagramas a seguir mostram um exemplo do fluxo de trabalho "Scale Out" em duas etapas usando o rebalanceamento baseado em DCP. Aqui, o serviço de índice decidiu mover os índices 3, 6 e 9 para o novo nó. Da mesma forma, o índice 5 será movido do nó 1 para o nó 2. Portanto, na primeira etapa, os índices 3, 6 e 9 serão reconstruídos no novo nó de índice com a ajuda do DCP. Da mesma forma, o índice 5 será reconstruído no nó 2.

Em seguida, na segunda etapa, os índices 3, 6 e 9 no novo nó serão ativados, enquanto suas cópias antigas serão excluídas do host anterior. Da mesma forma, o índice 5 no nó 2 será ativado e sua cópia antiga será excluída do nó 1.

Exemplo de aumento de escala

Os diagramas a seguir descrevem o processo de rebalanceamento de swap baseado em DCP, que é usado para executar a operação de aumento de escala nos nós. Aqui, na primeira etapa, um novo nó de índice é adicionado ao cluster. O serviço de índice decidiu mover os índices 3 e 4 para o novo nó de índice, enquanto o índice 5 será movido para o nó de índice 1. Portanto, na primeira etapa, os índices 3 e 4 serão reconstruídos no novo nó de índice, enquanto o índice 5 será reconstruído no nó de índice 1.

Na segunda etapa, quando a criação do índice para os índices 3, 4 e 5 estiver concluída, os índices serão ativados em seus nós de destino correspondentes e o nó de índice 2 será removido do cluster.

No Couchbase Server 7.2.2, a operação de dimensionamento é agilizada:

    1. Aumentar o número de índices que estão sendo movidos em um lote
      Por padrão, o número de índices que estão sendo reconstruídos no nó de destino é limitado por um número pequeno. O motivo da escolha do número pequeno é evitar a contenção de recursos (CPU) entre a reconstrução do índice e as varreduras do índice. Para resolver esse problema de contenção de recursos, no Couchbase Server 7.2.2, evitamos encaminhar as varreduras de índice para o novo nó, até que todos os índices nesse nó sejam reconstruídos. Com isso, toda a CPU pode ser usada para a reconstrução do índice, o que permite a movimentação de mais índices em um único lote. Observe que o lote maior é usado somente quando o lote de índices está sendo movido para um nó "vazio" no cluster. Para nós não vazios (ou seja, nós que estão hospedando alguns índices), eles serão solicitados a servir varreduras de índice e o compartilhamento de CPU é necessário. É por isso que o tamanho de lote maior é usado somente quando os índices estão sendo movidos para um nó vazio. A seguir estão os tamanhos de lote padrão:

Tamanho do lote de nós não vazios: 3
Tamanho do lote vazio: 20

Observação: o aumento do tamanho do lote permite reduzir a carga no serviço de dados, pois o número de vezes que os itens de dados são lidos do serviço de dados também é reduzido.

    1. Evitar a movimentação do índice entre os nós existentes
      No caso de expansão para fora, o serviço de índice pode mover os índices entre os nós existentes no cluster. Da mesma forma, no caso de rebalanceamento de swap, o serviço de índice pode mover os índices do nó antigo para outros nós existentes também. Esses movimentos de índice são feitos principalmente para obter uma distribuição de carga equilibrada no cluster. Mas, conceitualmente, esses movimentos extras de índice aumentam a sobrecarga de dimensionamento.

No Couchbase Server 7.2.2, o movimento dos índices é restrito aos movimentos necessários para garantir a funcionalidade. Movimentos desnecessários são evitados.

Nos exemplos acima, em caso de redução de escala, o movimento do índice 5 do nó 1 para o nó 2 será evitado. Da mesma forma, no caso de aumento de escala, o índice 5 será movido para o nó recém-adicionado em vez do nó 1.

Observe que, para obter uma distribuição de carga equilibrada, uma operação de rebalanceamento pode ser explicitamente acionada após o término da operação de dimensionamento.

Resultados experimentais

O experimento executa o escalonamento para o serviço de índice, ou seja, o escalonamento de 3 nós de serviço de índice para 4 nós de serviço de índice. Há 100 índices espalhados pelos 3 nós de serviço de índice. Como parte do dimensionamento, esses 100 índices serão redistribuídos em 4 nós. Além disso, durante a operação de rebalanceamento, a carga de trabalho de atualização de dados front-end e a carga de trabalho de varredura estão em execução. Assim, com esse experimento, pudemos verificar que o impacto de uma operação de rebalanceamento em andamento nas consultas recebidas foi reduzido.

Tabela de resultados:

Versão do Couchbase Server 7.2.0 7.2.2
Tempo necessário para o aumento de escala (de 3 para 4 nós de índice) 20,7 min 6,8 min
Consumo de CPU do serviço de dados durante a operação de dimensionamento 400% 270%

Além dos resultados acima, em nossos testes internos, também observamos Melhoria de 8 e 15 vezes nas latências de consulta dos percentis 95 e 99 respectivamente.

Observação: esse recurso é ativado por padrão nos clusters Capella provisionados. Para clusters autogerenciados, use a seguinte configuração para ativá-lo.

O comando REST a seguir pode ser usado para ativar o lote de nós vazios:

curl -X POST -u http://:9102/settings --data '{"indexer.rebalance.enableEmptyNodeBatching" : true}'

Esse comando REST pode ser usado para alterar o tamanho do lote do nó vazio para 25:

curl -X POST -u http://:9102/settings --data '{"indexer.rebalance.emptyNodeBuildBatchSize" : 25}'

O que vem a seguir?

Na próxima parte deste blog, discutiremos mais aprimoramentos do serviço de índice no Couchbase Server 7.2.2.

Saiba mais sobre os produtos Couchbase:

Autor

Postado por Amit Kulkarni

Amit Kulkarni está trabalhando como gerente de engenharia na Couchbase em índices secundários globais. Ele tem experiência em trabalhar com tecnologias como sistemas distribuídos, bancos de dados NoSQL distribuídos, armazenamento em nuvem, virtualização de armazenamento etc.

2 Comentários

  1. "O serviço de índice executa a movimentação do índice ao (1) reconstruir o índice usando o Data Change Protocol (DCP) no nó de destino e, em seguida, (2) excluir o índice do nó de origem."

    Não seria mais simples (e muito mais eficiente) apenas copiar os arquivos de índice físicos do nó 1 para o nó 2? De qualquer forma, os GSI são pares (chave secundária, PK), portanto, a cópia física seria válida. O que estou perdendo?

    1. Tyler Mitchell abril 8, 2024 em 4:52 pm

      Confira o novo recurso mais recente que faz exatamente isso para reduzir a sobrecarga: https://www.couchbase.com/blog/file-transfer-index-rebalance/ - desde o Couchbase Server 7.6.

Deixar uma resposta