Datenbank Mammut Projekt mit der Beere (wie tunen?)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo an alle,

    folgendes. Habe eine Auswertung, die jeden Tag 140 Mio Datenstätze erzeugt. Aber unser Host hat gesagt, wir sollen das unterlassen
    da andere auf dem Server (normaler Shared webserver) in die Knie gehen...

    Jetzt ist es so, dass ich mir nen RaspberryPi2 geholt habe und mysql aufgesetzt habe. läuft soweit alles Habe folgende Fragen:


    - Wie könnte ich meine Inserts in die DB beschleunigen?
    (ich weiß ich könnte übertakten, werde ich auch tun, aber kann ich darüber hinaus nicht
    vlt sogar der MYSQL DB gezielt 75% des Arbeitsspeicher reservieren, weil der RAM viel wichtiger wie die CPU Leistung ist?)

    - Nützt es was den SWAP zu erweitern? (hab erst seit ein paar Monaten mit Linux Erfahrung, hab das nur immer mal wieder gelesen)

    - Wie kann ich meiner DB mitteilen, dass sie Ihre gesamten Daten auf meine USB Festplatte speichern soll, statt auf die eigene System SD Card?
    (Müsste doch dann auch schneller sein, statt auf SD Karte oder?)

    - Wollte gestern eine USB 3.0 Festplatte anschließen, weil ich mir dadurch weiteres Performance Tuning erhoffe, aber die läuft gar nicht erst an
    obwohl ich ein 2A, 5V Netzteil (von Samsung) benutze.

    - Hat jemand nen Erfahrungswert obs gerade mit kleineren System wie dem Pi (Pi2) eine "schmalere" Datenbanken gibt, SQLite hab ich schon
    im Auge, aber die sollen bei mehr wie 10 Mio Datensätze auch lahmen soll...?

    1000 Dank vorab an alle, die mir Tips, Tricks und Anregungen geben könnten :)

    Grüße

    Alex

  • Datenbank Mammut Projekt mit der Beere (wie tunen?)? Schau mal ob du hier fündig wirst!

  • Ich finde 140Mio Datensätze täglich für einen "normalen" Server schon sehr sportlich - deswegen wirst Du den Pi/Pi2 damit hoffnungslos überfordern. Das heisst, Du wird die Daten bestimmt in endlicher Zeit in die DB geschaufelt haben, aber was ist dann?

    Die wichtigere Frage ist doch, weiviel Zeit hast Du dafür die Daten abzulegen und wie willst Du sie auswerten?


  • Ich finde 140Mio Datensätze täglich für einen "normalen" Server schon sehr sportlich - deswegen wirst Du den Pi/Pi2 damit hoffnungslos überfordern. Das heisst, Du wird die Daten bestimmt in endlicher Zeit in die DB geschaufelt haben, aber was ist dann?

    Die wichtigere Frage ist doch, weiviel Zeit hast Du dafür die Daten abzulegen und wie willst Du sie auswerten?


    das haben wir bereits getestet...

    Ergebniss mit normalen Webserver

    144.500.040 Datensätze in ca. 7 Stunden (in die DB geschrieben nur da sind wir gedrosselt worden wegen den anderen Kunden auf dem Server),
    die DB ist 7,7 Gb groß also passt doch wunderbar auf ne USB Platte dachten wir uns :D getestet auf einem unserer normalen webserver...

    Abfragen (macht aber ein ganz anderes separates script alle paar Stunden einmal auf vlt einen Datensatz oder so) Also die Abfragen sind sehr sehr sehr selten
    im Verhältnis zum Einschreiben...


    Ergebniss mit normalen Raspberry Pi2
    Gestern Abend hab ich mitm Rapsberry pi2 getestet und es kommen in der Sekunde ca. 4000 neue Datensätze rein.
    ca. 4000 x 60 x 60 = ca. 14 Mio (also ca. 10 Stunden, das wäre natürlich schon zu optimieren)


    zu Deiner Frage:
    Die Daten sollen auf jeden Fall in einem Tag abgefragt werden, darf nicht länger dauern. Aber in der Zeit wird ja der Raspi auch etwas einknicken und
    das würden wir gerne vermeiden bzw. soweit es geht vermeiden....

    • Offizieller Beitrag

    140Mio? Wie kommst du drauf das wenn der gemietete Server in die nie geht (auch wenn es bloss ein "Shared" ist) das das der Pi auch nur Ansatzweise schaffen kann? Ich hab keine Ahnung was du Auswertest (würde mich aber wirklich interessieren) aber in diesem Maßstab musst du einiges an Geld Ausgeben. Unser NAV SQL Server hat geht während grossen Plaungsläufen auch in die Knie, und die Kiste hat nen 8 Core XEON mit 96GB RAM...und da kommen deutlich weniger als 140.000.000 Datensätze zusammen

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.


  • 140Mio? Wie kommst du drauf das wenn der gemietete Server in die nie geht (auch wenn es bloss ein "Shared" ist) das das der Pi auch nur Ansatzweise schaffen kann? Ich hab keine Ahnung was du Auswertest (würde mich aber wirklich interessieren) aber in diesem Maßstab musst du einiges an Geld Ausgeben. Unser NAV SQL Server hat geht während grossen Plaungsläufen auch in die Knie, und die Kiste hat nen 8 Core XEON mit 96GB RAM...und da kommen deutlich weniger als 140.000.000 Datensätze zusammen


    ja aber wenn ich das aufm Rasp ausführe alles, dann stört das keine MenschenSeele und ein eigener großer Server ist mir jetzt noch
    zu kostspielig, bin noch Student :p

    Hab gestern die Tests am Raspberry probiert und es funktioniert, aber ich würde gerne wissen ob vlt noch besser geht ;)
    wie gesagt 4000 Datensätze die Sekunde und das mit einzelnen Inserts....

    Meine geplanten Optimierungsvorschläge:

    ==> keinen einzelnen Inserts, sondern immer 10k z.b.
    ==> MySQL im RAM auslagern (ich weiß ist nur 1 GB groß, aber vlt bringts ja trotzdem bisschen was=
    ==> evtl. mit LOAD DATA INFILE arbeiten (soll ja sehr effektiv sein, hab ich gerade erst gelesen)

    und zur Info noch, es geht um einen WebCrawler, der sich XML files download (dauert ca. 3 Stunden) die liegen dann aber LOKAL
    das sind 33.000 XML files und jedes File hat nochmal an sich ca. 4240 Links die gespeichert werden sollen.... ca. 140.000.000

  • ja aber wenn ich das aufm Rasp ausführe alles, dann stört das keine MenschenSeele und ein eigener großer Server ist mir jetzt noch
    zu kostspielig, bin noch Student :p

    Warum muss ein Rasperry Pi dafür herhalten. Nimm einen normalen PC. Der ist meistens leistungsstärker als jede Himbeere.
    Arbeitsspeicher kannst Du da aufrüsten. Gute Festplatte rein. Linux drauf und rennt.
    Edit meint: Es gibt auch Leistungsfähige Server gebraucht!

    Ich glaube auch kaum, dass MySQL für die Menge an Daten ideal ist.

    Just my 2 Cents

    Viele Grüße
    Olaf

    Wer nicht gekennzeichnete Rechtschreibfehler findet darf sie gerne behalten..

    Einmal editiert, zuletzt von korky2 (26. Juni 2015 um 12:02)

  • Just my 2 Cents

    ok danke dir schon mal für d. Meinung

    Ja mir ging es um die Anschaffung und um den Strom usw.... :D

    wollte halt bissi experimentieren und dachte es geht vlt doch, die Tests zeigten das ja....
    Es geht nur halt etwas schleppend wobei ne super Sache 4000 Datensätze pro Sekunde, Hammer eigentlich!

    muss nur noch herausfinden, wie ich meine MySQL Speicherort ändere, wegen dem Auslager auf USB Platte und ob das
    mit Ram auslagern bei MySQL was mit 1 Gig Ram bringt..

  • Das hört sich doch endlich mal nach einem Problem nach meinem Geschmack an.

    Wieso der raspberry - na weil er da steht !! Ist das nicht der meist genutzte Grund für alles was man auf dem raspberry macht?

    Wenn du bei MySQL bleiben willst solltest du für dich testen ob du alles mit InnoDB machen kannst. Mixed oder nur MyISAM braucht bei vielen Daten meist um einiges mehr Saft, nicht unbedingt für die Inserts aber nachher beim verarbeiten.

    Wenn du dich in die Welt von postgres wagen willst, wirst du mehr aus dem raspi damit holen können. Da postgres generell mal einen kleineren Fußabdruck hat, storedsequences verarbeiten kann, etc. Also postgres ist nicht schneller als MySQL ... har har ... würde ichnie sagen, aberim Fall der limiteirten Resourcen und der Menge an Daten sollte es in der Gesamtrechnung besser abschneiden.

    Das mit der USB Platte ... hmmmm ... also ich hab einige Beiträge gelesen / gesehen in denen behauptet wird das eine USB 3 Platte am USB 2 Anschluss vom raspi Wunder tut ... aber selber getested habich das nicht und 100% richtig hört sich das auch nicht unbedingt an.

    Erstmal sicher stellen das du nichtne Billig Speicherkarte rein gesteckt hast ... denn DAS macht das Leben wirklich laaaaaaahm.

    Auch meine ganz billigen Komponenten aus China laufen ... aber nach 4 Wochen auf hoher See hat mein 1602 Display wohl etwas an Kontrast verloren.

    Einmal editiert, zuletzt von stranger26 (26. Juni 2015 um 12:23)

  • Guck dir vielleicht mal das hier an, wenn du InnoDB nutzt:
    Innodb Performance Optimization Basics

    Außerdem würde ich den Pi bei solch einem Vorhaben übertakten:

    Und, wenn noch möglich, vorher das System so weit abspecken, bis nur noch das Nötigste übrig bleibt.
    Ich habe mein Raspbian (kein netinstaller oder noobs) auf 900MB abgespeckt - ist also möglich.


  • danke schon mal für deinen Comment:

    - wie erkenn' ich denn das mit der SD Karte? gibts doch bestimmt n MessTool oder so right?
    - ok das mit der USB Platte muss man einfach mal ausprobieren, werd ich berichten
    - Wegen der InnoDB >> dachte, dass MyISAM besser geeignet wäre aber auch da werde ich ich nochmal ausgiebig testen
    - mit postgres noch nie gearbeitet, aber wenn das etwas bringen sollte würde ich das gerne auch mal probieren.

    Wobei ich wirklich gespannt bin, ob das mit dem Load Data Infile vlt die Lösung der Lösunge ist, denn lieber 20k Datensätze speichern und dann einmal ne Datei zu Mysql
    importieren, statt dauerhafte zich tausenden von Inserts zu generieren ::) und die Datenin der Zwischenzeit halt in einem Array gespeichert lassen oder so... mal sehen

    weiterhin über jeden Tip dankbar ;)

    Halte Euch auf dem Laufenden :p

  • Hallo,

    also grundsätzlich halte ich den Raspi hier auch für ziemlich unterdimensioniert, besonders, was RAM angeht. Denn bei Datenbankservern gilt auch heute noch in Bezug auf RAM: viel ist gut, mehr ist besser. Und viel heißt dann schon mal min 8-12 GB...

    Außerdem ist bei diesen Datenmengen eine schnelle Anbindung des Storage gut, also würde ich mal alles über USB verwerfen.

    Die andere, grundsätzlich Frage wäre: _muss_ du die Daten in einer relationalen DB speichern und könnte man das so ändern, dass das auch via z.B. KV-Store geht? Redis wäre da sein ein Kandidat, der ziemlich fix ist. Wäre je nach Daten und Auswertung ggf. eine Alternative.

    Gruß, noisefloor

  • Du fragst wie du deine INSERT's optimieren kannst - zeigst uns diese aber nicht. Auch sagst du leider nichts (oder hab ichs überlesen?) dazu was überhaupt 140 Millionen Datensätze pro Tag erzeugt. Wenn das tatsächlich derart viele sind würde ich erst mal in Frage stellen ob das gesamte Konstrukt vielleicht falsch umgesetzt wurde!?

    Wenn schon der shared Webhost-Server in die Knie ging finde ich den Schritt das ganze auf nem Pi2 machen zu wollen ein wenig verwirrend.

    Normale INSERT's alleine erzeugen nicht derart viel Last. Allerdings kann eine schlechte Datenbankstruktur auch normale INSERT's enorm ausbremsen.

    Es wäre also denk ich gut deine Datenbankstruktur sowie deine INSERT's mal zu zeigen - ansonsten kann selbst ein 16GB QuadCore System schon in die Knie gehen wenn diese schlecht sind.

  • Ich glaube bei bezahl-Webhostern bedeutet "in die Knie gehen" einfach nur, dass ein Server zu, sagen wir mal, 25% ausgelastet wird.
    Das passt denen dann nicht und die schieben dir einen Riegel vor.

  • hallo an alle,

    danke, dass ihr Euch das so einbringt!

    Also "in die Knie gehen" heißt in der Tat, es war alles in Ordnung, aber das ist laut vertrag nicht in Ordnung so und andere Kunden sollen damit nicht belastet werden, was aber NIE der Fall war.
    ABER (und das ist jetzt ganz wichtig für alles weitere hier in diesem Thema, es hat funktioniert) in der Nacht sogar doppelt so schnell wie tagsüber (was ja logisch ist)

    ich bin jetzt daheim und teste noch ein wenig rum, aber die Tests sehen alle super aus was den Speicher angeht, das ist eigentlich lächerlich was 4 oder 5 Cronjobs da so an Ram benötigen....

    und im Post #5 habe ich erklärt worum es geht...

    Großes Crawling Projekt im Rahmen des Informatik Studiums bin aber erst im 2. Semester hehe

    Scripte aber schon mein ganzes Leben, aber sowas habe ich halt noch nicht realisiert. Nur immer mal wieder kleine Sachen (OnlienShops, API Schnittstellenabindungen usw)

    meigrafd: Also die Daten kommen eigenltich aus einer riesen großen Sitemap die 33.000 Untersitemaps hat und jede dieser Untersitemaps hat nochmal zwischen und 3000 und 4000 urls und die NAMEN
    dieser URLS werden gespeichert.

    Da gibts keine große DB Struktur! ganz normale "INSERT INTO ... usw."

    Ich hab mir die 33.000 XML files runtergealden (waren ca. 24 GB)

    und die ligen auf meinem FTP

    und mein PHP script geht die alle nacheinander ab und speichert die URL Namen in eine DB Tabelle mit 2 Spalten

    ID und NAME

    thats it

    und falls jetzt fragen kommen wie das jemals alles benutzt werden soll, wir haben schon viele tests gemacht und derzeit sind 148 mio in einer Tabelle mit 7,7 GB und normale Selects funktionieren eigentlich wunderbar, mir ging
    es lediglich darum die Daten vlt noch schneller abzuspeichern (Denn das ziehen der XML Files dauert nur 3 Stunden, aber die INSERTS zwischen 7 und 14 Stunden je nach Auslastung des fremden Webservers) <--- was ja jetzt nicht
    mehr der Fall ist weil wir ja jetzt alleine arbeiten auf unserem Rasp hehe

    ich muss jetzt erst mal noch versuchen, Daten auf meine USB Festplatte zu speichern, da auf der SD Karte ja nur 32 GIG sind und die will ich für sowas nicht
    benutzen. und dann muss ich mal schauen ob vielleicht immer 10.000er weise ich die Daten in die DB schreibe. Erst mal in ein Array oder Txt file und dieses dann einmal
    in die Tabelle schreibe und (also nur ein einziger Insert, statt 10.000 mit simple_load_file und dann die näcshten 10.000 oder so) oder ob ich vlt umsteige auf eine Struktur wie es mir "noisefloor" vorgeschlagen hat.

    Gerne für weitere Anregungen offen...

    da muss ich die Mysql Config ändern oder? wenn ich will, dass alles auf die USB gepumpt wird oder?

    Danke an alle

    Greetz


    EDIT: hab gerade nen Test gemacht mit 15 scripte (die jetzt nicht das oben beschrieben tun, sondern wild im WEB umhersurfen) und das eigenartige war, das ich bei Linux mit dem TOP Command
    zwar je mehr Tabs ich aufmach (und diese Scripte tun ja was auf MYSQL Seite) natürlich die CPU Auslastung von Mysql mit jedem Tab steigt, ABER (und jetzt kommts) selbst wenn ich 40 Tabs aufmach (was das Maximum war) immer noch der Speicher auf 4,4 % lief...

    EDIT2: Liegt wahrscheinlich daran, dass sich dann weiter unten noch Apache2 Prozesse öffneten, aber das versteh ich nicht ganz. Dachte eigentlich eher das MYSQL ja sooooo den Arbeitsspeicher berraubt usw. Davon hab ich jetzt aber nichts gemerkt. Das ist ja super, dann kann ich ja einfach 10 oder 20 CRONs nebeneinander laufen lassen und erziele noch schneller meine Inserts (nur so ne Vermutung, muss das noch testen)

    Einmal editiert, zuletzt von nbg12 (26. Juni 2015 um 17:59)

  • Naja die Frage war eigentlich spezifischer... Was für ein Typ hat Spalte ID und NAME - Was ist der PrimärSchlüssel - wie genau sieht ein INSERT aus - Auf welche Art und Weise werden die INSERT's ausgelöst ... Das ein INSERT mit "INSERT INTO ..." anfängt ist mir klar

    Ich glaub du verstehst nicht wirklich was mit DB-Struktur gemeint ist, kann das sein? :s Von noisefloor sehe ich keinen Vorschlag bezüglich der Struktur. Er schrieb eigentlich nur etwas über die DB Software... Struktur und Software sind aber 2 paar Schuhe.

    Ob du eine schnelle SD oder ein USB-Device nimmst spielt beim PI kaum eine Rolle. Eine schnelle SD schreibt mit 20mb/s aber ein USB-Device schafft am PI auch nicht wirklich mehr. Es geht hierbei denk ich aber auch eher weniger um den Datendurchsatz des Datenträgers als vielmehr ums Zusammenspiel - da du schreibst die Quelldaten befinden sich auf einem FTP, würde ich annehmen dass das über Netzwerk gemeint ist. Beim PI teilt sich USB und Netzwerk einen einzigen USB2 Channel. Beides bremst sich also gegenseitig aus.

    Was aber beachtet werden muss ist das NAND-Flash (USB-Sticks, SD und SSDs) nicht unendlich viele Schreibzugriffe (auch löschen ist schreiben) vertragen und dir dadurch die SD schnell sterben könnte... Aus meiner Sicht wäre also nur aus diesem Grund ein externer Datenträger sinnvoll, allerdings nur wenn die Quelldaten nicht übers Netzwerk besorgt werden....

    Desweiteren kommts halt auch darauf an wie der PI konfiguriert ist und was du sonst noch so laufen hast bzw welches Image du verwendest. Ich würde dir zu einem 'Minimal'-Image raten.

    Für deinen Fall würde ich auf jeden Fall aus alles Unnötige wie zB LXDE, oder wie es MichaRPI vorgeschlagen hat auf "min" Frequenzen, verzichten. Das ständige hin und her takten (Wechsel von min- auf max- Frequenz) birgt ebenfalls eine Verzögerung, die Du dir in deinem Fall aber nicht antun solltest. 'force_turbo=1' wäre also schon mal das erste was Du unbedingt nutzen solltest. Das nächste wäre der GPU so wenig wie irgend möglich an RAM geben, da das bei dir nur Verschwendung wäre. Also 'gpu_ram=16'.
    Spätestens jetzt solltest du merken das es auf viel mehr ankommt.

    Beobachte mal mit zum Beispiel htop die Auslastung deines Insert-Scripts und die des MySQL's. Ich würde mal vermuten das beides (nicht nur mysql) recht viel RAM und CPU verballert.


    ...Zur letzten Frage: Nicht unbedingt. Es reicht den Ordner zu verlagern und zB ein Symlink anzulegen - oder einen Hardlink. Aber ja, du kannst auch die my.cnf anpassen. Beachte aber dass das USB-Device ein Linux-Format verwendet also zB. ext3 oder ext4.

  • meigrafd:

    Wow! Sowas hab ich gebraucht! Ehrliche Meinung! Keinen der meine Idee runter macht und auch noch weiß von was er spricht!

    Bin gerade unterwegs, werde mich aber das WE auf jeden Fall noch melden und dir / euch Bescheid geben was ich an Fine Tuning gemacht habe und wie die Resultate vorher zu nachher sind!

    Grüße / schönen Abend


  • Ich glaube bei bezahl-Webhostern bedeutet "in die Knie gehen" einfach nur, dass ein Server zu, sagen wir mal, 25% ausgelastet wird.
    Das passt denen dann nicht und die schieben dir einen Riegel vor.

    netcup.de - einer der billigen VServer gibt schon recht gut Gas und wenn du den voll auslastest ist das dein Bier.

    Auch meine ganz billigen Komponenten aus China laufen ... aber nach 4 Wochen auf hoher See hat mein 1602 Display wohl etwas an Kontrast verloren.

  • ...


    Ob du eine schnelle SD oder ein USB-Device nimmst spielt beim PI kaum eine Rolle. Eine schnelle SD schreibt mit 20mb/s aber ein USB-Device schafft am PI auch nicht wirklich mehr. Es geht hierbei denk ich aber auch eher weniger um den Datendurchsatz des Datenträgers als vielmehr ums Zusammenspiel - da du schreibst die Quelldaten befinden sich auf einem FTP, würde ich annehmen dass das über Netzwerk gemeint ist. Beim PI teilt sich USB und Netzwerk einen einzigen USB2 Channel. Beides bremst sich also gegenseitig aus.

    ... ja, sorry das ich vorher nicht genug Zeit hatte. Aber DA ist die Erklärung. Beim Raspi läuft Netz und USB über den gleichen Draht. Mit sysbench hatte ich etwas mehr als 20mb/s auf die Karte bekommen ... aber icht viel ... bei der KArtenwahl halt darauf achten das die Karte mehr kann als der Raspi, dann bist du auf der sicheren Seite das die Karte nicht schon bremst.

    Wie schon erwähnt hält die Karte nicht unendlich ... aber wenn man nur 4-6 Euro mehr ausgibt und die KArten verlgeicht gibt es genau DA schon Unterschiede (haltbarkeit) und sollte im Datenblatt zu finden sein.

    Ich kann im Moment nicht sagen DIE DA NEHMEN ... da ich die letzten Berichte im Januar hab lesen müssen und mittlerweile ist das Schnee von Gestern.


    Was mein Statement zu postgres angeht, steh ich immernoch dazu. Generell bessere Performance auf null resourcen Rechner.

    Das tuning von MySQL ist selber leider eine nicht mit Zahlen definierbare Kunst, vor allem da wir deinen Code nicht kennen. Es gibt mitlerweile mehr als ein paar Bücher die nur davon handeln und alle haben das selbe Schlusswort - es kommt immer auf die Situation an.

    Wenn du dich gar nicht mit tuning auskennst gibt es ein paar Scripte die am Anfang dir vielleicht den Weg ein wenig weisen können.

    http://mysqltuner.com/

    http://day32.com/MySQL/

    Was die Hardware angeht ... die Karte oder die oder doch USB ... ein einfaches tool namens sysbench kann dir da schon viel sagen.

    Ach ja und nur fall es niemand erwähnt hat. Die Stromversorgung des Raspics ist wichtiger als man denkt. z.B. der USB Lader für einen iPad oder so was geht gar gar gar nicht ... der raspi wird unterversorgt. Also ein Netzteil nehmen das auch noch etwas Platz hinten raus hat. USB Platten immer als selbststromversorger (über einen aktiven Hub) anschließen.

    Auch meine ganz billigen Komponenten aus China laufen ... aber nach 4 Wochen auf hoher See hat mein 1602 Display wohl etwas an Kontrast verloren.

  • Hallo,

    nbg12: poste doch endlich mal das / die `CREATE...` Statement(s) deiner Datenbank. Erst wenn wir die Struktur sehen kann man konkreter werden, was Verbesserungen angeht - hat meingrafd ja schon erläutert.

    Im Moment würde ich raten, dass du eine Tabelle mit zwei Spalten in der DB hast - aber mit Raten kommen man auch nicht weit.

    Und das von mir vorgeschlagene KV-Store ist in der Tat eine andere Art Datenbank, die sich in der von dir eingesetzten relationalen DB ziemlich unterscheidet. Kann Vorteile haben, muss aber nicht. Kommt halt auf die Daten an und was abzufragen ist :)

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!