Implementação do diretório de grãos
Visão geral e arquitetura
O diretório grain em Orleans é um armazenamento de chave-valor onde a chave é um identificador de grão e o valor é uma entrada de registro que aponta para um silo ativo que (potencialmente) hospeda o grão.
Embora Orleans forneça uma implementação de diretório distribuído na memória padrão (descrita neste artigo), o sistema de diretório grain foi projetado para ser plugável. Os desenvolvedores podem implementar seu próprio diretório implementando a interface IGrainDirectory
e registrando-a com a coleção de serviços do silo. Isso permite implementações de diretório personalizadas que podem usar diferentes back-ends de armazenamento ou modelos de consistência para atender melhor aos requisitos específicos do aplicativo. Desde a introdução do novo diretório de consistência forte, há pouca necessidade de implementações de diretórios externos, mas a API permanece para compatibilidade com versões anteriores e flexibilidade. O diretório grain pode ser configurado por tipo de grão.
Para otimizar o desempenho, as pesquisas de diretório são armazenadas em cache localmente dentro de cada silo. Isso significa que leituras de diretório potencialmente remotas só são necessárias quando a entrada de cache local está ausente ou é inválida. Esse mecanismo de cache reduz a sobrecarga de rede e a latência associadas às pesquisas de localização de grãos.
Originalmente, Orleans implementou um diretório eventualmente consistente estruturado como uma tabela de hash distribuída. Isso foi substituído por um diretório fortemente consistente no Orleans v9.0, baseado na metodologia Virtualmente Síncrona de duas fases e também estruturado como tabela de hash distribuída, mas com balanceamento de carga aprimorado através do uso de nós virtuais. Este artigo descreve a implementação mais recente do diretório de grão.
Diretório de grãos distribuídos
O diretório distribuído de grãos no Orleans oferece uma forte consistência, balanceamento de carga uniforme, alto desempenho e tolerância a falhas. A implementação segue um design bifásico baseado na metodologia Virtual Synchrony com semelhanças com Vertical Paxos.
As partições de diretório têm dois modos de operação:
- Operação normal: partições processam solicitações localmente sem coordenação com outros hosts.
- Mudança de visão: os servidores coordenam-se entre si para transferir a propriedade das faixas de diretórios.
O diretório aproveita o sistema Orleansde associação de cluster com forte consistência, onde as configurações chamadas "views" têm números de versão que aumentam monotonamente. À medida que os silos entram e saem do cluster, exibições sucessivas são criadas, resultando em alterações na propriedade do intervalo.
Todas as operações de diretório incluem coordenação de visualização:
- Os pedidos têm o número de visualização do chamador.
- As respostas incluem o número de visualização da partição.
- Ver desvios nos números provoca a sincronização.
- As solicitações são repetidas automaticamente quando as alterações de visualização.
Isso garante que todas as solicitações sejam processadas pelo proprietário correto da partição de diretório.
Estratégia de particionamento
O diretório é particionado usando um anel de hash consistente com intervalos sendo atribuídos aos silos ativos no cluster. Os identificadores de grãos são hasheados para encontrar o silo que detém a seção do anel correspondente ao seu hash.
Cada silo ativo possui um número pré-configurado de intervalos, sendo o padrão 30 intervalos por silo. Isso é semelhante ao esquema usado por Amazon Dynamo e Apache Cassandra, onde vários nós "virtuais" (intervalos) são criados para cada nó (host).
O tamanho de uma partição é determinado pela distância entre seu hash e o hash da próxima partição. É possível que um intervalo seja dividido entre vários silos durante uma alteração de exibição, o que adiciona complexidade ao procedimento de alteração de exibição, já que cada partição deve potencialmente se coordenar com várias outras partições.
Ver procedimento de alteração
As partições de diretório (implementadas no GrainDirectoryPartition
) usam bloqueios de intervalo versionados para impedir o acesso inválido aos intervalos durante as alterações de exibição. Os bloqueios de intervalo são criados durante a alteração da exibição e são liberados quando a alteração da exibição é concluída. Estas fechaduras são análogas às 'cunhas' utilizadas na metodologia Virtual Synchrony.
Quando ocorre uma alteração de visualização, uma partição pode aumentar ou diminuir:
- Se um novo silo se juntou ao cluster, as partições existentes podem diminuir para criar espaço.
- Se um silo tiver abandonado o cluster, as partições restantes podem expandir-se para assumir os intervalos órfãos.
Os registros de diretório devem ser transferidos do proprietário antigo para o novo proprietário antes que as solicitações possam ser atendidas. O processo de transferência segue estes passos:
- O proprietário anterior sela o alcance e cria um instantâneo das suas entradas de diretório.
- O novo proprietário solicita e aplica o instantâneo.
- O novo proprietário começa a atender as solicitações para a gama.
- O proprietário anterior é notificado e apaga o instantâneo.
Processo de recuperação
Quando um host falha sem entregar corretamente suas partições de diretório, os proprietários de partições subsequentes devem executar a recuperação. Isto envolve:
- Consultando todos os silos ativos no cluster para obter os seus registos de grãos.
- Reconstruindo o estado do diretório para intervalos afetados.
- Garantir que não haja ativações duplicadas de grãos.
A recuperação também é necessária quando as alterações de associação ao cluster acontecem rapidamente. Embora a associação ao cluster garanta a monotonicidade, é possível que os silos percam as visões intermediárias de associação. Nesses casos:
- As transferências de instantâneos são abandonadas.
- A recuperação é realizada em vez da transferência normal de partição para partição.
- O sistema mantém a consistência apesar da falta de estados intermédios.
Uma melhoria futura na associação ao cluster pode reduzir ou eliminar esses cenários, garantindo que todos os silos tenham acesso a todas as visões.