Tao Hui http://weibo.com/taohui3
Englische Version
Designkonzept
Lushan war eine leichte Schlüsselwertdatenbank in Version 1.0. Mit Lushan können Sie leicht einen Cluster auf mehreren Maschinen wie Memcached bauen. Lushan 2.0 ist auch ein leichtes Anwendungsrahmen, in dem mehrere gemeinsam genutzte Bibliotheken montiert werden können, sodass Sie gleichzeitig auf Daten zugreifen und in einem Prozess berechnen können, was es beispiellos macht, große Datenquantitäts- und Hochleistungsdienste zu schreiben. Besonders geeignet für Geschäftsszenarien für Internetempfehlungen, Werbung und Suche. Lushan wird seit vielen Jahren in Sina Weibo Empfehlung und Werbegeschäft verwendet.
Um 2013 habe ich die Empfehlung "Missing Weibo" entwickelt. Ich muss mehrere Datenspeicher online bereitstellen, um mit verschiedenen Algorithmen sowie ihren Online- und Testversionen zu experimentieren. Dies erfordert, dass mehrere Systeme bereitgestellt werden. Dieser Ansatz ist zu niedrig. Ein Wochenende habe ich Lushan entwickelt, was Sie von diesen Dingen befreien kann, sehr cool.
Dies ist wahr, Lushan ist seitdem zur Infrastruktur für die Empfehlung von Weibo und das Werbegeschäft geworden. Jetzt gibt es zwei Cluster, die mit 12 Maschinen betrieben werden, die Online -Abfragedaten von T mit mehr als 1 Milliarde Fragen pro Tag bedienen.
Als ich die erste Version von Lushan entwickelt habe, hatte ich immer den Drang, Lushan gleichzeitig die gemeinsame Bibliothek zu montieren. Aber ich habe mich lange nicht mehr entschieden, weil ich glaube, dass ein Rahmen eine eigene Positionierung haben sollte, und der andere ist, dass der leicht veränderte Teil vom stabilen Teil der Architektur getrennt werden sollte. Bei der Entwicklung von Weibo -Anzeigen wurden im Jahr 2015 die Zinsdaten, die relationalen Daten und die Feature -Daten von CTR -Schätzungen leicht über Hadoop sortiert und in Lushan gespeichert, und die Leistung können zwei Module implementieren, um die Targeting- und CTR -Prädiktionsfunktionen zu implementieren, und die Leistung ist sehr stark. Also gab ich meine ursprüngliche Idee auf und implementierte die zweite Version, wodurch die Lushan -Funktion noch leistungsfähiger wurde. In den tatsächlichen Anwendungen können Sie Lushan weiterhin nur als Schlüsselwertdatenbank verwenden oder Lushan-Cluster bereitstellen, die nur Daten und Cluster bereitstellen, die gleichzeitig das Computer bereitstellen.
Im Beispielverzeichnis wurde eine Beispielbibliothek angegeben und montiert sie gemäß den folgenden Schritten:
Der Ausgang ist der Wert, der dem Schlüssel 123456 entspricht.
Erklären Sie jeden Schritt:
Wenn Lushan als Computergerüst verwendet wird, unterstützt er zwei Protokolle, ähnlich dem Einzellinien-URL-Protokoll von HTTP-GET, und einem Protokoll, das dem HTTP-Post ähnelt, das die Send-Wertlänge angibt, die auch das Senden binärer Daten unterstützt. Im Modulverzeichnis sind zwei Beispiele enthalten: LProxy und Lecho, die diese beiden Protokolle demonstrieren.
LPROXY -Beispiel für einen angeforderten Schlüssel, Fragen zuerst abfragen und direkt bei Redis zurückkehren und die lokalen Bibliotheken abfragen, wenn Redis vorhanden ist. In einfachen Fällen kann dieses Beispiel auch in Produktionsumgebungen verwendet werden.
Befolgen Sie die folgenden Schritte:
Erstellen Sie eine Textdatei x.txt, geben Sie die folgenden zwei Zeilen ein, die erste Registerkarte ist der Schlüssel und der folgende Wert ist wie folgt:
168 hello lushan
187 line 2
Verwenden Sie Lushan_line_Maker in Tools, um es in das Lushan -Dateiformat zu konvertieren.
Starten Sie eine Redis auf der Maschine, setzen Sie DBNO 1 und fügen Sie dann einen Datensatz hinzu, der Schlüssel ist 168, der Wert ist "Hallo Redis".
Führen Sie Make im HProxy -Verzeichnis aus, platzieren Sie das generierte hmodule.so und hmodule.conf in das Verzeichnis hmod/15/1.0.0 und ändern Sie den Host und den Port in hmodule.conf, um das IP und den Port von Redis für Sie bereitzustellen.
implementieren:
echo -ne "hmod_open /mnt/lushan/hmod/15/1.0.0/ 15rn" | nc 127.0.0.1 9999
Wenn geöffnet wird, wird es erfolgreich eingeschaltet, da sich libhiredis in ld_library_path befindet.
Abfrage:
echo -ne "get m15?k=1-168rn" | nc 127.0.0.1 9999
VALUE m15?k=1-168 0 11
hello redis
END
echo -ne "get m15?k=1-187rn" | nc 127.0.0.1 9999
VALUE m15?k=1-187 0 6
line 2
END
Wie wir erwarten, wird das Redisergebnis, wenn Redis existiert, zurückgegeben, andernfalls werden die Lushan -Daten abgefragt.
Ein Modul schließen:
echo -ne "hmod_close 15rn" | nc 127.0.0.1 9999
Wenn alle Ihre Module keine globalen Variablen haben, können Sie HMOD_Open verwenden, um die alte Bibliothek direkt zu ersetzen, sodass Online -Dienste keinen Verlust haben.
Das Beispiel für Lecho ist ähnlich. Lediglich der angeforderten Daten gibt dieses Beispiel sehr einfach und wird nicht ausführlich beschrieben.
Hdict ist das von Lushan montierte Bibliotheksformat. Er ist sehr einfach. Es gibt zwei erforderliche Dateien im Verzeichnis HDICT_XXXX, DAT und IDX. Ersteres enthält Ihre Daten, und letzteres ist eine Zuordnung des Schlüssels zum Wertpositionsversatz in der DAT -Datei. Definition:
typedef struct {
uint64_t key;
uint64_t pos;
} idx_t;
Schlüssel ist ein 64-Bit-nicht signiertes langes Skelett, das die Bibliotheksnummer nicht enthält. POS besteht aus der Länge des Wertes und seinem Offset in der DAT -Datei:
pos = (length << 40) | offset;
Die IDX -Datei muss in aufsteigender Reihenfolge von idx_t.key angeordnet sein. DAT -Dateien sind nicht erforderlich. Sie können entweder einen Index für eine DAT -Datei erstellen, die bereits vorhanden ist, oder gleichzeitig einen Index generieren, wenn Sie die Datei ausgeben.
Bestellte Dateien sind in MAP-Reduce-Computermodellen sehr häufig. Sie können das Ausgabedateiformat in Hadoop angeben, um eine Bibliothek im HDICT -Format zu generieren. Zum Beispiel der folgende Befehl:
job.setOutputFormat(LushanFileOutputFormat.class);
Es gibt drei Befehle, um statistische Statusdaten zu erhalten: Statistiken, Info und hmod_info. Die ersteren geben globale Daten aus, während die beiden letzteren Daten für jede Bibliothek und jedes Modul ausgeben.
echo -n -e "statsrn" | nc 127.0.0.1 9999
STAT pid 13810
STAT uptime 1435075686
STAT curr_connections 1411
STAT connection_structures 4061
STAT cmd_get 2099151223
STAT get_hits 3950240117
STAT get_misses 2443878402
STAT threads 16
STAT timeouts 117
STAT waiting_requests 0
STAT ialloc_failed 0
END
echo -n -e "inforn" | nc 127.0.0.1 9999
id label state ref num_qry idx_num open_time path
----------------------------------------------------------------
1 interest_CF_trends OPEN 0 139922 18419392 150824-042654 /mnt/lushan/hdb/12/hdict_20150711204737
2 interest_CF_trends OPEN 0 190508 26175141 150824-050246 /mnt/lushan/hdb/12/hdict_20150711204737
echo -ne "hmod_inforn" | nc 127.0.0.1 9999
id label state ref num_qry open_time path
----------------------------------------------------------------
0 OPEN 0 267130787 180419-174502 /mnt/lushan/hmod/0
5 OPEN 0 336829974 180419-174503 /mnt/lushan/hmod/5
Sie können Lushan.php verwenden, um grafische Statistikstatusseiten zu erstellen.
Wenn Sie Erfahrung mit MySQL haben, ist es einfach, einen einfachen Cluster zu erstellen. Erstens möchten Sie Ihre Daten in Gruppen teilen, normalerweise ein Vielfaches der Maschinennummer. Überlegen Sie dann, wie viele Dienstesätze Sie bereitstellen möchten, normalerweise zwei in verschiedenen IDCs verteilten Sätze. Befolgen Sie dann die Gruppierungsregeln, um Ihre Daten über den Memcached -Client abzufragen.
Obwohl es sehr einfach ist, bietet Lushan immer noch ein einfaches Rahmen, um einige Details der Datenübertragung zu verarbeiten.
Das Memcached -Protokoll ist relativ einfach. Der Befehl Set Class unterstützt komplexe Anforderungen, unterstützt jedoch nur relativ einfache Ergebnisse. Lushan hat zwei Änderungen daran vorgenommen.
Der "Schlüssel" der GET -Anforderung kann das 250 Byte -Grenze überschreiten. Einstellungen beim Senden:
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 0);
Auf diese Weise gibt es kein Problem damit, Libmemcached zu senden. Bei der Rückgabe des Ergebniss müssen Sie den Schlüssel innerhalb von 250 Bytes zurückgeben. Solange Sie beim Lesen gemäß dem abgeschnittenen Schlüssel lesen und der abgeschnittene Schlüssel nicht in Konflikt steht.
Die Verwendung unterstützt das Senden mehrerer Anfragen. Normalerweise reicht eine einfache Get -Anfrage aus, aber wenn Sie eine ähnliche Anfrage wie JSON senden möchten, benötigen Sie ein komplexeres Protokoll. Lushan modifizierte das GET-Protokoll neu und modifizierte es an demselben Protokoll wie eingestellt. Drücken Sie bei Verwendung des Clients die obigen Einstellungen, um die Legalität der Taste zu überprüfen, und senden Sie dann ein Paket im folgenden Format:
gets key 0 0 value_lenrn
valuern
Holen Sie sich einfach den Schlüssel im Rückgabeergebnis. Die Kapselung wird in lutil.h hergestellt und rufen Sie einfach hrequest_pack an.
Es gibt mehr Zeitüberschreitungen in Status, oder Sie zeichnen mehr Anfragen vom Client zu Zeitüberschreitungszeiten auf, die mehr oder gleich Ihrer Konfiguration sind.
Es gibt viele HDICT -Dateien, die unter einer bestimmten Anzahl von Uploads nicht übertragen wurden, was normalerweise bedeutet, dass Ihr Übertragungsskript unterbrochen wird, bevor es übertragen wird.