Das Unternehmen PayPal hat die Quelltexte der ausfallsicheren Datenbank JunoDB veröffentlicht, die Daten im Schlüssel-Wert-Format verarbeitet. Das System wurde ursprünglich mit dem Fokus auf hohe Sicherheit, horizontale Skalierbarkeit, Ausfallsicherheit und die Fähigkeit zur Verarbeitung von Hunderttausenden gleichzeitigen Verbindungen mit vorhersehbaren Verzögerungen entwickelt. Bei PayPal sind praktisch alle Dienste, vom Benutzer-Login bis zur Verarbeitung finanzieller Transaktionen, auf JunoDB angewiesen. Der Code des Projekts ist in der Programmiersprache Go (mit einer Client-Bibliothek in Java) geschrieben und wird unter der Lizenz Apache 2.0 veröffentlicht. In der zukünftigen Entwicklung werden Korrekturen, Verbesserungen und Änderungen aus der Community angenommen.
Die Architektur von JunoDB basiert auf der Verwendung eines Lastenausgleichers, der Anfragen von Client-Anwendungen entgegennimmt und diese zwischen Proxy-Servern verteilt, die gleichzeitig auf eine Gruppe von Server Speichern zugreift, während die Anfrage verarbeitet wird. Jeder Proxy-Server stellt Verbindungen zu allen Servern gearbeitet werden. Die Speicherung erfolgt und Anfragen werden an eine Gruppe von Speicherservern weitergeleitet, basierend auf einem Partitionierungsindex, der im verteilten Konfigurationsspeichersystem etcd gespeichert ist.

Die Daten werden partitioniert und den Speicherknoten mithilfe von Hashing zugewiesen, was die Bewegung von Daten bei der Hinzufügung oder Reduzierung von Knoten im Cluster verringert. Um die Fehlertoleranz zu gewährleisten, wird jede Datenportion auf mehreren Speicherknoten repliziert, sodass Informationen auch im Falle eines Ausfalls einzelner Server erhalten bleiben. Es wird die Erstellung von geografisch verteilten Speichern unterstützt, in denen Gruppen von Knoten in verschiedenen Rechenzentren untergebracht sind.

Auf den Speicherknoten werden Daten im Arbeitsspeicher oder im lokalen Speicher basierend auf der RocksDB-Bibliothek abgelegt. Bei dauerhaftem Speicher werden die Daten in verschlüsselter Form abgelegt (der Verschlüsselungsschlüssel kann sowohl vom Client bestimmt als auch auf der Proxystufe festgelegt werden).

Um auf die Datenbank aus Anwendungen zuzugreifen, wird eine Client-Bibliothek bereitgestellt, die eine API für Anwendungen in den Programmiersprachen Java, Go und C++ bietet. Der Client ist maximal vereinfacht, während komplexe Logik und Einstellungen möglichst auf die Datenbankseite verlagert wurden. Die Kommunikation zwischen Client und Load Balancer oder Proxy erfolgt über einen verschlüsselten Kommunikationskanal. Für die Verwaltung und das Versenden von Anfragen kann die Befehlszeilenschnittstelle verwendet werden, die alle Funktionen der Client-API wiedergibt.
Das System ist für die Bearbeitung von Anfragen mit vorhersehbar niedrigen Latenzen konzipiert. Beispielsweise konnte ein Cluster aus drei Speicher-Knoten und einem Proxy, basierend auf n1-highmem-32-Umgebungen (32 CPU Intel Xeon 2,30 GHz, 214 GB RAM und 450 GB Speicher auf SSD-Basis), feste Latenzen von nicht mehr als 2,5 ms in 95 % der Fälle und 16 ms in 99 % bei der Verarbeitung von 200.000 gleichzeitigen TLS-Verbindungen und einem Durchsatz von 15.000 Anfragen pro Sekunde bereitstellen (bei 3.000 gleichzeitigen Verbindungen und einem Durchsatz von 80.000 Anfragen pro Sekunde überschritten die Latenzen 6 ms in 95 % der Fälle und 15 ms in 99 %). Bei PayPal bedienen die JunoDB-Services etwa 350 Milliarden Anfragen pro Tag.

Quelle: opennet.ru
