Wow, Sie haben für dieses Problem einige schrecklich bullige Hardware. Es gibt nicht viel mehr, was die Hardware angeht, mit Ausnahme eines Upgrades auf Sandy / Ivy Bridge-CPUs für eine 20-50% bessere Leistung bei Btree-Suchvorgängen usw.
Bitte beachten Sie, dass meine Stärke Innodb ist, also gehe ich zu
- Ignorieren Sie, dass Sie myisam sind und tun Sie, als würde es keinen Unterschied machen.
- Angenommen, dieses Problem ist ausreichend, um Sie zum Upgrade zu bewegen. Ja, es ist ein Upgrade.
Innodb kann dabei helfen, den gesamten Speicher auszunutzen, indem diese Zeilen, auf die häufig zugegriffen wird, in seinem Pufferpool gespeichert werden. Sie können es so einstellen, dass es so groß ist, wie Sie möchten (etwa 80% des Speichers), und neue Lese- / Schreibvorgänge verbleiben im Speicher, bis sie auf die Festplatte verschoben werden müssen, um mehr Platz für die zuletzt aufgerufenen Daten zu schaffen. Im Speicher ist eine Größenordnung schneller als Ihre FusionIOs.
Es gibt viele weitere Innodb-Funktionen wie adaptive Hashes, Auto-Inc-Sperrmechanismen usw., die für Ihre Umgebung von Vorteil sein können. Sie kennen Ihre Daten jedoch besser als ich.
In der Welt von innodb besteht eine gute kurzfristige Lösung darin, Ihren Slave zu optimieren. Brauchen Sie wirklich jeden Index für Ihren Slave, den Sie für Ihren Master haben? Indizes sind eine Kugel und eine Kette von Einfügungen / Aktualisierungen / Löschungen, AUCH bei Fusion-IO-Karten. IOPS ist hier nicht alles. Sandy / Ivy-Bridge-Procs haben einen viel besseren Speicherdurchsatz und eine bessere Rechenleistung - sie können einen großen Unterschied zu den Westmeres machen, die Sie jetzt haben. (Abbildung 20-50% insgesamt). Entfernen Sie alle nicht benötigten Indizes auf dem Slave!
Zweitens, und dies gilt mit ziemlicher Sicherheit nur für innodb, kann mk-prefetch wissen, welche Aktualisierungen vorliegen und bevor der Slave sie schreibt. Dies ermöglicht mk-prefetch, zuerst eine Leseabfrage auszuführen, wodurch die Daten gezwungen werden, sich zu dem Zeitpunkt im Speicher zu befinden, zu dem die einzelne Replikation die Schreibabfrage ausführt. Dies bedeutet, dass sich die Daten im Speicher und nicht in fusionIO befinden, was eine schnelle Leistungssteigerung von einer Größenordnung darstellt. Das macht einen RIESIGEN Unterschied, mehr als man erwarten könnte. Viele Unternehmen nutzen dies als dauerhafte Lösung. Weitere Informationen finden Sie im Percona Toolkit .
Drittens, und vor allem, wenn Sie ein Upgrade auf Innodb durchgeführt haben, sollten Sie Tokutek auf jeden Fall ausprobieren. Diese Jungs haben ein paar unglaublich tolle Sachen, die die Leistung von Innodb beim Schreiben / Aktualisieren / Löschen um ein Vielfaches übertreffen. Sie kündigen eine verbesserte Replikationsgeschwindigkeit als einen der Hauptvorteile an , und Sie können anhand ihrer Benchmarks erkennen, warum Fusions crazy IOPS Ihnen bei Btrees immer noch nicht weiterhilft . (Anmerkung: Nicht unabhängig von mir verifiziert.) Sie verwenden einen Drop-In-Ersatz für einen Btree-Index, der viele der algorithmischen Geschwindigkeitsbeschränkungen von Btree-Indizes verbessert, obwohl er schrecklich komplexer ist.
Ich bin gerade dabei, eine Übernahme von Tokutek in Betracht zu ziehen. Wenn sie so viel Schreibgeschwindigkeit freigeben, kann ich mehr Indizes hinzufügen. Da sie die Daten und Indizes mit so hervorragenden Verhältnissen komprimieren (25x zitieren sie), zahlen Sie nicht einmal einen (Leistungs-, Wartungs-) Preis für erhöhte Daten. Sie zahlen ($) für ihren Motor, 2500 $ / Jahr pro vorkomprimiertem GB, IIRC. Sie haben Rabatte, wenn Sie die Daten replizieren lassen, aber Sie können Tokutek auch einfach auf Ihrem Slave installieren und Ihren Master so lassen, wie er ist. Informieren Sie sich über die technischen Details in der MIT Algoritms Open Courseware-Vorlesung . Alternativ haben sie jede Menge technisches Material in ihrem Blog und regelmäßige Whitepapers für diejenigen, die nicht 1:20 Zeit haben, sich das Video anzuschauen. Ich glaube, dieses Video gibt auch die Big-O-Formel für die Schnelligkeit der Lesevorgänge an. Ich habezu vermuten, dass die Lesevorgänge langsamer sind (es gibt immer einen Kompromiss!), aber die Formel ist zu komplex, als dass ich abschätzen könnte, wie viel. Sie behaupten, es sei ungefähr dasselbe, aber ich würde lieber die Mathematik verstehen (nicht wahrscheinlich!). Möglicherweise sind Sie in einer besseren Situation, dies zu entdecken, als ich.
Ps Ich bin nicht mit Tokutek verbunden, ich habe ihr Produkt nie ausgeführt und sie wissen nicht einmal, dass ich sie ansehe.
Update :
Ich sehe, dass Sie auf dieser Seite noch einige andere Fragen haben und ich dachte, ich würde einspringen:
Erstens funktioniert das Vorabrufen von Sklaven mit ziemlicher Sicherheit nicht für myisam, es sei denn, Sie haben eine außergewöhnliche Umgebung. Dies liegt hauptsächlich daran, dass beim Prefetching genau die Tabellen gesperrt werden, in die Sie schreiben möchten, oder dass der Slave-Thread die Tabelle gesperrt hat, die der Pre-Fetch-Daemon benötigt. Wenn Ihre Tabellen für die Replikation sehr ausgewogen sind und verschiedene Tabellen im Round-Robin-Verfahren beschrieben werden, funktioniert dies möglicherweise. Beachten Sie jedoch, dass dies sehr theoretisch ist. Das Buch "High Performance Mysql" enthält weitere Informationen im Abschnitt "Replikationsprobleme".
Zweitens, vermutlich hat Ihr Slave eine Last von 1.0-1.5. Sie kann höher sein, wenn Sie andere Prozesse oder Abfragen ausführen, aber eine Grundlinie von 1.0 haben. Dies bedeutet, dass Sie wahrscheinlich CPU-gebunden sind, was wahrscheinlich mit Ihrem FusionIO an Bord ist. Wie ich bereits erwähnte, wird Sandy / Ivy Bridge ein bisschen mehr Schwung geben, aber wahrscheinlich nicht genug, um Sie mit minimaler Verzögerung durch die raueren Zeiten zu bringen. Wenn die Last auf diesem Slave hauptsächlich nur schreibgeschützt ist (dh nicht viele Lesevorgänge), verbringt Ihre CPU mit ziemlicher Sicherheit Zeit damit, Positionen für das Einfügen / Löschen von Bäumen zu berechnen. Dies sollte meinen obigen Punkt zum Entfernen nicht kritischer Indizes verstärken - Sie können sie später jederzeit wieder hinzufügen. Das Deaktivieren von Hyperthreading funktioniert nicht, mehr CPU ist nicht Ihr Feind. Wenn Sie mehr als 32 GB RAM haben, beispielsweise 64 GB, müssen Sie sich um die RAM-Verteilung kümmern, aber auch dann sind die Symptome unterschiedlich.
Schließlich und vor allem (überspringen Sie diesen Teil nicht;)) gehe ich davon aus, dass Sie jetzt RBR (zeilenbasierte Replikation) ausführen, weil Sie eine nicht triviale Leistungssteigerung erwähnt haben, als Sie ebenfalls gewechselt haben. Es kann jedoch eine Möglichkeit geben, hier noch mehr Leistung zu erzielen. Der MySQL-Fehler 53375 kann auftreten, wenn Tabellen ohne Primärschlüssel repliziert werden. Der Slave ist im Grunde nicht schlau genug, etwas anderes als einen Primärschlüssel zu verwenden. Daher zwingt das Fehlen eines solchen Schlüssels den Replikationsthread, bei jedem Update einen vollständigen Tabellenscan durchzuführen. Ein Fix fügt einfach einen gutartigen, selbstinkrementierenden Ersatz-Primärschlüssel hinzu. Ich würde dies nur tun, wenn die Tabelle groß wäre (z. B. mehrere Zehntausend Zeilen oder größer). Dies geht natürlich zu Lasten eines anderen Indexes auf dem Tisch, der den Preis, den Sie in der CPU zahlen, erhöht. Beachten Sie, dass es nur sehr wenige theoretische Argumente dafür gibt, da InnoDB ein Argument hinter den Kulissen hinzufügt, wenn Sie dies nicht tun. Das Phantom ist jedoch keine nützliche Abwehr gegen 53375. Wolfram kann dieses Problem ebenfalls lösen, aber Sie müssen bei der Verwendung von Wolfram sicherstellen, dass Ihre Kodierung korrekt ist. Das letzte Mal, als ich damit gespielt habe, ist es fürchterlich abgestorben, wenn eine Nicht-UTF8-Zeichenfolge repliziert werden musste. Das ist ungefähr die Zeit, in der ich es aufgegeben habe.