Компания PayPal открыла исходные тексты отказоустойчивой СУБД JunoDB, манипулирующей данными в формате ключ-значение. Система изначально спроектирована с оглядкой на высокую безопасность, горизонтальную масштабируемость, отказоустойчивость и способность обрабатывать сотни тысяч одновременных соединений с предсказуемыми задержками. В PayPal практически все сервисы, от входа пользователей до обработки финансовых транзакций, завязаны на JunoDB. Код проекта написан на языке Go (клиентская библиотека на Java) и распространяется под лицензией Apache 2.0. При дальнейшем разработке будут приниматься исправления, улучшения и изменения от сообщества.
Архитектура JunoDB основана на использовании балансировщика нагрузки, принимающего запросы от клиентских приложений и распределяющего их между прокси-серверами, одновременно обращающимися к группе серверов хранения при выполнении запроса. Каждый прокси-сервер устанавливает соединения сразу со всеми серверами хранения и перенаправляет запросы к группе серверов хранения на основе индекса секционирования, который хранится в распределённой системе хранения конфигурации etcd.
Данные секционируются и привязываются к узлам хранения с использованием хэширования, что позволяет уменьшить перемещение данных при увеличении или уменьшении узлов в кластере. Для обеспечения отказоустойчивости каждая порция данных реплицируется на нескольких узлах хранения, что позволяет сохранить информацию при выходе из строя отдельных серверов. Поддерживается создание территориально распределённых хранилищ, в которых группы узлов размещены в разных датацентрах.
На узлах хранения данных размещаются в оперативной памяти или в локальном хранилище на базе библиотеки RocksDB. При постоянном хранении данные размещаются в зашифрованном виде (ключ шифрования может определять как клиентом, так и задаваться на уровне прокси).
Для обращения к БД из приложений поставляется клиентская библиотека, предоставляющая API для приложений на языках Java, Go и C++. Клиентская часть максимально упрощена, а сложная логика и настройки по возможности вынесены на сторону СУБД. Взаимодействие между клиентом и балансировщиком или прокси осуществляется через шифрованный канал связи. Для управления и отправки запросов можно использовать интерфейс командной строки, который воспроизводит все возможности клиентского API.
Система спроектирована для обработки запросов с предсказуемыми низкими задержками, например, кластер из трёх узлов хранения и одного прокси, сформированный из окружений n1-highmem-32 (32 CPU Intel Xeon 2.30GHz, 214G ОЗУ и 450G хранилище на базе SSD), смог предоставить фиксированные задержки не превышающие 2.5 мс в 95% случаев и 16 мс в 99% при обработке 200 тысяч одновременных TLS-соединений и потоке в 15 тысяч запросов в секунду (при 3000 одновременных соединений и потоке в 80 тысяч запросов в секунду задержки не превысили 6 мс в 95% случаев и 15 мс в 99%). В PayPal сервирсы на базе JunoDB обслуживают около 350 миллиардов запросов в день.