An in-depth look at database and cache internals, and the tradeoffs in each. A ScyllaDB gostaria de reconhecer publicamente dormando (Memcachediner) e Danny Kopping por suas contribuições para este projeto, bem como agradecê-los pelo seu apoio e paciência. Dormindo Danny Coutinho Os engenheiros por trás do ScyllaDB – o banco de dados para desempenho previsível em escala – uniram forças com o Memcached maintenance dormando para comparar ambas as tecnologias face a face, de uma forma colaborativa e neutra do fornecedor. Os resultados revelam que: Tanto o Memcached como o ScyllaDB maximizaram os discos e a largura de banda da rede, enquanto eram estressados em condições semelhantes, mantendo um desempenho semelhante em geral. Enquanto o ScyllaDB exigia mudanças de modelagem de dados para saturar completamente a capacidade de transmissão da rede, o Memcached exigia fios IO adicionais para saturar a I/O do disco. Embora o ScyllaDB mostrasse melhores latências quando comparado com as solicitações de tubulação do Memcached para o disco, as latências do Memcached eram melhores para solicitações individuais. Este documento explica a nossa motivação para estes testes, fornece um resumo dos cenários e resultados testados, em seguida, apresenta recomendações para qualquer pessoa que possa estar decidindo entre ScyllaDB e Memcached. Há também com uma visão mais ampla dos testes e resultados e links para as configurações específicas que você pode usar para realizar os testes sozinho. um Gitbook detalhado para este projeto, Bônus: dormando e eu recentemente discutimos este projeto no P99 CONF, uma conferência altamente técnica sobre desempenho e engenharia de baixa latência. Observe a demanda Eu estava dormindo e eu recentemente discutiu este projeto em , uma conferência altamente técnica sobre desempenho e engenharia de baixa latência. Bonus: P99 CONF Watch on demand Observe a demanda Por que fizemos isso? Em primeiro lugar, a ScyllaDB investiu muito tempo e recursos de engenharia na otimização do nosso banco de dados para fornecer latências baixas previsíveis para aplicações intensivas de dados em tempo real. Arquitetura não compartilhada, e (abandonando completamente o cache da página do Linux) são alguns exemplos notáveis de tais otimizações. Shard-per-núcleo Userspace I/O Calendário Implementação de cache interno Em segundo lugar: o desempenho converge ao longo do tempo. as cache na memória têm sido (por um longo tempo) consideradas como um dos componentes de infraestrutura mais rápidos ao redor. No entanto, já se passaram alguns anos desde que as soluções de cache começaram a olhar para o reino dos discos flash. If an in-memory cache can rely on flash storage, then why can’t a persistent database also work as a cache? 3 – Já discutimos e recentemente explorou como as equipes específicas tiveram êxito . 7 razões para não colocar um cache na frente de seu banco de dados Substituir suas cache com ScyllaDB Quarto: No P99 CONF do ano passado, Danny Kopping nos deu uma palestra esclarecedora, , onde ele explicou como a Memcached Extstore ajudou a Grafana Labs a escalar sua pegada de cache 42x, reduzindo os custos. Esconda-me se puder E finalmente, apesar das críticas (validas) que os benchmarks de desempenho recebem, eles ainda desempenham um papel importante no impulso da inovação. Agora vamos à comparação. Instalação Instâncias Os testes foram realizados usando os seguintes tipos de instâncias da AWS: Carregador: c7i.16xlarge (64 vCPUs, 128GB de RAM) Memcached: i4i.4xlarge (16 vCPUs, 128GB de RAM, 3.75TB NVMe) ScyllaDB: i4i.4xlarge (16 vCPUs, 128GB de RAM, 3.75TB NVMe) Todos os órgãos podem entregar 25Gbps de largura de banda da rede. Tenha em mente que, especialmente durante os testes de maximizar a capacidade prometida da rede, notamos . para cima reduzir a largura de banda até a capacidade da linha de base das instâncias Optimizações e configurações Para superar potenciais entraves, foram aplicadas as seguintes otimizações e configurações: Todas as instâncias usaram uma estratégia de colocação de cluster, seguindo os AWS Docs: “Esta estratégia permite que as cargas de trabalho alcancem o desempenho de rede de baixa latência necessário para a comunicação de nó a nó estreitamente ligada que é típica das aplicações de computação de alto desempenho (HPC).” Memcached: Versão 1.6.25, compilada com Extstore habilitado. Exceto onde denotado, executado com 14 fios, acoplados a CPUs específicas. As 2 vCPUs restantes foram atribuídas à CPU 0 (core & HT sibling) para lidar com IRQs de rede, conforme especificado pelo modo sq_split no seastar perftune.py. As operações CAS foram desativadas para economizar espaço em per-item overhead. Os argumentos de linha de comando completos foram:taskset -c 1-7,9-15 /usr/local/memcached/bin/memcached -v -A -r -m 114100 -c 4096 -lock-memory -threads 14 - scylla -C ScyllaDB: configurações padrão como configurado pelo ScyllaDB Enterprise 2024.1.2 AMI (ami-id: ami-018335b47ba6bdf9a) em um i4i.4xlarge. Estressantes Para carregadores Memcached, usamos , parte do pacote de testes oficial do memcached. Os perfis de enfatização aplicáveis estão na Repositório do GitHub. mcshredder Feijão / Shredders Para ScyllaDB, usamos , como enviado com o ScyllaDB, e especificou cargas de trabalho comparáveis como as usadas para o Memcached. Cassandra Estresse Testes e resultados O seguinte é um resumo dos testes que realizamos e seus resultados.Se você quiser uma descrição e análise mais detalhadas, vá para . A extensão do texto deste projeto Eficiência RAM Quanto mais itens você puder caber na RAM, melhor será a sua chance de obter hits de cache. Mais hits de cache resultam em acesso significativamente mais rápido do que ir para o disco. Este projeto começou medindo quantos itens poderíamos armazenar em cada datastore. Ao longo de nossos testes, a chave estava entre 4 a 12 bytes (key0 .. keyN) para Memcached, e 12 bytes para ScyllaDB. O valor foi fixado em 1000 bytes. Mãe O Memcached armazenou cerca de 101 milhões de itens até que a expulsão começou. É eficiente em memória. Da memória atribuída 114G do Memcached, este é cerca de 101G de valores, sem considerar o tamanho da chave e outras bandeiras: ScyllaDB O ScyllaDB armazenou entre 60 a 61 milhões de itens antes que as expulsões começassem.Isso não é surpreendente, dado que seu protocolo requer mais dados para serem armazenados como parte de uma escrita (como o timestamp de escrita desde a época, a vida de linha, etc).O ScyllaDB também persiste dados para o disco à medida que você vai, o que significa que os filtros Bloom (e, opcionalmente, índices) precisam ser armazenados na memória para pesquisas subsequentes de disco. Takeaways O Memcached armazenou cerca de 65% mais itens na memória do que o ScyllaDB. As linhas ScyllaDB têm uma superioridade por item para suportar uma orientação de coluna ampla. No ScyllaDB, filtros Bloom, cache de índice e outros componentes também são armazenados na memória para suportar buscas de disco eficientes, contribuindo para outra camada de sobrecarga. Carga de trabalho in-memory somente de leitura O A carga de trabalho (embora irreal) para uma memória cache é aquela em que todos os dados se encaixam na RAM – para que as leituras não necessitem de acesso ao disco e não ocorram evicções ou omissões.Tanto o ScyllaDB quanto o Memcached empregam a lógica LRU (Least Recently Used) para liberar a memória: Quando o sistema está a correr sob pressão, os itens são expulsos da cauda da LRU; estes são tipicamente os itens menos ativos. O ideal Tirar as evicções e as ausências de cache da imagem ajuda a medir e definir uma linha de base de desempenho para ambos os armazéns de dados. Ele coloca o foco no que mais importa para esses tipos de cargas de trabalho: leitura e latência de pedido. Neste teste, primeiro aquecemos ambas as lojas com os mesmos tamanhos de carga útil usados durante o teste anterior. Memcached O Memcached alcançou impressionantes 3 milhões de Gets por segundo, maximizando totalmente a largura de banda da AWS NIC (25 Gbps)! Memcached manteve um ritmo constante de 3M rps, maximizando totalmente a capacidade de transmissão NIC O parêntese Mostrar que p99.999 respostas completadas abaixo de 1ms: Resultados Conteúdo do cmd_get: Total de Operações: 5503513496 Rata: 3060908/s === horas mg === horas 1 a 10 0 0 000% 10-99us 343504394 6.238% 100-999us 5163057634 93.762% 1-2ms 11500 0.00021% ScyllaDB Para ler mais linhas no ScyllaDB, precisávamos conceber um modelo de dados melhor para as solicitações do cliente devido às características do protocolo (em particular, sem pipelining).Com uma chave de agrupamento, poderíamos maximizar totalmente a cache do ScyllaDB, resultando em uma melhoria significativa no número de linhas cacheadas. Como resultado, o número de registros dentro da cache melhorou significativamente em comparação com os números de valor-chave mostrados anteriormente. Como dormando indicou corretamente (obrigado!), esta configuração é significativamente diferente da configuração anterior do Memcached.Enquanto a carga de trabalho do Memcached sempre atinge um par de valores de chave individual, uma única solicitação no ScyllaDB resulta em várias linhas sendo devolvidas. Explique as razões dessas mudanças Lá, cobrimos características do protocolo CQL (como o overhead por item [em comparação com memcached] e nenhum suporte para pipelining) que tornam as partições largas mais eficientes no ScyllaDB do que as capturas de chave única. No livro detalhado Com esses ajustes, nossos carregadores executaram um total de 187K de leituras por segundo durante 30 minutos. Semelhante ao memcached, o ScyllaDB também maximizou a capacidade de transmissão do NIC. Ele serviu aproximadamente 3M linhas/segundo exclusivamente a partir de dados na memória: O ScyllaDB expõe informações de latência do lado do servidor, o que é útil para analisar a latência sem a rede. Durante o teste, a latência do lado do servidor p99 do ScyllaDB permaneceu dentro dos limites de 1ms: Os percentis do lado do cliente são, sem surpresa, mais altos do que a latência do lado do servidor com um leitor P99 de 0,9ms. Takeaways Tanto o Memcached quanto o ScyllaDB saturaram completamente a rede; para evitar a saturação dos pacotes de rede máximos por segundo, o Memcached se baseou no pipelining de solicitações, enquanto o ScyllaDB foi alterado para uma orientação de coluna ampla. O cache do ScyllaDB mostrou ganhos consideráveis seguindo um esquema de coluna ampla, capaz de armazenar mais itens em comparação com a orientação de valor-chave simples anterior. No nível de protocolo, o protocolo do Memcached é mais simples e leve, enquanto o CQL do ScyllaDB oferece recursos mais ricos, mas pode ser mais pesado. Adicionar discos à imagem A medição do desempenho do armazenamento em flash introduz seu próprio conjunto de desafios, o que torna quase impossível caracterizar completamente uma determinada carga de trabalho de forma realista. Para testes relacionados a discos, decidimos medir a situação mais pessimista: Compare ambas as soluções que servem dados (principalmente) do armazenamento de blocos, sabendo que: A probabilidade de cargas de trabalho realistas fazendo isso é perto de zero Os usuários devem esperar números entre a carga de trabalho de cache otimista anterior e a carga de trabalho de disco pessimista na prática Memcached Extstore O Ele fornece detalhes extensivos sobre o funcionamento interno da solução. Em um nível alto, ele permite que o memcached mantenha sua tabela de hash e chaves na memória, mas armazene valores em armazenamento externo. Página do Wiki Durante os nossos testes, nós povoamos memcached com itens 1.25B com um tamanho de valor de 1KB e um tamanho de tecla de até 14 bytes: Com o Extstore, armazenamos cerca de 11X o número de itens em comparação com a carga de trabalho anterior na memória até que as evicações começaram a entrar (como mostrado no painel da mão direita na imagem acima). Read-Only Performance Para os testes de desempenho reais, enfatizamos o Extstore contra tamanhos de item de 1KB e 8KB. A tabela abaixo resume os resultados: Test Type Items per GET Payload Size IO Threads GET Rate P99 perfrun_metaget_pipe 16 1KB 32 188K/s 4~5 ms perfrun_metaget 1 1KB 32 182K/s <1ms perfrun_metaget_pipe 16 1KB 64 261K/s 5~6 ms perfrun_metaget 1 1KB 64 256K/s 1~2ms perfrun_metaget_pipe 16 8KB 16 92K/s 5~6 ms perfrun_metaget 1 8KB 16 90K/s <1ms perfrun_metaget_pipe 16 8KB 32 110K/s 3~4 ms perfrun_metaget 1 8KB 32 105K/s <1ms Página inicial_metaget_pipe 16 1 kB 32 188 c/s 4 a 5 ms Metrô_Metágio 1 1 kB 32 182 c/s > 1 ms Página inicial_metaget_pipe 16 1 kB 64 261 c/s 5 a 6 ms Metrô_Metágio 1 1 kB 64 256 c/s 1 a 2 ms Página inicial_metaget_pipe 16 8 kB 16 90k/s 5 a 6 ms Metrô_Metágio 1 8 kB 16 90k/s > 1 ms Página inicial_metaget_pipe 16 8 kB 32 110k / s 3 a 4 ms Metrô_Metágio 1 8 kB 32 105 c/s > 1 ms ScyllaDB Populamos o ScyllaDB com o mesmo número de itens que usamos para memcached. Embora o ScyllaDB mostrasse taxas de GET mais altas do que o memcached, ele o fez com latências de cauda ligeiramente mais altas em comparação com as cargas de trabalho não pipelining do memcached. Isto é resumido abaixo: Test Type Items per GET Payload Size GET Rate Server-side P99 Client-side P99 1KB Read 1 1KB 268.8K/s 2ms 2.4ms 8KB Read 1 8KB 156.8K/s 1.54ms 1.9ms 1 kB de leitura 1 1 kB 268.8K por segundo 2Ms 2.4 Mês 8 kB de leitura 1 8 kB 156.8 K / s 1o 54ms 1.9 Mês Takeaways A Extstore precisou de um ajuste considerável para suas configurações, a fim de saturar completamente o flash I/O. Devido à arquitetura Memcached, cargas úteis menores não são capazes de aproveitar plenamente o espaço disponível no disco, proporcionando ganhos menores em comparação com o ScyllaDB. As taxas do ScyllaDB eram, em geral, mais altas do que as do Memcached em uma orientação de valor-chave, especialmente sob tamanhos de carga útil mais altos. Sobrecarga de trabalho Seguindo nossos resultados anteriores de disco, então comparamos ambas as soluções em uma carga de trabalho de leitura-principalmente visando a mesma capacidade de transmissão (250K ops/sec). , com 10% de overwrites aleatórios. É considerado um “semi-pior cenário”. Teste “básico” para Extstore Memcached Embora as taxas de escrita permaneçam estáveis durante a duração do teste, observamos que as leituras flutuaram ligeiramente : Ao longo da corrida Também observamos um pouco mais de As métricas apesar das taxas de leitura reduzidas, mas as latências ainda permaneceram baixas. Exposição_eu_queue Operation IO Threads Rate P99 Latency cmd_get 64 224K/s 1~2 ms cmd_set 64 24.8K/s <1ms CMD - GET 64 224 c/s 1 a 2 ms CMD - Conjunto 64 24,8 K/s > 1 ms ScyllaDB O teste ScyllaDB foi executado usando 2 carregadores, cada um com metade da taxa-alvo.Embora o ScyllaDB tenha alcançado uma taxa de transmissão ligeiramente maior (259.5K), as latências de escrita foram mantidas baixas ao longo da execução e as latências de leitura foram maiores (semelhante ao memcached): A tabela abaixo resume os resultados de execução do lado do cliente entre os dois carregadores: Loader Rate Write P99 Read P99 loader1 124.9K/s 1.4ms 2.6 ms loader2 124.6K/s 1.3ms 2.6 ms Carregador1 124,9 K/s 1.4 Mês 2.6 Mês Carregador2 124,6 K/s 1.3 Mês 2.6 Mês Takeaways Tanto as taxas de escrita Memcached quanto ScyllaDB foram estáveis, com leituras ligeiramente flutuando ao longo da corrida. ScyllaDB escreve ainda conta para o comitlog overhead, que fica no caminho de escrita quente As latências do lado do servidor do ScyllaDB foram semelhantes às observadas nos resultados do Memcached, embora as latências do lado do cliente fossem ligeiramente mais altas. Leia uma análise mais detalhada no Gitbook para este projeto Embrulhar Tanto o memcached quanto o ScyllaDB conseguiram maximizar a utilização do hardware subjacente em todos os testes e manter as latências previsivelmente baixas. Se a sua carga de trabalho existente pode acomodar um modelo de valor-chave simples e se beneficiar do pipelining, então o memcached deve ser mais adequado às suas necessidades. Outra razão para ficar com o Memcached: ele facilmente entrega tráfego muito além do que um NIC pode suportar. , dormando mencionou que ele poderia escalá-lo acima de 55 milhões de leitops/sec para um servidor consideravelmente maior.Dado isso, você poderia fazer uso de tipos de instância menores e / ou mais baratos para sustentar uma carga de trabalho semelhante, desde que a memória disponível e a pegada de disco bastem para suas necessidades de carga de trabalho. Este Hacker Notícias thread Um ângulo diferente a considerar é o tamanho do conjunto de dados. Embora a Extstore ofereça grandes economias de custos ao permitir que você armazene itens além da RAM, há um limite para quantas chaves podem caber por GB de memória. Cargas de trabalho com itens muito pequenos devem observar ganhos menores em comparação com aqueles com itens maiores. Isso não é o caso com o ScyllaDB, que permite que você armazene bilhões de itens independentemente de seu tamanho. Também é importante considerar se a persistência de dados é necessária.Se for, então executar o ScyllaDB como um cache distribuído replicado fornece maior resiliência e operações sem interrupção, com o comércio sendo (e como ) que a replicação reduz a metade do seu tamanho de cache efetivo. Infelizmente, o Extstore não suporta reinicializações quentes e, portanto, a falha ou manutenção de um único nó é propenso a elevar a sua relação de falta de cache. Se isso é aceitável ou não depende da semântica da sua aplicação: Se uma falta de cache corresponde a uma volta para o banco de dados, então a latência de fim a fim será momentaneamente maior. Os estados corretamente No que diz respeito à hashing consistente, os clientes memcached são responsáveis pela distribuição de chaves em seus servidores distribuídos. Isso pode introduzir alguns hiccups, uma vez que diferentes configurações de clientes farão com que as chaves sejam atribuídas de forma diferente, e algumas implementações podem não ser compatíveis umas com as outras. ScyllaDB adota uma abordagem diferente: hashing consistente é feito no nível do servidor e propagado aos clientes quando a conexão é estabelecida pela primeira vez. Memcached’s ConfiguringClient wiki Então, quem ganhou (ou quem perdeu)? Bem... Isto não precisa ser uma competição, nem uma lista exaustiva descrevendo cada consideração individual para cada solução.Tanto o ScyllaDB quanto o memcached usam abordagens diferentes para utilizar de forma eficiente a infraestrutura subjacente. Ficamos felizes em ver o ScyllaDB correspondendo aos números do Memcached reconhecido pela indústria. Claro, não tínhamos expectativas de que nosso banco de dados fosse “mais rápido”.