O PayPal abriu o código-fonte do JunoDB, um DBMS tolerante a falhas que manipula dados no formato chave-valor. O sistema foi originalmente projetado com alta segurança, escalabilidade horizontal, tolerância a falhas e capacidade de lidar com centenas de milhares de conexões simultâneas com atrasos previsíveis em mente. No PayPal, quase todos os serviços, desde o login do usuário até o processamento de transações financeiras, estão vinculados ao JunoDB. O código do projeto é escrito em Go (biblioteca cliente Java) e distribuído sob a licença Apache 2.0. No futuro desenvolvimento, serão aceitas correções, melhorias e mudanças da comunidade.
A arquitetura do JunoDB é baseada no uso de um balanceador de carga que aceita solicitações de aplicativos clientes e as distribui entre servidores proxy que acessam simultaneamente um grupo de servidores de armazenamento quando uma solicitação é feita. Cada proxy estabelece conexões com todos os servidores de armazenamento de uma vez e redireciona as solicitações para um grupo de servidores de armazenamento com base no índice de partição armazenado no sistema de armazenamento distribuído da configuração do etcd.
Os dados são particionados e vinculados a nós de armazenamento usando hash para reduzir a movimentação de dados à medida que os nós crescem ou diminuem em um cluster. Para garantir a tolerância a falhas, cada parte dos dados é replicada em vários nós de armazenamento, o que permite salvar informações quando servidores individuais falham. É suportada a criação de storages distribuídos geograficamente, nos quais grupos de nós estão localizados em diferentes datacenters.
Nos nós de armazenamento, os dados são colocados na RAM ou no armazenamento local baseado na biblioteca RocksDB. Com o armazenamento persistente, os dados são armazenados de forma criptografada (a chave de criptografia pode ser determinada pelo cliente e definida no nível do proxy).
Para acessar o banco de dados a partir de aplicativos, é fornecida uma biblioteca cliente que fornece uma API para aplicativos em Java, Go e C++. A parte do cliente é simplificada o máximo possível e lógica e configurações complexas, se possível, são movidas para o lado do DBMS. A interação entre o cliente e o balanceador ou proxy é realizada por meio de um canal de comunicação criptografado. Você pode usar uma interface de linha de comando para gerenciar e enviar solicitações, o que imita toda a funcionalidade da API do cliente.
O sistema foi projetado para processar solicitações com baixa latência previsível, por exemplo, um cluster de três nós de armazenamento e um proxy, formado a partir de ambientes n1-highmem-32 (32 CPUs Intel Xeon 2.30GHz, 214G RAM e 450G de armazenamento baseado em SSD), foi capaz de fornecer latência fixa não superior a 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 fluxo de 80 mil solicitações por segundo, os atrasos não ultrapassaram 6 ms em 95% dos casos e 15 ms em 99%). No PayPal, os serviços baseados em JunoDB atendem a cerca de 350 bilhões de solicitações por dia.
Fonte: opennet.ru