[HowTo] Raspberry Pi3 als zentrale Kodi Datenbank (performante Lösung)

  • Hallo zusammen!

    Vorwort
    Ich habe mir vor ca. 1 Monat einen Raspberry 3 gekauft um ihn als zentrale MYSQL Datenbank zu verwenden. Leider war ich mit der Performance nicht zufrieden. Also habe ich mich einige Abende damit beschäftigt, den Raspberry Kodi-DB tauglich zu machen.

    Mein Pi3 MYSQL Server läuft jetzt mit Raspbian LITE (Headless - bedient über SSH mittels MobaXTerm). Idee war es, soviel wie möglich in den RAM auszulagern, um die IO Performance des "Kleinen" zu steigern und die SD Karten Lebensdauer zu erhöhen. Es wird mittels CRONJOB alle 2h das TMPFS auf die SD Karte synchronisiert. Zusätzlich wird 1mal pro Tag ein MYSQL Dump auf meine NAS gelegt und 10 Tage behalten.

    Die Daten (Filme, Musik, Bilder, etc) liegen zentralisiert auf dem NAS. Zugriff auf die Daten kann von mehreren Geräten aus erfolgen, daher die Anforderung an die zentrale Datenbank.
    Das Setup läuft jetzt seit ca 3 Wochen stabil ohne Datenverlust.

    In diesem Beitrag möchte ich meine Erkenntnisse mit euch teilen.

    ACHTUNG: Es wird eine gewisse Linux Kenntnis vorausgesetzt.
    Wenn ich Zeit habe, werde ich den Leitfaden ausführlicher gestalten.

    Voraussetzungen:
    Generell:

    Hadware:

    • Raspberry Pi3 Model B
    • 2.5A Netzteil
    • 16GB microSDHC UHS-1 Class 3 (Samsung Pro+ 16GB funktioniert super mit Übertakten). Mit Übertaktung werden 40MB/sec erreicht.
    • Kühlkörper (notwendig, da übertaktet wird)
    • Raspberry mit Ethernet am Netzwerk (nicht WLAN)

    Software:

    • MobaXTerm (OPTIONAL für Headless Setup)
    • RASPBIAN JESSIE LITE vorinstalliert und auf aktuellem Stand

    Übertakten:
    Es ist keine extreme Übertaktung welche einen Garantieverlust zur Folge hat. Mein Pi läuft in einem (geschlossenen) Kasten komplett stabil und überschreit nie 52°C
    Im /boot Verzeichnis die config.txt editieren und folgende Einträge hinzufüg

    Code
    arm_freq=1350
    core_freq=500
    over_voltage=4
    disable_splash=1
    gpu_mem=16
    dtoverlay=sdhost,overclock_50=100

    TMPFS einrichten
    Temporäre bzw Log Verzeichnisse werden in den RAM gelegt um ein permanentes Schreiben auf die SD Karte zu verhindern (erhöht die Lebensdauer und auch minimal die Performance). Aber Achtung, durch diese Änderung werden Log Dateien bei jedem Neustart gelöscht!
    Hierzu fügen wir folgende Einträge der Datei /etc/fstab hinzu

    Code
    tmpfs	/tmp	tmpfs	defaults,noatime,nosuid,size=128M	0	0
    tmpfs	/var/tmp	tmpfs	defaults,noatime,nosuid,size=64M	0	0
    tmpfs	/var/[definition='1','0']log[/definition]	tmpfs	defaults,noatime,nosuid,mode=0755,size=128M	0	0


    MYSQL einrichten
    Installation
    Falls noch nicht geschehen, MYSQL aus dem Repository installieren
    sudo apt-get install mysql-server

    Konfiguration
    Jetzt wird eine eigene MYSQL Config benötig. Bitte nicht die my.cnf Datei editieren, diese kann bei einem Update überschrieben werden.
    Dazu legen wir die Datei /etc/mysql/conf.d/99kodi.cnf an und fügen folgende Einträge hinz

    Code
    [mysqld]
    bind-address = 0.0.0.0
    innodb_flush_log_at_trx_commit = 2

    MYSQL User und Rechte
    Als nächstes starten wir die MYSQL Shell
    mysql -uroot -p
    Hier wird der Kodi User angelegt
    CREATE USER 'kodi' IDENTIFIED BY 'password';
    und mit den notwendigen Rechten versorgt
    GRANT ALL ON *.* TO 'kodi';
    Danach kann MYSQL neu gestartet werden
    sudo /etc/init.d/mysql restart

    MYSQL Backup
    Um Datenverlust zu vermeiden erstellen wir ein Backup Script, welches später 1-mal täglich mittels cronjob ausgeführt wird. Es wird ein mysql Dump erzeugt und auf ein NAS (SMB Share) gelegt. Dieses Script kann jedoch nach eigenen Vorlieben und Anforderungen angepasst werden.
    Backup Script /opt/scripts/db-backup.sh erstellen und folgende Inhalte anpassen und einfügen


    Jetzt noch das Script ausführbar machen
    sudo chmod +x /opt/scripts/db-backup.sh
    und nach /usr/bin/ Softlinken
    sudo ln -s /opt/scripts/db-backup.sh /usr/bin/db-backup
    Ein cronjob (1mal täglich um 04:00) stellt sicher, dass das Backup regelmäßig ausgeführt wird
    Crontab öffnen
    sudo crontab -e
    und den Job hinzufügen
    0 4 * * * /usr/bin/db-backup

    MYSQL TMPFS
    Zunächst müssen wir die UserID und GruppenID vom mysql User ermitteln
    sudo id mysql
    TMPFS Verzeichnis anlegen und Berechtigungen anpassen
    sudo mkdir -p /var/mysqlramdisk
    sudo chown mysql:mysql /var/mysqlramdisk
    TMPFS Backupverzeichnis anlegen und Berechtigungen anpassen
    sudo mkdir -p /var/mysqlpersistence
    sudo chown mysql:mysql /var/mysqlpersistence
    MYSQL Daten in das Persistenzverzeichnis kopieren
    sudo rsync -av --delete /var/lib/mysql/ /var/mysqlpersistence/
    /etc/fstab editieren und folgenden Eintrag hinzufügen (ids von User mysql)
    tmpfs /var/mysqlramdisk tmpfs rw,gid=114,uid=109,size=512M,nr_inodes=10k,mode=0700 0 0
    So und jetzt das Herzstück: Das MYSQL-TMPFS Wrapperscript
    Script in /etc/init.d/mysql-tmpfs erstellen und folgende Inhalte einfüge


    Script ausführbar machen
    sudo chmod +x /etc/init.d/mysql-tmpfs
    MYSQL Service entfernen
    sudo update-rc.d mysql remove
    mysql-tmpfs Service aktivieren
    sudo update-rc.d mysql-tmpfs defaults
    MYSQL Persistenz cronjob einrichten
    Crontab öffnen
    sudo crontab -e
    Cronjob hinzufügen (sync alle 2h um xx:30)
    30 */2 * * * /etc/init.d/mysql-tmpfs sync
    Editieren von /etc/mysql/conf.d/99kodi.cnf und hinzufügen des datadir Eintrages
    datadir = /var/mysqlramdisk
    Pi neustarten

    KODI einrichten
    Am Kodi-PC die Datei [definition='2','1']advancedsettings[/definition].xml im userdata Verzeichnis anlegen oder editieren und folgende Einträge hinzufügen

    MYSQL wieder absichern (OPTIONAL aber empfohlen)
    Als nächstes starten wir die MYSQL Shell
    mysql -uroot -p
    Wir entziehen dem Kodi User alle Rechte
    REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'kodi';
    und fügen die Rechte für die kodi Tabellen wieder hinzu
    GRANT ALL ON `kodi%`.* TO 'kodi';
    Übernehmen der Änderungen
    flush privileges;

    Wartung
    TODO: Genauer ausarbeiten
    MYSQL ibdata1 Größe regelmäßig prüfen -> Abhilfe schafft MYSQL Dump + Restore
    TMPFS Auslastung regelmäßig prüfen
    Log Größe
    Updates
    Backups prüfen
    Persistenz prüfen

    Ideen

    • Sende ein EMail wenn ein CRONJOB fehlschlägt
    • Sende ein EMail wenn ein TMPFS zu klein wird
    • MariaDB Performance untersuchen und ggf Leitfaden anpassen

    Schlusswort
    Ich hoffe ich kann mit diesem Leitfaden einigen Leuten helfen. Falls ich neue Kniffe im Bezug auf die zentrale Datenbank für Kodi habe, werde ich den Beitrag hier updaten.

    Auf Verbesserungsvorschläge, Ideen und Kritik würde ich mich freuen.

    Falls Fragen aufkommen oder Unklarheiten herrschen, werde ich versuchen diese gerne zu beantworten.

    LG
    Nexxx

  • Huhu!

    Haust du auch den Cronjob hier rein, der das mit dem Sync, Backup, und dem pflegen der Backups macht?

    Ansonsten, TOP!
    Habe meinen MySQL Server zwar nicht auf dem Raspi, sondern auf meinem Fileserver mit drauf, aber dennoch, sehr interessant.

  • Ich bin nicht MySQL Speziallist aber wäre es nicht besser den Server anzuweisen mehr Speicher zu verwenden in dem man die Buffer vergrössert anstelle die Dateien in ein tmpfs zu laden.

    Dann könnte man noch das binary logging des MySQL deaktivieren, da ja kein Cluster Betrieb notwendig ist.

    my.cnf
    #log-bin=mysql-bin
    #binlog_format=mixed

  • Wir sind gerade Urlaub, werde mir das danach einmal anschauen.
    Ich bin sehr weit entfernt, ein DB Spezialist zu sein, aber soweit ich weiß schreibt MYSQL doch nach jeder Transaktion die Daten oder?

    Wo du das binary Logging angesprochen hast, ist das dieses innodb ibdata1 File?

  • Nein, die Logs haben folgende Namensgebung mysqld-bin.000001, mysqld-bin.000002 ect.
    und landen in /var/lib/mysql
    Am besten deaktiviert man diese vor dem ersten Start des Server bevor das /var vollgeschrieben wird.

    Manuel kann man diese glaube ich wie folgt löschen:
    $mysql -u root -p -e "PURGE BINARY LOGS BEFORE NOW();"
    $mysql -u root -p -e "RESET MASTER;"

    Die Datei ibdata1 enthält div InnoDB Daten und wächst kontinuierlich an ausser in der Konfiguration steht
    [mysqld]innodb_file_per_tableDas Transaction [definition='1','0']log[/definition] ist "ib_logfile0" und "ib_logfile1" und deren Grösse wird mittels innodb_log_file_size gesteuert.Ja, die Daten werden IMHO immer auf die Disk geschrieben. Die Puffer beschleunigen in erster Linie den Lese Zugriff. Allerdings frage ich mich, ob dies nicht bereits ausreicht für Kodi. Soviel wird nachher im Betrieb wahrscheinlich nicht ständig geändert denke ich.Ich betreibe selber aber auch keine DB für Kodi. Wollte nur einige Anregungen einbringen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!