O FuzzyLog: um shared log parcialmente ordenado
Título original: The FuzzyLog: A Partially Ordered Shared Log
Publicado13th USENIX Symposium on Operating Systems Design and Implementation (OSDI 18)
Saiu em uma revista, congresso ou livro, que normalmente avaliam o trabalho antes de aceitar. Mesmo assim, um único estudo nunca é a palavra final.
Resumo
Este paper não tem resumo disponível.
Análise de pesquisa
Escrita pelo Kurz, não pelos autores do paper. O resumo acima é dos próprios autores.
- Última revisão
- Versão
- 1.0
Visão geral
Sistemas de shared log como o Corfu e o Tango constroem serviços de plano de controle como camadas finas sobre um único log totalmente ordenado. Neste artigo do OSDI 2018, Lockerman e colegas mantêm esse estilo de projeto, mas argumentam que uma ordem total em todo o sistema é cara, muitas vezes impossível e em geral desnecessária. Um sequenciador limita o throughput e acrescenta idas e voltas para clientes distantes; uma ordem total consistente com linearizabilidade fica sujeita a indisponibilidade durante partições de rede; e atualizações em dados disjuntos não precisam de ordem nenhuma.
O FuzzyLog é um grafo acíclico dirigido de atualizações. As cores representam shards de dados, e cada cor é um conjunto de chains totalmente ordenadas, uma por região, unidas por ligações cruzadas que registram causalidade. Cada região guarda uma cópia completa, atual para suas próprias chains e possivelmente defasada para as demais. Com uma cor em uma região, ele se reduz a um shared log comum.
Vale conhecer antes: shared logs e replicação de máquina de estados, consistência causal, a diferença entre linearizabilidade e serializabilidade, a conjectura CAP e CRDTs.
Contribuição
- A abstração. Uma API pequena:
appendem uma ou mais cores,syncpara reproduzir uma cor e receber um snapshot ID, etrim. Um nó novo ganha arestas cruzadas para o último nó que o cliente viu em cada chain remota. - Semântica por escopo. Operações em uma cor entre regiões são causalmente consistentes. Dentro de uma região são serializáveis, e linearizáveis quando tocam uma única cor.
- Projetos de aplicação. O ShardedMap escala por cor, o AtomicMap acrescenta multi-puts, o TXMap reaproveita o protocolo de transações do Tango para ter serializabilidade estrita, o CRDTMap dá consistência causal+ e o CAPMap dá linearizabilidade sem partições e consistência causal+ durante elas.
- Dapple. Cada cor mora em uma partição de chainservers em memória, replicada por chain replication. As chains remotas chegam como shadow logs por sincronização periódica.
- Uma variante tolerante a falhas do algoritmo de Skeen para appends em várias cores. Leases, fencing e write-ahead logging permitem que outro cliente termine o append se o cliente de origem cair. Appends de uma cor levam uma fase, os de várias cores levam duas, e a recuperação, três.
Metodologia
Os autores avaliam os projetos em instâncias Amazon EC2 c4.2xlarge, na maior parte dentro de uma região, com execuções geodistribuídas entre Ohio e Tóquio, a 168 ms de ping médio. O Dapple roda com duas réplicas por partição, salvo indicação em contrário.
Os experimentos comparam o Dapple com uma emulação do protocolo de append do Tango construída dentro do Dapple, com cinco partições mais um sequenciador sem réplica; rodam o AtomicMap com chaves e valores de 8 bytes em 8 a 16 chainservers sem replicação; rodam o CRDTMap em cinco servidores em regiões virtuais dentro de uma região EC2; rodam o CAPMap durante 14 segundos, com uma partição simulada do segundo 6 ao segundo 8; e rodam o DappleZK, um clone do ZooKeeper, contra o ZooKeeper em DRAM. Para a correção, escreveram provas convencionais e uma prova verificada por máquina em Coq do protocolo de recuperação, omitida por falta de espaço.
Resultados
Estes são os resultados relatados pelos autores.
- As aplicações são pequenas. O ShardedMap tem 193 linhas, o AtomicMap 201, o CRDTMap 284, o TXMap 417, o CAPMap 424 e o DappleZK 1881.
- O sequenciador é o limite na emulação. O Tango emulado não escalou além de quatro clientes. O Dapple escalou de forma quase linear sem appends de várias cores, foi 2X mais rápido com 1%, empatou com o Tango com 10% e ficou atrás com 100%, quando a ordem parcial exigida é quase uma ordem total.
- O AtomicMap escala. O artigo relata mais de 5,5M puts/s e quase 1M multi-puts de 2 chaves/s em 16 servidores Dapple.
- A carga vira defasagem. Um pico de puts no CRDTMap não atrasou os gets do leitor e apareceu como staleness.
- O CAPMap troca de modo. Sem partição, as duas regiões tiveram consistência forte, e a secundária pagou os 168 ms de ida e volta. Durante a partição, a secundária passou para uma chain local, com latência bem menor e consistência mais fraca, enquanto a primária manteve a consistência forte.
- DappleZK. O resumo dá 3M/s de escritas em uma única chave e 150K/s de renames atômicos entre shards em 6 nós. O ZooKeeper entregou 36K e 66K ops/s com uma e duas partições.
Análise crítica
O resultado central é crível: quando uma carga se particiona bem, tirar o sequenciador global tira o gargalo dele. A evidência para as afirmações mais amplas é mais irregular.
Limites que o próprio artigo declara:
- Os números do AtomicMap são sem replicação. O artigo admite que a implantação rodou sem replicação por causa de limites de instâncias no EC2. A durabilidade também é uma suposição: os chainservers ficam em memória, e a implementação conta com DRAM com bateria.
- A falha é mais argumentada que medida. Um cliente que cai bloqueia as cores envolvidas até a recuperação, e o artigo admite um pico de latência e um possível livelock. A recuperação só é medida como latência em uma implantação com pouca carga, e supõe-se que partições replicadas não falham.
- Os autores relativizam a distância para o ZooKeeper. Eles esperam que a vitória com uma partição venha em grande parte de Rust contra Java e de protótipo contra código de produção, e os renames no ZooKeeper foram emulados com um delete e um create.
Pontos que decorrem da leitura da avaliação:
- A comparação com o Tango é uma emulação. O artigo conclui que sequenciadores centralizados em shared logs existentes limitam a escalabilidade de forma fundamental, mas o experimento mostra um gargalo de sequenciador dentro do Dapple, não o comportamento do Tango nem do vCorfu, que o artigo coloca na mesma classe. A vantagem também some com 10% de appends em várias cores.
- O "impossible" é mais estreito do que parece. Significa indisponível durante uma partição. Na motivação, as taxas exigidas do sequenciador são contas sobre larguras de banda e tamanhos de payload supostos, comparadas a medições publicadas de sequenciadores reais.
- A garantia do AtomicMap aparece de dois jeitos. A introdução o chama de linearizável, enquanto a Seção 4.1 diz que ele é serializável, não linearizável nem estritamente serializável.
- A ordem parcial passa trabalho para a aplicação. O requisito de escalabilidade supõe carga distribuída por igual entre as cores, e a avaliação não testa assimetria de carga. O
syncreproduz uma cor, logo a API como descrita não oferece snapshot entre cores, a propriedade que o vCorfu tira de sua ordem total. - A evidência geográfica é escassa. O CRDTMap rodou em regiões virtuais, e o CAPMap em duas regiões, com uma partição de dois segundos. O custo de armazenamento não é informado, embora a eficiência de espaço seja um requisito declarado.
Pesquisas futuras
- Repetir o experimento do AtomicMap com replicação e durabilidade, na mesma escala.
- Lidar com cores muito disputadas, por exemplo movendo ou dividindo uma cor entre partições.
- Se é possível oferecer snapshots entre cores sem trazer de volta a coordenação global.
- Consistência causal entre shards, que os autores esboçam como COPSMap e deixam para trabalho futuro.
- O CAPMap com mais de duas regiões e com falha da região primária.
Texto completo
Discussão · 0
Entre para participar da discussãoNenhum post ainda. Seja o primeiro a iniciar a discussão.