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:
- Linuxkenntnisse
- Sicherung des Kodi Verzeichnisses (better safe than sorry)
- Sicherung der SD Karte als IMG (better safe than sorry)
- Export der Bibliothek (OPTIONAL: http://kodi.wiki/view/HOW-TO:Backup_the_video_library)
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
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
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
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
MHOST=localhost
MUSER=kodi
MPASS=password
SMBPATH=//NAS-IP/DB-Backup
BACKUPDIR="/media/db-backup"
sudo umount $BACKUPDIR >/dev/null 2>&1
sudo mkdir -p $BACKUPDIR
sudo mount -t cifs -o guest,uid=1000 $SMBPATH $BACKUPDIR
if [ $? -eq 0 ]; then
echo Mounting Backup Directory Successful
else
echo Mounting Backup Directory Failed
exit
fi
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
DBPREFIX="kodi_videos.mysqldb"
echo "Run MySQL backup"
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases like "kodi%"')"
#db=kodi_video107
for db in $DBS
do
FILE=${BACKUPDIR}/${DBPREFIX}.${db}.`date +%Y%m%d`.gz
$MYSQLDUMP --no-tablespaces --skip-lock-tables -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
echo Created Backup ${DBPREFIX}.${db}.`date +%Y%m%d`.gz
done
sudo find / -type f -wholename "${BACKUPDIR}/${DBPREFIX}*" -mtime +10 -exec rm -f '{}' ';'
echo Deleted Backups older than 10 days
sudo umount $BACKUPDIR
echo Unmounting Backup Directory Successful
echo Backup Finished
Alles anzeigen
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
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: mysql-tmpfs
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $network $time
# Should-Stop: $network $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop the mysql database server daemon
# Description: Controls the main MySQL database server daemon "mysqld"
# and its tmpfs directory
### END INIT INFO
#
case "$1" in
start)
rsync -av /var/mysqlpersistence/ /var/mysqlramdisk/
/etc/init.d/mysql start
;;
stop)
/etc/init.d/mysql stop
rsync -av --delete /var/mysqlramdisk/ /var/mysqlpersistence/
;;
sync)
rsync -av --delete /var/mysqlramdisk/ /var/mysqlpersistence/
;;
restart)
/etc/init.d/mysql restart
;;
*)
echo $"Usage: mysql-tmpfs {start|stop|restart|sync}"
exit
esac
Alles anzeigen
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
<[definition='2','1']advancedsettings[/definition]>
<videodatabase>
<type>mysql</type>
<host>{IP address of RPi3}</host>
<port>3306</port>
<name>kodi_video</name>
<user>kodi</user>
<pass>password</pass>
</videodatabase>
<musicdatabase>
<type>mysql</type>
<host>{IP address of RPi3}</host>
<port>3306</port>
<name>kodi_music</name>
<user>kodi>/user>
<pass>password</pass>
</musicdatabase>
</[definition='2','1']advancedsettings[/definition]>
Alles anzeigen
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