Boki: computação serverless com estado usando shared logs
Título original: Boki: Stateful Serverless Computing with Shared Logs
PublicadoProceedings of the ACM SIGOPS 28th Symposium on Operating Systems Principles
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
Boki é um novo runtime serverless que exporta uma API de shared log para funções serverless. Os shared logs do Boki permitem que aplicações serverless com estado gerenciem seu estado com durabilidade, consistência e tolerância a falhas. Os shared logs do Boki alcançam alto throughput e baixa latência. O principal viabilizador é o metalog, um mecanismo novo que permite ao Boki tratar ordenação, consistência e tolerância a falhas de forma independente. O metalog ordena os registros do shared log com alto throughput e oferece consistência de leitura, ao mesmo tempo que permite aos provedores de serviço otimizar os caminhos de escrita e de leitura do shared log de maneiras diferentes. Para demonstrar o valor dos shared logs para aplicações serverless com estado, construímos bibliotecas de suporte do Boki que implementam workflows tolerantes a falhas, armazenamento durável de objetos e filas de mensagens. Nossa avaliação mostra que os shared logs podem acelerar cargas de trabalho serverless importantes em até 4,7×.
Tradução nossa do resumo original dos autores, em inglês.
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
Funções serverless não têm estado, mas as aplicações construídas com elas têm. No exemplo do artigo, uma reserva de viagem chama uma função para hotéis e outra para voos, e qualquer uma pode falhar no meio do caminho, deixando estado inconsistente para trás. Zhipeng Jia e Emmett Witchel apresentam o Boki no SOSP 2021 como um runtime FaaS, construído sobre o sistema Nightcore dos próprios autores, em que as funções gerenciam estado por meio de um shared log em vez de um armazenamento put/get.
Um shared log é um log totalmente ordenado em que muitos clientes fazem append e leem de forma concorrente. Tango e vCorfu mostraram que shared logs podem sustentar objetos consistentes e duráveis, e o Boki toma do Scalog o seu protocolo de ordenação. O problema novo é o ambiente serverless: não há garantia de que a memória da função sobreviva entre invocações, o armazenamento fica separado da computação e muitos logs precisam dividir o hardware com eficiência.
Vale conhecer antes: replicação de máquina de estados, quóruns, as garantias de leitura chamadas monotonic reads e read-your-writes, e a separação entre replicar registros e ordená-los.
Contribuição
- A API LogBook. Cada invocação de função fica ligada a um LogBook, com chamadas de append, leitura e trim. Tags selecionam sub-streams, então um leitor pula registros que não lhe interessam.
- O metalog. Cada log físico tem um metalog que registra suas transições internas de estado. Fazer append nele decide a ordem total, comparar posições nele garante a consistência de leitura, e selá-lo pausa o log para a reconfiguração. O artigo o chama de "the Answer to Everything" no Boki.
- Um índice de log nos nós de função. Muitos LogBooks são multiplexados em um log físico e os registros podem cair em qualquer shard. Os LogBook engines, ao lado das funções, mantêm um índice compacto e um cache de registros, o que separa o caminho de leitura do caminho de escrita.
- Dados auxiliares. Um cache por registro, de melhor esforço, que poupa as funções de um replay completo do log.
- Três bibliotecas de suporte. BokiFlow adapta os workflows tolerantes a falhas do Beldi, BokiStore adapta os objetos transacionais do Tango com snapshot isolation, e BokiQueue adapta a replicação de máquina de estados composta do vCorfu.
Metodologia
No append, um LogBook engine numera o registro localmente e o replica para os nós de armazenamento do seu shard. Esses nós enviam periodicamente vetores de progresso ao sequenciador primário, que calcula o mínimo elemento a elemento e o adiciona ao metalog, ordenando registros entre shards. O próprio metalog usa um protocolo guiado pelo primário: só o primário faz append, e cada entrada espera um quórum de sequenciadores. Cada função acompanha uma posição no metalog, e uma leitura fica suspensa se o índice local estiver atrás dela.
Os registros ficam no RocksDB, nos nós de armazenamento. Os experimentos rodaram em instâncias EC2 c5d.2xlarge com SSDs NVMe em uma única região, com registros e metalogs replicados três vezes por padrão.
A avaliação tem microbenchmarks e uma comparação por biblioteca. O BokiFlow roda as cargas de filmes e viagens do Beldi contra o Beldi portado para o Nightcore. O BokiStore roda uma carga inspirada no Retwis contra o MongoDB. O BokiQueue roda contra o Amazon SQS e o Apache Pulsar.
Resultados
Estes são os resultados informados pelos autores.
- Appends. Um LogBook chegou a 1,2M Ops/s com 64 nós e 2.560 funções concorrentes, com latência mediana de 2,03 ms e p99 de 6,42 ms.
- Leituras. Um acerto no cache local leva 121 µs. A mediana é de 0,57 ms em uma falha do cache local e de 0,79 ms por um engine remoto.
- Virtualização. Quatro logs físicos sustentaram 100K LogBooks a 446,9 KOp/s, contra 458,2 KOp/s para 100 LogBooks. Sob carga Zipf assimétrica (s = 5), o índice de log entregou 278,6 KOp/s e o sharding fixo, 129,6.
- Reconfiguração. Os appends voltaram à latência normal em até 100 ms, e o protocolo em si levou 15,7 ms com três sequenciadores.
- BokiFlow. A latência mediana foi de 26 ms contra 121 ms do Beldi em avaliações de filmes a 200 requisições por segundo (4,7×), e de 18 ms contra 78 ms em viagens a 500 (4,3×). Em relação a uma baseline sem semântica exactly-once, o custo é de 3,0× e 1,8×.
- BokiStore. O throughput foi de 1,18 a 1,25× o do MongoDB e as transações foram até 2,3× mais rápidas, mas as leituras não transacionais foram mais lentas.
- BokiQueue. O throughput foi de 1,66 a 2,14× o do SQS, com latência até 15× menor, e de 1,06 a 1,23× o do Pulsar, com latência até 2,0× menor.
Análise crítica
Usar um único mecanismo para ordenação, consistência e reconfiguração é um resultado limpo. Vários limites são declarados no próprio artigo.
- O replay do log é caro. Os autores atribuem ao replay do log a lentidão das leituras não transacionais: UserLogin levou 1,47 ms na mediana, contra 0,86 ms do MongoDB. Sem dados auxiliares, o Retwis caiu para 939 Op/s aos três minutos, contra 11.078 com eles, e a tabela não traz resultado para execuções mais longas.
- A localidade não é automática. A comparação do BokiStore usou o melhor caso, com índice em todos os 8 nós de função, e ainda assim o artigo diz que "In a large-scale deployment, having all LogBook engines maintain an index for a particular physical log is not viable." Com 25% de leituras locais, o Retwis manteve 77% do throughput máximo.
- Os dados auxiliares precisaram de um segundo projeto. Com cache de 16 MB, o throughput caiu para 3.561 Op/s. Guardar uma cópia dos dados auxiliares nos nós de armazenamento o levou de volta a 11.358, o que se afasta do armazenamento mais simples, só no nó de função, descrito na seção de projeto.
Outros limites vêm da leitura da avaliação.
- O número de destaque tem um oponente específico. Os 4,7× comparam a latência mediana, em um único ponto de carga, com uma camada de log construída sobre o DynamoDB. Contra MongoDB e Pulsar, os melhores ganhos de latência são de 2,3× e 2,0×, com ganhos de throughput de até 1,25× e 1,23×, e no caso saturado de fila 4:1 o Pulsar tem o melhor p99 nas três configurações, como 12,7 ms contra 27,3 ms.
- A reconfiguração foi testada sob comando. O experimento migra para sequenciadores já provisionados. Quedas de nós de armazenamento ou de LogBook engines, e o tempo para detectá-las, não são medidos.
- A durabilidade do metalog é condicional. No protótipo, os metalogs "are replicated in the DRAM of sequencer nodes", o que o artigo aceita sob a suposição de que um quórum de sequenciadores continua vivo. Uma perda correlacionada desse quórum fica fora da avaliação.
- Elasticidade e custo são mais afirmados que testados. As implantações são medidas em tamanhos fixos, e nem o preço de nós dedicados de armazenamento e de sequenciadores nem a interferência entre LogBooks em um mesmo log físico são medidos.
O FlexLog afirma depois ter throughput de armazenamento e latência de ordenação melhores que os do Boki. Esse é um resultado do próprio FlexLog, na sua configuração camada por camada.
Pesquisas futuras
- Como um escalonador FaaS deve posicionar funções quando os engines não conseguem indexar todos os logs físicos?
- Quanto custa um metalog durável em comparação com a replicação em DRAM, e quais falhas ele cobriria?
- Checkpoints podem se combinar com dados auxiliares para limitar o replay em objetos muito lidos?
- Como o Boki se comporta com quedas de nós de armazenamento e falhas correlacionadas de sequenciadores?
- Quanto os inquilinos que dividem um log físico interferem uns nos outros, e quanto isso custa em comparação com bancos de dados na nuvem?
Texto completo
Discussão · 0
Entre para participar da discussãoNenhum post ainda. Seja o primeiro a iniciar a discussão.