Vor einer Weile hab ich bereits eine kurze Erklärung zu Systemd-Unitfiles geschrieben, diesmal will ich auf das Multi-Instanz-Feature von Systemd eingehen, da auch dieses anscheinend nicht jedem bekannt ist.
Als Beispiel soll mir diesmal Graphite bzw. genauer gesagt die Python-Implementierung carbon-cache
dienen. Diese skaliert nicht automatisch, sondern erfordert, dass man weitere Instanzen des Dienstes auf anderen Ports startet. Die Konfiguration auf Seiten des carbon-cache
ist hierbei recht simpel, denn es wird in einer Ini-Datei nur eine neue Sektion mit den zu überschreibenden Werten geschrieben. Der Sektions-Name gibt hierbei der Instanz den Namen vor. Das ganze sieht dann beispielsweise für Instanz b so aus.
[cache:b] LINE_RECEIVER_PORT = 2013 UDP_RECEIVER_PORT = 2013 PICKLE_RECEIVER_PORT = 2014 LINE_RECEIVER_PORT = 7102
Mit SystemV hätte man nun das Startskript für jede Instanz kopieren und anpassen müssen, da das mitgelieferte Unitfile leider das Multi-Instanz-Feature nicht nutzt muss ich dies zwar auch einmal tun, aber immerhin nur einmal. Hierbei ist es sinnvoll den Namen zu verändern, um nicht mit dem bestehen in Konflikt zu kommen, wenn man möchte kann man es aber auch durch Verwendung des gleichen Namens „überschreiben“. Für das Multi-Instanz-Feature muss nur ein @
an das Ende des Namens. Baut man nun an entsprechenden Stellen den Platzhalter %i
ist auch schon das Multi-Instanz-Setup fertig und man kann einen Dienst mit name@instanz.service
starten. In meinem Beispiel wäre dies carbon-cache-instance@b.service
mit folgendem Unitfile unter /etc/systemd/system/carbon-cache-instance@.service
.
[Unit] Description=Graphite Carbon Cache Instance %i After=network.target [Service] Type=forking StandardOutput=syslog StandardError=syslog ExecStart=/usr/bin/carbon-cache --config=/etc/carbon/carbon.conf --pidfile=/var/run/carbon-cache-%i.pid --logdir=/var/log/carbon/ --instance=%i start ExecReload=/bin/kill -USR1 $MAINPID PIDFile=/var/run/carbon-cache-%i.pid [Install] WantedBy=multi-user.target
Ich hoffe diese kurze Erklärung hilft dem ein oder anderen und ich würde mich freuen zukünftig mehr Dienste, die auf Instanzierung ausgelegt sind, bereits mit einem entsprechenden Unitfile ausgeliefert zu sehen.
Ich hatte mich vor geraumer Zeit in Hinsicht auf MySQL damit beschäftigt: