A empresa PayPal abriu os códigos-fonte do banco de dados distribuído resistente a falhas JunoDB, que manipula dados no formato chave-valor. O sistema foi projetado desde o início com foco em alta segurança, escalabilidade horizontal, resiliência e a capacidade de lidar com centenas de milhares de conexões simultâneas com latências previsíveis. Na PayPal, praticamente todos os serviços, desde o login de usuários até o processamento de transações financeiras, dependem do JunoDB. O código do projeto é escrito na linguagem Go (a biblioteca cliente está em Java) e é distribuído sob a licença Apache 2.0. Durante o desenvolvimento futuro, correções, melhorias e alterações da comunidade serão bem-vindas.
A arquitetura do JunoDB baseia-se no uso de um balanceador de carga que aceita solicitações de aplicativos clientes e as distribui entre servidores proxy, que ao mesmo tempo acessam um grupo servidores de armazenamento ao executar a solicitação. Cada servidor proxy estabelece conexões simultaneamente com todos os servidores servidores de armazenamento e redireciona as solicitações para o grupo de servidores de armazenamento com base no índice de particionamento, que é armazenado em um sistema de armazenamento de configuração distribuído, o etcd.

Os dados são particionados e vinculados a nós de armazenamento usando hashing, o que permite reduzir o movimento de dados ao aumentar ou diminuir nós no cluster. Para garantir a resiliência, cada porção de dados é replicada em vários nós de armazenamento, o que permite preservar as informações em caso de falha de servidores individuais. O suporte para a criação de armazenamentos distribuídos territorialmente é mantido, onde grupos de nós são alocados em diferentes data centers.

Nos nós de armazenamento, os dados são armazenados na memória ou em armazenamento local com base na biblioteca RocksDB. Ao armazenar dados de forma permanente, eles são mantidos em formato criptografado (a chave de criptografia pode ser definida tanto pelo cliente quanto estar definida no nível do proxy).

Para interagir com o banco de dados a partir de aplicativos, uma biblioteca cliente é fornecida, oferecendo uma API para aplicativos em linguagens como Java, Go e C++. A parte do cliente é maximamente simplificada, e a lógica complexa e as configurações são, sempre que possível, transferidas para o lado do SGBD. A interação entre o cliente e o balanceador de carga ou proxy ocorre através de um canal de comunicação criptografado. Para gerenciar e enviar solicitações, é possível utilizar a interface de linha de comando, que reproduz todas as funcionalidades da API do cliente.
O sistema foi projetado para processar solicitações com latências previsíveis e baixas, por exemplo, um cluster de três nós de armazenamento e um proxy, formado a partir de ambientes n1-highmem-32 (32 CPU Intel Xeon 2.30GHz, 214GB de RAM e 450GB de armazenamento baseado em SSD), conseguiu fornecer latências fixas que não ultrapassaram 2.5 ms em 95% dos casos e 16 ms em 99% ao processar 200 mil conexões TLS simultâneas e um fluxo de 15 mil solicitações por segundo (com 3000 conexões simultâneas e um fluxo de 80 mil solicitações por segundo, as latências não ultrapassaram 6 ms em 95% dos casos e 15 ms em 99%). Nos serviços do PayPal, a JunoDB atende cerca de 350 bilhões de solicitações por dia.

Fonte: opennet.ru
