Vergleichen Sie Tarantool mit Mitbewerbern in Microsoft Azure

    Bild

    Tarantool - NoSQL DBMS, das in der Mail.Ru-Gruppe entwickelt und weit verbreitet ist. Das Nutzungsvolumen ergibt sich aus den Veröffentlichungen:


    Vor kurzem hat die Mail.Ru Group eine virtuelle Maschine mit Tarantool für Microsoft Azure veröffentlicht:


    Wir haben uns entschlossen zu überprüfen, wie gut Tarantool in Microsoft Azure im Vergleich zu anderen ähnlichen Angeboten funktioniert - Azure Redis Cache, Bitnami Memcached , Aerospike und VoltDB . Mit dem Wort "gut" meinen wir "schnell", dh wir vergleichen die Anzahl der verarbeiteten Anforderungen pro Sekunde (Durchsatz, RPS).

    Azure Redis-Cache


    Wir benötigen die Azure Redis Cache- Instanz der Stufe „Basic C4“ (13 GB), in die wir einen Nicht-SSL-Port einschließen (für einen ehrlichen Vergleich benötigen wir kein SSL). Es ist erforderlich, die Basisstufe zu verwenden, um die Replikation auszuschließen. Azure Redis Cache wird als Dienst bereitgestellt und wir haben keinen Zugriff auf die virtuelle Maschine. Wir wissen nicht, wie er konfiguriert ist, wir können es nicht beeinflussen. Die geschätzten Kosten für Redis Cache unserer Größe betragen 9765 Rubel pro Monat.

    Tarantool VM


    Wir benötigen eine virtuelle Tarantool VM Standard D11-Maschine mit 14 GB Festplatten. Diese Konfiguration kostet uns 9067 Rubel pro Monat. Wir werden Tarantool in zwei Modi testen: mit aktivierter und deaktivierter Write-Ahead-Protokollierung (für Datenpersistenz), da wir nicht sicher sind, ob die entsprechende Einstellung für Redis aktiviert ist.

    Um den Aufnahmemodus in /etc/tarantool/instances.enabled/example.lua zu ändern, ändern wir die Einstellung wal_mode (keine für das Arbeiten ohne WAL, schreiben mit WAL, fsync ist ein sehr spezieller Betriebsmodus, den wir nicht testen werden).

    Tarantool hat im Gegensatz zu Redis beispielsweise TREE-Indizes. Wir müssen jedoch das Gleiche mit dem Gleichen vergleichen, also haben wir den HASH-Index verwendet.

    Memcached


    Für den Test haben wir ein Standard-Image der virtuellen Maschine D11 mit vorinstalliertem Memnached von Bitnami verwendet .

    Auf dem Azure Marketplace befindet sich ein weiteres Memcached - ein Cloud-Dienst von Redis Labs , der jedoch nur in den USA verfügbar ist und nicht funktioniert hat.

    Nach der Bereitstellung der virtuellen Maschine haben wir die Authentifizierung in der Konfigurationsdatei memcached.conf deaktiviert (Option –S).

    Memcached kann die Datenpersistenz nicht aufrechterhalten.

    Aerospike


    Für Aerospike haben wir das offizielle Bild vom Azure Marketplace (Standard D11) übernommen.

    Voltdb


    VoltDB im Azure Marketplace ist dies jedoch nicht. Ich musste eine saubere virtuelle Maschine (Ubuntu 14.04 LTS) nehmen und manuell von der Quelle installieren . Der sofort einsatzbereite Web-Administrator, der Live-Grafiken einschließlich der Anzahl der Anfragen pro Sekunde enthielt, war angenehm überrascht.

    Synchroner asynchroner Test


    Wir werden versuchen, einen "Synchron-Asynchron" -Test durchzuführen, das heißt, unsere Schnittstelle wird synchron sein, aber im Inneren werden wir asynchron mit der Verbindung arbeiten. Mit dieser Art von Test können Sie die Arbeit über eine einzelne Verbindung für mehrere synchrone Clients simulieren. Um Zweifel an der Identität des Tests für Redis Cache, Tarantool VM und Memcached zu beseitigen, werden wir die gesamte gemeinsame Logik in der abstrakten Klasse NoSQLConnection entfernen , von der wir dann TarantoolConnection , RedisConnection und MemcachedConnection erben (siehe Quelle ).

    Es gibt zwei Warteschlangen in der Klasse (reguläre std :: list) - OutputQueue (wird an den Socket gesendet) und InputQueue (vom Socket empfangen) sowie MethodenSendThreadFunc und ReceiveThreadFunc , die in separaten Threads gestartet werden und bei Vorhandensein entsprechender nicht leerer Warteschlangen Informationen stapelweise mit den Methoden Send und Receive senden / empfangen (rein virtuell, in den Erben implementiert).

    Die synchrone Schnittstelle wird durch die DoSyncQuery- Methode dargestellt , die die Anforderung in die OutputQueue stellt und auf eine Antwort in der InputQueue wartet . Der virtuelle Test sollte leistungsfähig genug sein (wir haben Standard D3 verwendet) und sich geografisch in der Nähe der Datenbank befinden (wir haben den Standort "Westliche US-Region" verwendet).

    Aufgrund der speziellen Struktur der Aerospike- und VoltDB-Client-Bibliotheken (integrierte Ereignisschleife) wurde der Test für sie separat geschrieben.

    Im Bereich von bis zu 10 Client-Flows mit einem Schritt von 1 befinden sich die Volumes in der Nähe des vollständig synchronen Betriebsmodus (und ein Stream ist tatsächlich einer). Die Grafik zeigt ein mehr oder weniger lineares Wachstum. Redis und Memcached bieten ungefähr die gleiche Leistung, Tarantool ist schneller, Aerospike ist am schnellsten, VoltDB hingegen am langsamsten.





    Das nächste Diagramm besteht aus bis zu 100 Threads in 10er-Schritten . Bei Tarantool, Redis und Memcached setzt sich das lineare Wachstum fort, Aerospike und VoltDB werden verlangsamt und weisen unterschiedliche Werte auf.





    Fahren Sie als Nächstes mit 1000 in Schritten von 100 Threads fort . Das Wachstum verlangsamt sich überall, aber für Memcached hört es insgesamt auf.





    Zuletzt können Sie bis zu 8000 Threads in Schritten von 1000 Threads erstellen . Wachstum hört auf. Nach 4000 Clients funktioniert Memcached nicht mehr - Die Verbindung wird geschlossen und kann nicht getestet werden. VoltDB stirbt noch früher - bei 3.000 Kunden.





    Infolgedessen sehen wir die Führung von Tarantool bei hohen Lasten (auf kleineren Aerospike ist es noch schneller).

    Was ist mit dem Synchrontest?


    Und hier ist alles einfach. Wir führen den Synchron-Asynchron-Test in einem Thread aus, und er wird offensichtlich nur synchron. Aber wenn es viele Kunden gibt, werden viele Verbindungen benötigt ... Nun, dann werden wir mehrere Tests parallel durchführen und die Ergebnisse zusammenfassen.

    Aerospike und VoltDB wurden in diesem Modus nicht getestet.





    Wir sehen, dass der Synchrontest eine bestimmte „Obergrenze“ hat, die niedriger ist als die der Synchron-Asynchron-Verbindung. Diese Obergrenze wird durch den Netzwerkaufwand verursacht.

    Preisvergleich


    Tarantool, Memcached, Aerospike und VoltDb sind kostenlos. Sie müssen nur für die virtuelle Maschine bezahlen, auf der sie ausgeführt werden. Wir haben Standard D11 (14 GB RAM) verwendet, was ~ 9067 Rubel pro Monat kostet. Azure Redis Cache ist etwas teurer - ~ 9765 Rubel pro Monat für eine einfache C4-Instanz (13 GB RAM). Visualisieren.



    Stimmen Sie zu, dass nichts klar ist? Die Preise sind fast gleich ... Wie wir bereits gesehen haben, weisen diese Datenbanken eine unterschiedliche Leistung auf. Versuchen wir, die Kosten nicht pro Monat, sondern pro Milliarde Anfragen auszudrücken. Lassen Sie uns zunächst sehen, wie viel eine Milliarde Schreibanfragen mit 1000 Clients kosten.



    VoltDB ist hier ein expliziter Außenseiter. Wir entfernen es.



    Jetzt entfernen wir Aerospike und Memcached, um uns die Anführer in der Nähe anzusehen.



    Und jetzt, wie werden sich die Kosten ändern, wenn Sie Leseanforderungen auf 100 Clients zählen.



    Wir lassen nur die Führer.



    Schlussfolgerungen


    Während des Tests verursachte der Testprozess im synchronen asynchronen Test eine Auslastung des Tarantool-Prozesses von bis zu 70% der CPU im synchronen Modus - bis zu 100%. In allen Diagrammen hat sich Tarantool VM unabhängig vom WAL-Modus als besser als die Konkurrenz erwiesen. Beachten Sie, dass das Vorhandensein oder Fehlen von WAL die Lesegeschwindigkeit von Tarantool nicht beeinflusst (die orangen und grauen Kurven in den Lesediagrammen sind gleich), da die Festplatte beim Lesen von Tarantool nicht verwendet wird. Darüber hinaus hat sich Tarantool VM sowohl pro Zeiteinheit (pro Monat) als auch pro Anforderung als die günstigste Lösung herausgestellt.

    Jetzt auch beliebt: