O aspecto integral de qualquer sistema distribuído é fornecer perfeitamente recursos de alta disponibilidade (HA) e balanceamento de carga ao usuário. Com pouca ou nenhuma contribuição do usuário, os índices secundários globais do Couhbase1 (GSI) oferece a seus usuários HA e balanceamento de carga em um cluster couchbase.
O que é o Index Planner?
O Index Planner é uma biblioteca usada pelo serviço de indexação do Couchbase para determinar o posicionamento ideal dos índices. Ela oferece suporte contínuo para o posicionamento de índices com reconhecimento de HA e balanceamento de carga para o serviço de indexação do Couchbase. O planejador de índice é usado para decidir o posicionamento ideal do índice em dois casos de uso, (1) Criação de novo índice e (2) Rebalanceamento do serviço de índice ou seja, quando os nós do indexador são adicionados e/ou removidos do cluster2.
Como funciona o Index Planner
Dado um conjunto de "nós" que hospedam o serviço de indexação do Couchbase (que pode ter configurações de hardware diferentes) e um conjunto de índices com seus próprios "parâmetros de carga", o Index Planner fornece ao usuário o posicionamento ideal3 desses índices nesses nós indexadores. A colocação ideal de centenas de índices - com valores diferentes de parâmetros de carga - em dezenas de nós indexadores requer a exploração de um espaço de solução muito grande. Portanto, encontrar deterministicamente "a" solução ideal requer tempo exponencial. Por isso, em vez de encontrar "a" solução ideal, o Index Planner usa o método probabilístico recozimento simulado para encontrar uma solução globalmente ideal aproximada. Experimentalmente, foi comprovado que o recozimento simulado produziu bons resultados para o algoritmo de posicionamento de índice do servidor couchbase.
Os parâmetros de carga considerados pelo Index Planner são (1) o tamanho do índice (2) o espaço de memória do índice (3) a taxa de varredura do índice (4) a taxa de ingestão de dados do índice etc., só para citar alguns. Todos esses parâmetros de carga ajudam o Index Planner a calcular a carga gerada por cada índice e, por sua vez, a calcular a carga colocada em cada nó do indexador por qualquer posicionamento específico do índice. No momento da criação de índicesNo entanto, os valores reais dos parâmetros de carga são desconhecidos. Portanto, para fins de criação do índice, o Planejador de índices é executado com "valores estimados" desses parâmetros de carga. Durante o rebalanceamento, o Planejador de índices obtém os valores desses parâmetros de carga do estatísticas de índice.
Exemplo 1:
Vamos considerar um cluster do Couchbase com 3 nós indexadores idênticos - "Nó 1", "Nó 2" e "Nó 3". Vamos supor que os nós Nó 1 e Nó 2 já estejam hospedando um índice cada - índice1 e índice2, respectivamente. Se o usuário adicionar um novo índice "index3", com base na distribuição de carga atual, o Index Planner colocará o novo índice no Nó 3.

É assim que o Planejador de índices se encarrega de distribuir os índices entre todos os nós de índice disponíveis no cluster. Para oferecer mais recursos de balanceamento de carga e HA, o serviço de indexação permite que os usuários criem réplicas de índice. Nas seções a seguir, discutiremos as réplicas de índice.
Planejador de índices para colocação de réplicas de índices
Para alta disponibilidade, os usuários são sempre aconselhados a criar um ou mais réplicas de índice (com base em seus requisitos de HA). O serviço de indexação do Couchbase implementa a política de réplica mestre-mestre. Portanto, todas as réplicas no cluster podem atender às consultas recebidas4. O serviço de indexação do Couchbase garante que as solicitações de varredura sejam distribuídas uniformemente por todas as réplicas de índice.
O Index Planner "sempre" garante que as réplicas do mesmo índice sejam colocadas em nós indexadores diferentes. Isso proporciona aos usuários a alta disponibilidade.
Exemplo 2:
No mesmo cluster do Exemplo 1, vamos supor que os nós Nó 1 e Nó 2 já estejam hospedando 2 réplicas de índice cada um e que o Nó 3 não esteja hospedando nenhuma réplica de índice5. Portanto, se o usuário adicionar um novo índice "index3" com duas réplicas (replica0 e replica1), com base na distribuição de carga atual, o Index Planner colocará uma das réplicas do novo índice no nó 3, mas a segunda réplica NÃO será colocada no nó 3, mesmo que isso signifique uma distribuição de carga relativamente desigual entre os nós.
Observações: Cada réplica de índice é identificada por seu ID (ou seja, replicaId), que começa em zero. Além disso, o usuário pode especificar o número necessário de réplicas no momento da criação do índice usando o parâmetro "num_replica", em que "num_replica" = 1 significa que serão criadas 2 instâncias de índice no total (com replicaId 0 e replicaId 1).

