1. Einführung in das Geschäftsszenario Angenommen, es gibt ein E-Commerce-System, das Natürlich wissen einige Freunde, wie man die Datenbank nach Provinzen/Regionen oder bestimmten Geschäftsbeziehungen aufteilt. OK, jetzt stellt sich die Frage, wie sichergestellt werden kann, dass Daten in unterschiedlichen Tabellen in unterschiedlichen Bibliotheken gespeichert werden? Soll die Bibliothek den Parallelitätsdruck reduzieren? Wie sollen die Regeln für die Teilbibliotheks- und Tischaufteilung formuliert werden? Keine Sorge, es kommt bald 2. Horizontale Datenbank- und Tabellenaufteilungsmethode1.BEREICHDie erste Methode besteht darin, einen Datenbereich anzugeben, in den die Tabelle aufgeteilt werden soll, z. B. von 1 bis 1000000, 1000001-2000000, wobei eine Tabelle für eine Million verwendet wird, wie in der folgenden Abbildung dargestellt Bildbeschreibung hier einfügen Natürlich erfordert diese Methode die Pflege der Tabellen-ID, insbesondere in einer verteilten Umgebung. Für diese verteilte ID wird empfohlen, Vorteile der RANGE-Methode: Einfache Erweiterung, Datenbank und Tabelle müssen nur im Voraus erstellt werden Nachteile der RANGE-Methode: Die meisten Lese- und Schreibvorgänge greifen auf neue Daten zu, was zu einem IO-Engpass führt. Dies führt zu übermäßigem Druck auf die neue Datenbank und wird nicht empfohlen. 2. HASH-Modul Um das IO-Engpassproblem der Auf diese Weise können die Daten auf verschiedene Datenbanken und Tabellen verteilt werden, wodurch das Problem von E/A-Engpässen vermieden wird. Vorteile der HASH-Modulmethode: Sie kann sicherstellen, dass die Daten gleichmäßig auf verschiedene Datenbanken und Tabellen verteilt sind, wodurch der Datenbankdruck verringert wird Nachteile der HASH-Modulmethode: Die Erweiterung ist schwierig und der Hashwert muss bei jeder Datenmigration neu berechnet und verschiedenen Datenbanken und Tabellen zugewiesen werden 3. Konsistentes HASHModulo durch HASH ist nicht die perfekteste Methode, also was ist es? Die Verwendung eines konsistenten HASH-Algorithmus kann das Problem perfekt lösen Allgemeiner HASH-Algorithmus: Ein gängiger Hash-Algorithmus bildet einen Binärwert beliebiger Länge auf einen kürzeren Binärwert fester Länge ab. Dieser kleine Binärwert wird als Hash-Wert bezeichnet. Ein Hashwert ist eine eindeutige und äußerst kompakte numerische Darstellung eines Datenelements. Die Mängel gewöhnlicher Konsistenter HASH-Algorithmus: Verwenden Sie den allgemein verwendeten Dieser Ring ist Ende an Ende verbunden. Angenommen, es gibt drei Datenbankserverknoten: OK, nehmen wir jetzt an, dass Knoten3 ausfällt. Sie werden feststellen, dass Benutzer3 auf Knoten4 fällt. Sie werden feststellen, dass der konsistente Hashing-Algorithmus durch die Analyse des Hinzufügens und Löschens von Knoten die Datenmigration minimieren und gleichzeitig die Monotonie aufrechterhalten kann. Ein solcher Algorithmus eignet sich sehr gut für verteilte Cluster, da er die Migration großer Datenmengen vermeidet und den Serverdruck verringert. Natürlich gibt es noch ein Problem, das gelöst werden muss: das Gleichgewicht. Aus der Abbildung können wir erkennen, dass bei relativ wenigen Serverknoten ein Problem auftritt. Das heißt, dass sich zwangsläufig eine große Datenmenge auf einem Knoten konzentriert und nur sehr wenige Daten auf einem anderen Knoten. Um dieses Datenschiefeproblem zu lösen, führt der konsistente Hashing-Algorithmus einen virtuellen Knotenmechanismus ein, der mehrere Hashes für jeden Serviceknoten berechnet und an jedem Berechnungsergebnisort einen Knoten platziert, der als virtueller Knoten bezeichnet wird. Der konkrete Ansatz besteht darin, zunächst die Anzahl der mit jedem physischen Knoten verknüpften virtuellen Knoten zu ermitteln und dann nach der IP oder dem Hostnamen eine Zahl hinzuzufügen. Beispielsweise können im obigen Fall für jeden Server drei virtuelle Knoten berechnet werden, sodass die Hashwerte von „ Beispielsweise befindet sich Benutzer1 auf Vorteile der konsistenten HASH-Methode: Virtuelle Knoten können sicherstellen, dass die Daten gleichmäßig auf verschiedene Datenbanken und Tabellen verteilt sind. Das Hinzufügen oder Löschen von Knoten wirkt sich nicht auf die Daten anderer Knoten aus und bietet eine hohe Verfügbarkeit und starke Katastrophentoleranz. Nachteile der konsistenten Modulmethode: Im Vergleich zu den beiden oben genannten kann davon ausgegangen werden, dass es keine gibt. 3. Unit-TestsOK, kein Unsinn mehr, als nächstes kommt der Unit-Test. Angenommen, es gibt drei Knoten, jeder Knoten hat drei virtuelle Knoten Paket com.hyh.core.test; importiere com.hyh.utils.common.StringUtils; importiere org.junit.Test; importiere java.util.LinkedList; importiere java.util.List; importiere java.util.SortedMap; importiere java.util.TreeMap; /** * Konsistenz-HASH-TEST * * @Autor heyuhua * @erstellen 31.01.2021 19:50 */ öffentliche Klasse ConsistentHashTest { //Liste der Server, die zum Hash-Ring hinzugefügt werden sollen private static String[] servers = {"192.168.5.1", "192.168.5.2", "192.168.5.3"}; // Echte Knotenliste. In Anbetracht der Szenarien, in denen der Server online und offline geht, d. h. Szenarien zum Hinzufügen und Löschen häufiger auftreten, ist es hier besser, LinkedList zu verwenden private static List<String> realNodes = new LinkedList<>(); //Virtueller Knoten, Schlüssel stellt den Hash-Wert des virtuellen Knotens dar, Wert stellt den Namen des virtuellen Knotens dar private static SortedMap<Integer, String> virtualNodes = new TreeMap<>(); //Ein realer Knoten entspricht 3 virtuellen Knoten private static final int VIRTUAL_NODES = 3; /** * Testen Sie die Konsistenz von HASH mit virtuellen Knoten */ @Prüfen öffentliche void testConsistentHash() { : InitNodes(); String[] Benutzer = {"Benutzer1", "Benutzer2", "Benutzer3", "Benutzer4", "Benutzer5", "Benutzer6", "Benutzer7", "Benutzer8", "Benutzer9"}; für (int i = 0; i < Benutzer.Länge; i++) System.out.println("[" + users[i] + "]'s Hashwert ist " + getHash(users[i]) + ", weitergeleitet zu node[" + getServer(users[i]) + "]"); } /** * Fügen Sie zuerst den Originalserver zur realen Knotenliste hinzu */ öffentliche void initNodes() { für (int i = 0; i < Serverlänge; i++) realNodes.add(servers[i]); für (String str : realNodes) { für (int i = 0; i < VIRTUAL_NODES; i++) { String virtualNodeName = str + "-virtueller Knoten" + String.valueOf(i); int hash = getHash(virtuellerKnotenname); System.out.println("Virtueller Knoten [" + virtualNodeName + "] wird hinzugefügt, Hash-Wert ist " + hash); virtualNodes.put(hash, virtuellerKnotenname); } } System.out.println(); } //Verwende den FNV1_32_HASH-Algorithmus, um den Hash-Wert des Servers zu berechnen. Die Methode zum Umschreiben von HashCode wird hier nicht verwendet und der endgültige Effekt ist nicht unterschiedlich private static int getHash(String str) { endgültige Ganzzahl p = 16777619; int hash = (int) 2166136261L; für (int i = 0; i < str.length(); i++) Hash = (Hash ^ str.charAt(i)) * p; Hash += Hash << 13; Hash ^= Hash >> 7; Hash += Hash << 3; Hash ^= Hash >> 17; Hash += Hash << 5; // Wenn der berechnete Wert negativ ist, nehmen Sie seinen Absolutwert, wenn (Hash < 0) hash = Math.abs(hash); Hash zurückgeben; } //Den Knoten abrufen, zu dem weitergeleitet werden soll private static String getServer(String key) { //Den Hash-Wert des Schlüssels abrufen int hash = getHash(key); // Alle Maps holen, die größer sind als der Hash-Wert SortedMap<Integer, String> subMap = virtualNodes.tailMap(hash); Zeichenfolge virtueller Knoten; wenn (subMap.isEmpty()) { //Wenn es keinen Hash-Wert gibt, der größer als der Schlüssel ist, beginnen Sie beim ersten Knoten. Integer i = virtualNodes.firstKey(); //Gib den entsprechenden Server zurück virtualNode = virtualNodes.get(i); } anders { //Der erste Schlüssel ist der Knoten, der dem Knoten im Uhrzeigersinn am nächsten ist. Integer i = subMap.firstKey(); //Gib den entsprechenden Server zurück virtualNode = subMap.get(i); } //Der Name des virtuellen Knotens virtualNode muss abgefangen werden, wenn (StringUtils.isNotBlank(virtualNode)) { returniere virtualNode.substring(0, virtualNode.indexOf("-")); } gibt null zurück; } } Hier simulieren wir die Situation, in der 9 Benutzerobjekte nach dem Hashen weitergeleitet werden. Sehen Sie sich die Ergebnisse an Zusammenfassen: Es wird dringend empfohlen, einen konsistenten Dies ist das Ende dieses Artikels über die Details von Das könnte Sie auch interessieren:
|
<<: Unterschiede zwischen FLOW CHART und UI FLOW
>>: Lösung für großen Zeilenabstand (5 Pixel mehr im IE)
Manchmal müssen wir bei unserer tatsächlichen Arb...
Was sind XHTML-Tags? XHTML-Tag-Elemente sind die ...
Vorwort: Ich habe Win10 neu installiert und gleic...
Der Unterschied zwischen relativ und absolut in H...
Inhaltsverzeichnis Rendern Installieren Code-Impl...
Das CSS-Zählerattribut wird von fast allen Browse...
Nachdem Sie einen Container lokal erstellt haben,...
Flash-Dateiformate: .FLV und .SWF Für das Flash-Vi...
In diesem Artikel werden einige der Techniken ausf...
1. Langsame Abfrage aufgrund fehlenden oder ungül...
Überblick: Oracle Scott-Benutzer haben vier Tabel...
MongoDB-Installationsprozess und Problemaufzeichn...
Inhaltsverzeichnis 1. Übersicht 1.1 Was ist der s...
In diesem Artikelbeispiel wird der spezifische JS...
yum install httpd php mariadb-server –y Notieren ...