Ich verwende scylla db und habe eine Tabelle mit der IP-Adresse als Primärschlüssel. Die RF für den Cluster ist 3. Ich finde, dass einige Knoten viel mehr Lasten haben (mehr Speicherplatz beanspruchen) als andere, selbst wenn die owns
Statistiken nahe beieinander liegen (31% ~ 35%).
Ich frage mich, ob das daran liegt, dass ich die IP-Adresse als Primärschlüssel verwende und einige IP-Adressen heißer sind als andere (wie mehr Updates für diese IPs).
Antworten:
Die Tatsache, dass einige IP-Adressen heißer sind - mehr Lese- oder Schreibvorgänge als andere -, ist normalerweise kein großes Problem und ziemlich üblich. Scylla teilt sie zufällig auf die verschiedenen Knoten (und Kerne auf jedem Knoten) auf. Solange Sie wesentlich mehr Hot-Partitionen als Kerne in Ihrem Cluster haben, sollte die Last - und die Festplattennutzung - ziemlich ausgewogen sein.
In extremen Fällen können sich die Dinge ändern, z. B. wenn bei jedem Update eine Partition vergrößert wird (dh eine Zeile hinzugefügt wird) und nur wenige Partitionen extrem heiß sind. Sie können sich beispielsweise eine Datenbank vorstellen, in der Anforderungen protokolliert werden. Zusätzlich zu einer Million normaler Clients mit 10 Anforderungen pro Tag gibt es 10 "Angreifer", die täglich eine Million Anforderungen stellen. In solchen extremen Fällen können Sie feststellen, dass einige der Knoten erheblich mehr Last und / oder Speicherplatz tragen als andere. Solche extremen Fälle können auch andere Probleme verursachen: Obwohl sich die Unterstützung von Scylla für große Partitionen in letzter Zeit verbessert hat, ist sie immer noch nicht perfekt, und wenn Sie solche extremen Fälle vermeiden können, ist es besser.
Wenn ich schließlich zu Ihrer ursprünglichen Frage zurückkehre: "Ist die Verwendung der IP-Adresse als Primärschlüssel eine gute Vorgehensweise in scylla db?", Lautet die Antwort "Ja, aber":
Es ist "Ja", da Scylla kein spezifisches Problem mit IP-Adressen als Schlüssel hat - es verteilt die verschiedenen IP-Adressen zufällig auf verschiedene Knoten (unter Verwendung der Hash-Funktion "murmur3"), so dass es kein besonderes Problem mit der Tatsache gibt, dass IP-Adressen sich verklumpen zusammen (z. B. werden mehrere Clients aus demselben Subnetz nicht nur an dieselben Clusterknoten gesendet).
Es ist "aber", weil das Problem nicht die IP-Adressen als Schlüssel an sich ist, sondern der Inhalt der Partition, die Sie dafür speichern möchten, und wie verzerrt die Aktualisierungshäufigkeit - und -größe - für die verschiedenen Partitionen ist.
Oh, und noch eine letzte Anmerkung:
Wenn Sie STCS ( Size Tierd Compaction Strategy ) verwenden, kann die maximale Speicherplatznutzung zu einem bestimmten Zeitpunkt erheblich höher sein als die tatsächlich gespeicherte Datenmenge. Wenn Ihre Arbeitslast stark überschrieben wird (Daten werden nicht hinzugefügt, sondern ersetzt, gelöscht usw.), können die Daten auf der Festplatte vor Abschluss der Komprimierung sehr gut doppelt so groß sein wie die tatsächliche Datenmenge. Wenn dies der Fall ist und Sie das System zu einem zufälligen Zeitpunkt inspizieren, werden Sie dies tunBeachten Sie, dass einige Knoten mehr Daten auf der Festplatte haben als andere, abhängig von ihrer zufälligen Position in der Verdichtungsarbeit, wenn Sie diese Messung durchführen. Sie können überprüfen, ob dies der Fall ist, indem Sie auf allen Knoten eine "Hauptverdichtung" aufrufen und dann die Festplattennutzung messen. Dabei wird erwartet, dass die Festplattennutzung über die Knoten hinweg viel einheitlicher ist.
quelle
Sie haben wahrscheinlich Recht, fügen Sie besser ein weiteres Feld hinzu, um die Daten besser zu verbreiten
quelle
Wenn Sie nur Ihre Frage beantworten und davon ausgehen, dass die IP-Adressen gleichmäßig verteilt und Ihre Zugriffsmuster gleichmäßig verteilt sind, ist dies für jede Datenbank mit Daten-Sharding völlig in Ordnung. In vielen Fällen, in denen Ihre Verteilungen nicht sehr einheitlich sind, ist dies ebenfalls in Ordnung. Beispiel: Ihr Zugriffsmuster berührt einige IPs mehr als andere.
Abhängig von der Datenbank-Sharding-Strategie macht es einen Unterschied, ob Sie monoton ansteigende Werte (z. B. sequentielle IPs) (MongoDB, Spanner, DataStore usw.) erfassen. Im Fall von ScyllaDB hascht Scylla jeden Partitionsschlüssel standardmäßig mit MurMurHash3, sodass Sie davon ausgehen können, dass Ihre Datenaufnahme gleichmäßig über den Token-Ring verteilt ist.
Wie auch immer, wenn Sie per Key == IP lesen / schreiben müssen, haben Sie keine große Wahl. Dies kann jedoch von den Besonderheiten Ihrer Aufgabe abhängen.
Die Last misst normalerweise den Durchsatz, der entweder Festplatten-IOPS oder Anwendungsanforderungen / Sek. Ist, oder die Auslastung in%. Wenn Sie die Speicherplatznutzung in Betracht ziehen, ist das eine ganz andere Geschichte.
Wenn Sie die relative Durchsatzknotenauslastung gemeint haben, kann dies z.
Wenn Sie Speicherplatz gemeint haben, gibt es neben dem, was ich erwähnt habe, noch viele andere Faktoren:
Nein.
Dies hängt von den oben genannten Faktoren ab und davon, was Sie unter Last verstehen. Wenn Sie Speicherplatz gemeint haben, haben Ihre Lesezugriffe keinen Einfluss darauf. Schreibt kann.
quelle
Aus diesen Gründen ist es eine schlechte Praxis, eine IP-Adresse als Primärschlüssel zu haben.
quelle