Planejador de índices para conscientização da zona de rack
O gerenciador de cluster do Couchbase oferece aos usuários a capacidade de agrupar os nós do cluster para formar Grupos de servidores. Cada grupo de servidores pode ser mapeado para uma zona de failover no data center. Por exemplo, todos os nós em um único "rack" no data center podem pertencer a um único grupo de servidores.
O Index Planner é "consciente da zona de rack" e sempre coloca as réplicas do mesmo índice em grupos de servidores diferentes. Se o número de grupos de servidores for menor que o número de réplicas, os grupos de servidores poderão hospedar mais de uma réplica.
Exemplo 3:
Vamos considerar um cluster do Couchbase com 4 nós indexadores idênticos - "Nó 1", "Nó 2", "Nó 3" e "Nó 4". O Nó 1 e o Nó 2 pertencem ao "Grupo de servidores 1" e o Nó 3 e o Nó 4 pertencem ao "Grupo de servidores 2". Vamos supor que os nós Nó 1 e Nó 2 já estejam hospedando um índice cada: índice1 - réplica0 e índice2 - réplica0, respectivamente. Agora, se o usuário adicionar um novo índice "index3" com 2 réplicas (replica0 e replica1) ao cluster. Então, o Index Planner adicionará uma réplica ao Nó 3 ou ao Nó 4 para distribuir a carga. Mas a segunda réplica precisa ir para o Grupo de servidores 1, porque o Nó 3 ou Nó 4 - pertencente ao Grupo de servidores 1 - já está hospedando uma réplica. O Index Planner faz essa escolha mesmo que isso signifique uma distribuição de carga relativamente desigual em vários nós.

Planejador de índices para distribuição de partições de índices
Os usuários do Couchbase podem criar índice particionado para obter uma melhor distribuição de carga - com relação à construção do índice - e para obter resultados de varredura mais rápidos para índices grandes. Com a ajuda do índice particionado, os dados do índice serão distribuídos entre várias partições com base no valor de hash da chave da partição. O planejador de índices é sensível à partição e pode distribuir partições de índices em vários nós de indexadores, com base na carga de criação de índices e na carga de varredura de índices.
O Index Planner distribui partições de um índice entre o maior número possível de nós indexadores. Isso é útil para distribuir a carga de varredura do índice, bem como a carga de criação do índice entre esses nós de indexador. Mas o Index Planner não garante a distribuição uniforme das partições entre todos os nós indexadores disponíveis. Isso ajuda os usuários a obter uma melhor distribuição da carga geral no cluster, quando há vários índices não particionados e particionados com diferentes "parâmetros de carga".
Exemplo 4:
Vamos considerar um cluster do Couchbase com 4 nós indexadores idênticos - "Nó 1", "Nó 2", "Nó 3" e "Nó 4". Vamos supor que os nós Nó 1 já estejam hospedando 2 índices não particionados. Agora, se o usuário adicionar um índice particionado6 "index3" (com 4 partições), Planejador de índices pode distribuir as 4 partições do novo índice somente entre o Nó 2, o Nó 3 e o Nó 4. Isso garantirá uma melhor distribuição geral da carga no cluster.

Os índices particionados podem ter réplicas. Cada partição de um índice tem seu próprio conjunto de réplicas de partição. O Index Planner garante que as réplicas de partição também sejam distribuídas entre os nós do indexador e entre diferentes grupos de servidores para garantir a distribuição de carga necessária e a alta disponibilidade.
Na próxima parte deste blog, discutiremos como o serviço de indexação do couchbase usa o Index Planner para vários casos de uso.
1 Neste blogpost, o termo "índice" será usado apenas para os índices secundários globais do Couchbase.
2 Os índices que residem nos nós não removidos do cluster não são afetados pelo rebalanceamento.
3 O posicionamento ideal significa a melhor distribuição de carga possível que atende a todos os requisitos de HA.
4 As réplicas do Global Secondary Index são criadas e mantidas de forma totalmente independente umas das outras. As consultas de entrada - atendidas por essas réplicas - seguem a GSI do Couchbase modelo de consistência.
5 Os usuários podem acabar com esse tipo de distribuição de índice quando começam com dois nós no cluster, criam índices com duas réplicas cada e, em seguida, adicionam um terceiro nó ao cluster.
6 Para índices particionados, os ids de partição começam em 1. O id de partição 0 é usado para índices não particionados.