Atender uma grande base de usuários com dados confiáveis, consistentes e de baixa latência é um desafio muito difícil para qualquer equipe de back-end. Na Ledger, fizemos a escolha estratégica de hospedar nossos próprios serviços de dados principais de blockchain. Ao não depender de terceiros, podemos gerir nós próprios os dados dos nossos clientes, garantindo que os processos subjacentes cumprem as nossas diretrizes de segurança e os Objetivos de Nível de Serviço (SLO) orientados para o desempenho.
Mas esta estratégia também traz o seu próprio conjunto de desafios.
Nosso primeiro desafio é migrar esses principais serviços de fornecimento de dados das ferramentas noSQL interessantes e brilhantes. Neste artigo, abordarei por que tomamos essa difícil decisão, as complexidades que enfrentamos e os benefícios que colhemos.
O objetivo deste artigo é mostrar os aspectos técnicos que nos levaram a escolher o PostgreSQL como nossa nova camada de base de armazenamento para dados blockchain.
Mergulhe profundamente nos dados do Blockchain
Os dados Blockchain possuem vários recursos importantes.
Primeiro, ela está sempre crescendo e nada é apagado dela. No entanto, na prática, embora a maior parte de uma blockchain seja imutável, a parte mais jovem da blockchain pode mudar devido a conflitos que precisam ser resolvidos. Na verdade, como a cadeia é uma rede peer to peer, vários blocos legítimos podem coexistir temporariamente. Geralmente, o mais antigo é excluído, resultando no que chamamos de reorganização. Resumindo, os dados são divididos entre uma cauda fria imutável e um estado de cabeça que raramente muda.
O problema que estamos tentando resolver é que, embora os blockchains sejam ótimos para ter dados bizantinos tolerantes a falhas, eles são menos eficazes para dividi-los em muitos eixos. Ou seja, é muito difícil obter a lista de operações que afetaram uma conta. Até mesmo obter o saldo de uma conta em um blockchain como o bitcoin é um desafio quando você ainda não tem a lista de transações.
Para superar esses desafios, o Ledger Explorer Services indexa todo o blockchain. É um serviço grande, crítico e sensível ao desempenho, totalmente escrito em Scala, usando o efeito gatos tempo de execução de alto desempenho. Estamos acima de 10k rps no bitcoin, mantendo uma latência de cauda p95 abaixo de 100ms. Também estamos recrutando 😊.
Um pouco de história
No início da nossa história, muito antes de eu ingressar na empresa, a camada de serviço de dados Ledger era gerenciada por um banco de dados Neo4j incorporado. Cada caixa de serviço indexava seus próprios dados e os servia localmente, o que causava muitos problemas.
A consistência dos dados entre as instâncias não era garantida, e o tamanho do estado que precisava ser indexado, combinado pelo uso do disco e memória RAM do neo4j, não era escalonável. Esse problema só piorou à medida que a empresa crescia, tornando cada vez mais desafiador gerar novas instâncias.
Cassandra foi então escolhido como o principal impulsionador desta nova configuração: é um banco de dados clusterizado e escalável horizontalmente que está no lado AP do teorema CAP. Ele resolve os problemas relacionados ao compartilhamento de dados e permite uma separação clara entre a indexação, o componente de reconhecimento de blockchain e os servidores API sem cabeça.
Mas qual é o sentido de ter todo o estado histórico disponível se nunca vamos realmente ler a partir dele?
Em relação ao nosso caso de uso, os dados históricos brutos raramente são necessários porque o estado da conta do usuário pode ser agregado a partir deles. Isto levou-nos a desafiar a solução de armazenamento de dados existente que se baseia na base de dados distribuída Cassandra.
O volume de dados que precisamos armazenar por blockchain, embora na faixa dos terabytes, não é o que se pode chamar de “big data”. Além disso, a parte if que será usada para responder à maioria das consultas (também conhecida como hot path) é ainda menor. Hoje em dia é possível encontrar facilmente servidores de hardware comuns com mais de 16 TB de armazenamento SSD NVMe. O escalonamento vertical é uma ferramenta muito poderosa, e um banco de dados relacional também.
Finalmente, o principal problema que tivemos com a configuração atual do cassandra não foi o modelo de armazenamento desperdiçado nem o caso de uso de dados mal ajustado, mas a falta de facilidade de uso do desenvolvedor. O desenvolvimento de um novo recurso baseado em dados no cassandra provou ser desnecessariamente demorado. Esforçámo-nos por implementar cada novo eixo sobre o qual necessitamos de fornecer dados.
Dada a experiência de nossa equipe em habilidades de modelagem de dados e proficiência em SQL, PostgreSQL era o candidato perfeito. Esta solução foi testada em batalha, robusta e fácil de estender, o que a torna a escolha ideal.
Por que escolhemos SQL em vez de NoSQL:
- Lê/grava saldos: o caso de uso de dados do blockchain foi fortemente distorcido em leituras em vez de gravações (o blockchain grava muito poucos dados a uma taxa muito razoável, mesmo para um blockchain como o Polygon). Cassandra tem a capacidade de absorver uma quantidade muito grande de gravações – o caminho de leitura é na verdade mais do que o caminho de gravação.
- Suporte de indexação: Os índices são um componente chave de um SGBD para responder dúvidas e novos casos de negócios ou oportunidades. Cassandra tem suporte limitado para indexação. Os índices só são eficazes se a consulta já especificar uma forma de restringir a partição na qual a consulta será executada. Pagamos aqui o custo para ter um distribuído arbitrariamente base de dados. O suporte do PostgreSQL para índices é eficiente, extensível e avançado.
- Suporte de agregação: Mesmo caso para agregação; como Cassandra não permite agregação multipartição e não tolera nenhuma cláusula GROUP BY em sua linguagem de consulta, seu suporte é meio ausente. O PostgreSQL propõe um amplo suporte de agregação, mesmo em tipos de dados exóticos, como intervalos e blobs jsonb.
- Modelagem de dados: Cassandra é muito, muito limitante na forma como a modelagem de dados é possível. Uma tabela deve ser criada para quase cada solicitação que você deseja responder, e os dados devem ser desnormalizados em linhas grandes (usando totalmente o loja de colunas largas aspecto de C* e também o fato de que os escritores são muito baratos). O PostgreSQL nos permite aproveitar o aspecto relacional do blockchain (chamadas, transações, blocos) e poupar espaço em disco, incentivando a reutilização de dados.
- Consultas ad hoc e auditoria: Ser capaz de usar o padrão completo de SQL e fazer consultas arbitrárias significa que podemos explorar e pesquisar a causa raiz do bug em potencial ou ter dados exploratórios para casos de uso futuros. Podemos realmente usar o banco de dados como uma ferramenta interativa e inteligente, em vez de um armazenamento estúpido. Fazer isso no Cassandra sem um cluster de computação analítica extenso e caro, como Presto, Spark, etc. (e como estamos executando em servidores bare metal, não temos acesso a ferramentas de análise de dados distribuídas facilmente geradas, como EMR).
- O uso do armazenamento: A suposição de Cassandra é que o armazenamento é muito barato e que o cluster pode ser facilmente estendido com novas máquinas. Isso significa que todas as limitações em índices e agregações devem ser pagas com armazenamento. A ausência de índices globalmente eficientes e suporte de junção significa que temos que desnormalizar e armazenar uma cópia de toda a tabela para cada eixo que queremos consultar. O PostgreSQL nos poupa terabytes de armazenamento.
- Consistência: Como o Cassandra é um banco de dados distribuído e orientado para AP (a comunicação é feita com fofocas entre nós), a consistência só é eventual em termos de escritas. Você pode ajustar a política de consistência de cada instrução para leituras e gravações, mas o objetivo desse banco de dados nunca foi ter uma consistência forte. O PostgreSQL tem um forte histórico de uso para missões críticas e é altamente resiliente. Ser centralizado também significa que não há rede envolvida no caminho de gravação.
- Transações e MVCC:
- Transações: Cassandra suporta apenas transações leves em consultas DML. Alguns lotes podem ser aplicados (doca), mas há inúmeras ressalvas, nomeadamente que as linhas devem estar no mesmo servidor (= partição) para não terem um desempenho horrível.
- MVCC: Cassandra suporta carimbo de data/hora de linha, mas o MVCC completo não é garantido. Uma compactação pode apagar dados obsoletos e não há como dizer ao C* que não deveria (como, por exemplo, uma transação no PG).
- PostgreSQL suporta um modelo MVCC forte que garante um caminho de leitura consistente para nossos usuários.
- Ferramentas.: O PostgreSQL possui muito mais ferramentas que são amplamente utilizadas para operar facilmente o banco de dados. Além disso, uma ferramenta como rota aérea garante a manutenção de um forte controle de versão do esquema do banco de dados. Já o integramos com nossa base de código com sucesso. Não há equivalente com este nível de maturidade em Cassandra.
- Escalabilidade horizontal: Este é o principal ponto de venda do Cassandra. Basta adicionar mais máquinas à medida que seus dados se expandem. Nenhum equivalente para PostgreSQL, pois a fragmentação e o particionamento precisam ser feitos manualmente.
Como planejamos escalar
Como vimos, a única desvantagem de usar uma configuração do Postgres é o escalonamento tanto nas leituras quanto no armazenamento. O que podemos fazer para superar essa limitação?
A primeira ferramenta eficaz que temos é segregar cada protocolo ou blockchain que suportamos em seu próprio banco de dados, para que assim possa ser dimensionado adequadamente de acordo com o volume e o tráfego. A segmentação por domínio de negócios garante uma primeira camada de escalonamento.
Levando esse conceito adiante, também podemos segmentar dados históricos frios em partições temporais. As versões mais recentes do Postgres melhoraram muito a usabilidade de tabelas particionadas, o que poderia permitir a movimentação contínua de dados entre um cluster de máquinas. Por exemplo, poderíamos usar máquinas mais baratas com menos poder de computação para hospedar a maioria dos dados históricos, ao mesmo tempo em que manteríamos gigantes robustos e empilhados em RAM para hospedar tabelas agregadas e as operações mais recentes do usuário.
Essa abordagem funciona muito bem em nosso caso de uso porque não há chaves estrangeiras entre partições no armazenamento histórico (em última análise, tudo está anexado ao bloco). Da perspectiva do servidor principal, os dados históricos podem até ser acessados de forma transparente usando particionamento e a extensão postgres_fdw.
Para ajudar a colocar tudo isso em prática, também analisamos a extensão TimescaleDB. Esta extensão adiciona muitas funcionalidades ao postgres básico, e a maioria delas é perfeita para nossos casos de uso:
- Particionamento automático de tabelas com base em uma coluna tipo tempo (no nosso caso, adaptamos tomando a altura do blockchain como referência).
- Compressão automática, com reconhecimento de tipo de dados e baseada em coluna de blocos mais antigos. Isso garante uma taxa de compactação quase perfeita usando algoritmos de última geração em dados muito semelhantes.
- Agregação eficiente baseada em intervalos de tempo para calcular facilmente saldos históricos e gráficos de dados de mercado.
Estamos apenas no início da experimentação em relação ao armazenamento e isso abre muitos casos de uso. Prova de conceitos usando uma pequena quantidade de dados (cerca de 10 mil blocos na rede principal Ethereum, ou seja, cerca de 2 dias de dados) mostrou redução de espaço em disco de até 40%.
Como vimos, o volume de dados, desde que utilizemos a estratégia certa, não é um problema. Mas como dimensionar com o tamanho da nossa base de usuários?
Já temos uma boa vantagem aqui: indexamos todos os dados do blockchain. Assim, o armazenamento necessário não crescerá como o número de usuários, mas como o tamanho total do blockchain. As otimizações de armazenamento e leitura são totalmente ortogonais em sua resolução.
Essa configuração, combinada com a necessidade de gravação muito baixa em proporção ao volume de leitura que precisa ser atendido, é a configuração dos sonhos para um padrão de réplica de líder-seguidor de classificação. Para melhorar ainda mais o desempenho e o rendimento, também podemos colocar as réplicas de leitura do postgres nas mesmas máquinas que os servidores API e aproveitar as vantagens dos soquetes de domínio UNIX para pular as viagens de ida e volta da rede.
Aqui está um exemplo de estratégia de replicação de dados que poderíamos usar para dimensionar nossas leituras. As caixas cinza claro representam servidores únicos. Podemos ver aqui que os pods de API são diretamente co-localizados com réplicas dos dados mais recentes para garantir um tempo mínimo de transferência entre o armazenamento e os usuários. As instâncias de arquivo descritas anteriormente não são representadas para não complicar muito o esquema.
Observações finais
Como usuário de longa data do Cassandra, quero enfatizar que é um ótimo banco de dados em seu design, que se adapta a uma ampla variedade de aplicações. Infelizmente, a escolha feita na Ledger de usá-lo foi feita em um caso de uso de dados que nunca se materializou.
A produtividade de nossa equipe foi impactada e, ansiosos pelos desafios que temos que resolver, optamos por enfrentar a situação e não cair na falácia dos custos irrecuperáveis.
Em muitos casos, seus dados não são big data. Gerenciar a distribuição de dados não é uma tarefa difícil na maioria dos casos, e as vantagens e desvantagens de um banco de dados distribuído completo realmente precisam ser cuidadosamente consideradas. A principal consideração é a experiência do desenvolvedor, pois ela libera um tempo valioso para construir qualquer outra coisa. Este é o caso de uso real no qual precisamos investir pesadamente.
- Conteúdo com tecnologia de SEO e distribuição de relações públicas. Seja amplificado hoje.
- PlatoAiStream. Inteligência de Dados Web3. Conhecimento Amplificado. Acesse aqui.
- Cunhando o Futuro com Adryenn Ashley. Acesse aqui.
- Compre e venda ações em empresas PRE-IPO com PREIPO®. Acesse aqui.
- Fonte: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :tem
- :é
- :não
- $UP
- 10
- 10K
- 20
- a
- habilidade
- Capaz
- Acesso
- acessadas
- Conta
- em
- adaptar
- adicionar
- Adiciona
- aderir
- Vantagem
- agregação
- algoritmos
- Todos os Produtos
- permitir
- permite
- já
- tb
- Apesar
- quantidade
- an
- análise
- analítica
- e
- responder
- qualquer
- nada
- api
- aplicações
- aplicado
- abordagem
- adequadamente
- arquivo
- SOMOS
- por aí
- Arte
- artigo
- AS
- aspecto
- aspectos
- suposição
- At
- disponível
- consciente
- longe
- MACHADOS
- eixo
- Backend
- Equilíbrio
- saldos
- base
- baseado
- Linha de Base
- BE
- Porque
- sido
- antes
- Começo
- gigantes
- ser
- Benefícios
- entre
- Grande
- Big Data
- Pouco
- Bitcoin
- Bloquear
- blockchain
- dados de blockchain
- blockchains
- Blocos
- ambos
- Caixa
- caixas
- Traz
- Bug
- construir
- negócio
- mas a
- by
- chamada
- chamadas
- CAN
- candidato
- boné
- cuidadosamente
- casas
- casos
- Causar
- causado
- centralizada
- cadeia
- desafiar
- desafios
- desafiante
- alterar
- mudança
- barato
- mais barato
- máquinas mais baratas
- escolha
- Escolha
- escolheu
- escolhido
- remover filtragem
- Agrupar
- código
- base de código
- frio
- Coluna
- combinado
- mercadoria
- Comunicação
- Empresa
- complexidades
- componente
- Computar
- conceito
- conceitos
- consideração
- considerado
- consistente
- Legal
- núcleo
- Custo
- poderia
- criado
- crítico
- Atual
- dados,
- análise de dados
- compartilhamento de dados
- armazenamento de dados
- banco de dados
- dias
- decisão
- descrito
- Design
- Developer
- em desenvolvimento
- difícil
- diretamente
- sujeira
- distribuído
- distribuição
- dividido
- do
- parece
- fazer
- domínio
- não
- desvantagem
- seu "Sonho"
- motorista
- dois
- e
- cada
- facilmente
- fácil
- borda
- Eficaz
- eficiente
- outro
- incorporado
- enfatizar
- permitir
- animador
- aumentar
- garantir
- garante
- assegurando
- Equivalente
- etc.
- ethereum
- ETHEREUM PRINCIPAL
- Mesmo
- eventual
- SEMPRE
- Cada
- tudo
- exemplo
- existente
- Exótico
- expande
- vasta experiência
- experiência
- explorar
- explorador
- estender
- extensão
- extenso
- fato
- Cair
- Característica
- Funcionalidades
- poucos
- Encontre
- Primeiro nome
- caber
- Escolha
- estrangeiro
- para a frente
- simpatia
- da
- cheio
- De pleno Direito
- totalmente
- funcionalidades
- mais distante
- futuro
- obtendo
- dado
- Globalmente
- meta
- vai
- gráficos
- cinza
- ótimo
- Grupo
- Cresça:
- Crescente
- garantido
- orientações
- tinha
- Queijos duros
- Hardware
- Ter
- ter
- cabeça
- fortemente
- altura
- ajudar
- SUA PARTICIPAÇÃO FAZ A DIFERENÇA
- Alta
- altamente
- histórico
- hospedeiro
- HOT
- mais quente
- Como funciona o dobrador de carta de canal
- Como Negociar
- Contudo
- HTML
- HTTPS
- i
- ideal
- if
- imutável
- impactada
- implementação
- melhorado
- in
- cada vez mais
- índice
- Índices
- instância
- integrado
- interativo
- para dentro
- Investir
- envolvido
- emitem
- questões
- IT
- ESTÁ
- juntar
- ingressou
- jpg
- apenas por
- manutenção
- Chave
- chaves
- Tipo
- Falta
- língua
- grande
- Latência
- mais recente
- camada
- levou
- Ledger
- legítimo
- menos
- Nível
- Alavancagem
- leve
- leve
- como
- limitação
- limitações
- Limitado
- Lista
- pequeno
- localmente
- longo
- olhou
- procurando
- lote
- Baixo
- máquinas
- moldadas
- a Principal
- Mainnet
- a manter
- Maioria
- Fazendo
- gerencia
- gestão
- manualmente
- muitos
- mercado
- Dados de mercado
- maturidade
- max-width
- Posso..
- significa
- metal
- migrado
- mínimo
- missões
- modelo
- modelagem
- mais
- Além disso
- a maioria
- mover
- muito
- devo
- nomeadamente
- quase
- você merece...
- necessário
- Cria
- Nem
- rede
- nunca
- Novo
- agradável
- não
- nós
- nada
- número
- numeroso
- objetivos
- of
- on
- ONE
- só
- operar
- Operações
- oportunidades
- or
- ordem
- A Nossa
- nós mesmos
- Acima de
- Superar
- próprio
- pago
- parte
- partes
- caminho
- padrão
- Pagar
- perscrutar
- peer to peer
- perfeita
- atuação
- perspectiva
- Lugar
- plano
- platão
- Inteligência de Dados Platão
- PlatãoData
- vagens
- ponto
- Privacidade
- Polygon
- possível
- Postgresql
- potencial
- poder
- poderoso
- prática
- Problema
- processos
- produtividade
- prova
- proporção
- propõe
- protocolo
- comprovado
- fornecer
- fornecido
- colocar
- consultas
- RAM
- alcance
- Taxa
- em vez
- relação
- Cru
- Leia
- reais
- clientes
- razoável
- redução
- em relação a
- relacionado
- confiável
- reorganização
- responder
- réplica
- representar
- representado
- solicitar
- resiliente
- Resolução
- resolvidas
- resultando
- reutilizar
- certo
- uma conta de despesas robusta
- raiz
- volta
- LINHA
- Execute
- corrida
- mesmo
- Scala
- escalável
- Escala
- dimensionamento
- sem problemas
- Pesquisar
- segurança
- Vejo
- visto
- segmento
- segmentação
- Vender
- ponto de venda
- serviço
- Serviços
- de servir
- conjunto
- instalação
- vários
- raspando
- compartilhando
- Baixo
- mostrar
- lado
- semelhante
- desde
- solteiro
- Tamanho
- Habilidades
- pequeno
- menor
- smart
- So
- solução
- RESOLVER
- Resolve
- alguns
- Espaço
- Faísca
- O Spawn
- SQL
- padrão
- Estado
- Declaração
- armazenamento
- loja
- História
- Estratégico
- Estratégia
- mais forte,
- discordaram
- entraram com sucesso
- ajuda
- suportes
- mesa
- Tire
- tomar
- Tarefa
- Profissionais
- Dados Técnicos:
- dizer
- condições
- do que
- que
- A
- O bloco
- O Estado
- deles
- então
- Lá.
- Este
- deles
- Terceiro
- terceiro
- isto
- Taxa de transferência
- tempo
- para
- também
- ferramenta
- ferramentas
- Total
- TOTALMENTE
- tráfego
- transação
- Transações
- transferência
- transparentemente
- tipo
- tipos
- Em última análise
- para
- subjacente
- infelizmente
- unix
- destranca
- desnecessariamente
- us
- usabilidade
- Uso
- usar
- caso de uso
- usava
- Utilizador
- usuários
- utilização
- geralmente
- Valioso
- variedade
- vertical
- muito
- volume
- queremos
- foi
- Caminho..
- we
- Web2
- Web3
- BEM
- O Quê
- O que é a
- quando
- qual
- enquanto
- Enquanto
- inteiro
- porque
- Largo
- largamente
- precisarão
- de
- sem
- trabalho
- escrever
- escrito
- Você
- Mais jovem
- investimentos
- zefirnet