News
DBA-Tipp: MySQL - MOCA und systemd

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

Mit Version 7 ihres Betriebssystems Oracle Linux löste Oracle das altbewerte `sysvinit` zur Verwaltung von Systemprozessen durch `systemd` ab.

`systemd` bringt eine einfache Möglichkeit mit sich, Variablen zu integrieren und somit eine MOCA-Installation mit mehreren Instanzen in verschiedenen MySQL-Versionen auf einem System prozesstechnisch zu verwalten.

Im hier dargelegtem Beispiel handelt es sich um eine Oracle MySQL 5.7-Installation im aktuellen Release 19. Da wir gleichzeitig auch 5.6-Versionen installieren könn(t)en, unterscheiden wir im `systemd`-Skript den Server mit der verkürztem Major-Releasenummer `mysql57`.

* /etc/systemd/system/mysqld57@.service

    #
    # /etc/systemd/system/mysqld57@.service
    # - dev.mysql.com/doc/refman/5.7/en/using-systemd.html
    #

    [Unit]
    Description=MySQL Optimal Configuration Architecture (MOCA) and multi-instance installation
    After=network.target
    After=syslog.target

    [Service]
    User=mysql
    Group=mysql

    Type=forking

    TimeoutSec=0
    TimeoutStartSec=3
    TimeoutStopSec=3

    PermissionsStartOnly=true

    EnvironmentFile=-/etc/sysconfig/mysql-%i
    Environment=MYSQL_HOME=/u01/app/mysql/server/${MYSQL_VERSION}
    Environment=MYSQL_CONF=/u05/mysqldata/%i/admin/startup/my.cnf
    Environment=MYSQLD_BIN=${MYSQL_HOME}/bin/mysqld
    Environment=MYSQL_TMPFS=/dev/shm/mysql

    PIDFile=/u05/mysqldata/%i/admin/run/%i.pid
    LimitNOFILE=8192
    PrivateTmp=true

    ExecStartPre=/usr/bin/mkdir -p ${MYSQL_TMPFS}
    ExecStartPre=/usr/bin/chown -R mysql: ${MYSQL_TMPFS}
    ExecStart=/bin/sh -c '/usr/bin/numactl --interleave all ${MYSQLD_BIN} --defaults-file=${MYSQL_CONF} --daemonize'
    ExecStartPost=/bin/sh -c 'for i in $( pidof ${MYSQLD_BIN} ); do /usr/bin/echo "-800" >
    /proc/$i/oom_score_adj; done'
    Restart=no
    RestartPreventExitStatus=1

    [Install]
    WantedBy=multi-user.target

* /etc/sysconfig/mysql-server57-01

    MYSQL_VERSION=5.7.19

systemctl daemon-reload;
systemctl enable mysqld57@server57-01
systemctl start mysqld57server57-01

In `systemd` wird die Benennung hinter dem `@` als Parameter "%i" in das Skript übergeben, was uns die Möglichkeit gibt, mehrere Instanzen eines Prozesses zu spawnen. Im hier dargelegem Beispiel wird die MySQL-Instanz `server57-01` (mit dem Konfigurationsfile "/etc/sysconfig/mysql-server57-01", welches die Version inkludiert), gestartet. Die im Skript enthaltenen Umgebungsvariablen sind in diesem Beispiel allgemeingültig, könnten im Bedarfsfall aber auch in die Konfigurationsdatei der spezifischen Instanz ausgelagert werden. Wir gehen von einer MySQL 5.7-Installation aus, die sich lediglich im letzten Releasestand unterscheiden könnte.

Fazit:
Ob nun sysvinit oder system, die Wahl der Prozessverwaltung ist immer noch diskutabel und obliegt "der Geschmackssache" des DBAs.