Implementação do diretório de granularidade
Visão geral e arquitetura
O diretório de grãos em Orleans é um repositório chave-valor em que a chave é um identificador de grãos e o valor é uma entrada de registro que aponta para um silo ativo que (potencialmente) hospeda o grão.
Embora Orleans forneça uma implantação padrão de diretório distribuído em memória (descrito neste artigo), o sistema de diretório de granularidade é projetado para ser conectável. Os desenvolvedores podem implementar seu próprio diretório implementando a interface IGrainDirectory
e registrando-a na coleção de serviços do silo. Isso permite implementações de diretório personalizado que podem usar diferentes back-ends de armazenamento ou modelos de consistência para atender melhor aos requisitos de aplicativo específicos. Desde a introdução do novo diretório de consistência forte, há pouca necessidade de implantações de diretórios externos, mas a API permanece para compatibilidade com versões anteriores e flexibilidade. O diretório de grãos pode ser configurado por tipo de grão.
Para otimizar o desempenho, as pesquisas de diretório são armazenadas em cache localmente em cada silo. Isso significa que as leituras de diretório potencialmente remoto só são necessárias quando a entrada de cache local está ausente ou inválida. Esse mecanismo de cache reduz a sobrecarga e a latência da rede 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 em Orleans v9.0, baseado na metodologia de Sincronia Virtual em duas fases e também estruturado como uma tabela de hash distribuída, mas com balanceamento de carga aprimorado por meio do uso de nós virtuais. Este artigo descreve a última implantação de diretório de granularidade, mais recente.
Diretório distribuído de grãos
O diretório de grãos distribuído em Orleans oferece forte consistência, balanceamento de carga uniforme, alto desempenho e tolerância a falhas. A implementação segue um design de duas fases baseado na metodologia Virtual Synchrony, com semelhanças ao Vertical Paxos.
As partições de diretório têm dois modos de operação:
- Operação normal: as partições processam solicitações localmente sem coordenação com outros hosts.
- Alteração de exibição: os hosts coordenam entre si a transferência de propriedade de intervalos de diretórios.
O diretório utiliza o sistema de associação de cluster de consistência forte Orleans, em que as configurações chamadas "exibições" têm números de versão monotonicamente crescentes. À medida que os silos entram e saem do cluster, são criadas visualizações sucessivas, resultando em alterações na propriedade do intervalo.
Todas as operações de diretório incluem coordenação de exibição:
- As solicitações contêm o número de visualização do autor da chamada.
- As respostas incluem o número de exibição da partição.
- Problemas de incompatibilidade de números disparam a sincronização.
- As solicitações são automaticamente tentadas novamente em mudanças 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 atribuídos aos silos ativos no cluster. Identificadores de granularidade são são transformados em hash para localizar o silo que possui a seção do anel correspondente ao 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, em que 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, pois cada partição deve ser coordenada potencialmente com várias outras partições.
Exibir o procedimento de alteração
As partições de diretório (implementadas em GrainDirectoryPartition
) usam bloqueios de intervalo versionados para impedir o acesso inválido a intervalos durante as alterações de exibições de visualização. Os bloqueios de intervalo são criados durante a alteração de exibição e são liberados quando a alteração de exibição é concluída. Esses bloqueios são análogos às 'cunhas' usadas na metodologia de Sincronização Virtual.
Quando ocorre uma alteração de exibição, uma partição pode crescer ou reduzir:
- Se um novo silo tiver ingressado no cluster, as partições existentes poderão diminuir para abrir espaço.
- Se um silo deixar o cluster, as partições restantes poderão crescer e assumir os intervalos órfãos.
Os registros de diretório devem ser transferidos do antigo proprietário para o novo proprietário antes que as solicitações possam ser atendidas. O processo de transferência segue estas etapas:
- O proprietário anterior lacra o intervalo e cria um instantâneo de seus entradas de diretório.
- O novo proprietário solicita e aplica o instantâneo.
- O novo proprietário começa a atender às solicitações para o intervalo.
- O proprietário anterior é notificado e exclui a imagem.
Processo de recuperação
Quando um host falha sem entregar corretamente suas partições de diretório, os proprietários de partição subsequentes devem executar a recuperação. Isso envolve:
- Consultando todos os silos ativos no cluster para obter seus registros de granularidade.
- Recriando o estado do diretório para intervalos afetados.
- Garantindo que não ocorram ativações de granularidade duplicadas.
A recuperação também é necessária quando as alterações de associação de cluster ocorrem rapidamente. Embora a associação ao cluster garanta a monotonicidade, é possível que os silos não tenham visualizações intermediárias de associação. Nesses casos:
- As transferências de instantâneo 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 dos estados intermediários ausentes.
Uma melhoria futura na associação ao cluster pode reduzir ou eliminar esses cenários, garantindo que todas as visões sejam compartilhadas por todos os silos.