Frage PostgreSQL mit Supervisord ausführen


Ich möchte PostgreSQL 9.1 mit Supervisor auf Ubuntu 10.04 laufen lassen. Im Moment starte ich PostgreSQL manuell mit dem Init-Skript:

/etc/init.d/postgresql start

Nach diesem Post: http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/Ich muss die PostgreSQL-Konfiguration ändern, damit sie auf dem TCP-Port statt auf dem Unix-Socket ausgeführt wird, damit PostgreSQL mit Supervisor funktioniert.

Ich habe zwei Fragen zu diesem Ansatz:

  1. Wenn man bedenkt, dass dies eher Hacking ist, gibt es irgendwelche Implikationen (z. B. Sicherheit / Berechtigungen, Leistung usw.), dies zu tun?

  2. Warum können wir nicht einfach dasselbe Init-Skript ausführen? postgresql in Supervisor-Konfiguration? Stattdessen wird es wie im obigen Link gezeigt ausgeführt postmaster?

AKTUALISIEREN:

Dank der nützlichen Vorschläge aus beiden Antworten habe ich ein Skript für Supervisor eingerichtet, um PostgreSQL direkt aufzurufen:

#!/bin/sh

# This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode

if [ -d /var/run/postgresql ]; then
    chmod 2775 /var/run/postgresql
else
    install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi

exec su postgres -c "/usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf"

Ich stelle auch die Konfiguration ein: /etc/postgresql/9.1/main/start.conf zu manual damit PostgreSQL beim Booten nicht automatisch startet (mir ist allerdings nicht klar, ob diese config geladen ist). Und dann habe ich die Supervisor-Konfiguration für Postgres wie folgt eingerichtet:

[program:postgres]
user=root
group=root
command=/usr/local/bin/run_postgresql.sh
autostart=true
autorestart=true
stderr_logfile=/home/www-data/logs/postgres_err.log
stdout_logfile=/home/www-data/logs/postgres_out.log
redirect_stderr=true
stopsignal=QUIT

Jetzt kann ich PostgreSQL starten supervisorctl indem du es tust start postgresdas läuft gut. Jedoch, nachdem ich ausgegeben habe stop postgres, obwohl supervisorctl deklariert postgres wird gestoppt, der server läuft anscheinend noch so wie ich psql hinein kann.

Ich frage mich, ob dies ein Supervisor-Konfigurationsproblem oder ein PostgreSQL-Problem ist. Jeder Vorschlag willkommen!


5
2018-06-18 23:10


Ursprung


Antworten:


Der Blogbeitrag ist eher schlecht geschrieben. Es gibt keinen "TCP-Modus": Die vorgeschlagene Methode des Posts wird immer noch auf einem Unix-Socket abhören, nur in einem anderen Verzeichnis. Kommentare in der Post wie "externe PID-Datei - nicht für den TCP-Modus benötigt" sind sehr irreführend.

postmaster ist der traditionelle Name für die Postgresql-Programmdatei (um den Master-Dispatching-Prozess von den Backend-Slaves zu unterscheiden). Seit einiger Zeit gibt es keine separate ausführbare Datei und jetzt wird sie einfach als "postgres" installiert.

Angenommen, Supervisor ist weitgehend mit qmail / daemontools vergleichbar supervise Schema, es wäre durchaus möglich (in der Tat, ganz normal), dass es ein Skript ausführen, das die Verzeichnisse und die Umgebung einrichtet, und anschließend postgres mit den erforderlichen Argumenten ausführt (oder Argumente an das Wrapper-Skript weitergibt, was ungewöhnlich wäre) mit Supervision, macht aber mehr Sinn, wenn Sie eine Konfigurationsdatei haben, in die Sie Argumente einfügen können.

Der Weg supervise funktioniert (und ich gehe weiterhin davon aus, dass "Supervisor" dasselbe ist), muss der Supervisorprozess einen Subprozess wie angegeben ausführen und einfach einen neuen Subprozess neu starten, wenn er beendet wird. Dies basiert auf der Idee, dass der Prozess, der gestartet wird, ein langlebiger Daemon-Prozess ist, der nur dann beendet wird, wenn etwas schief läuft, und dass es einfach ein gültiger Fix ist, ihn einfach neu zu starten. Im Gegensatz dazu Init-Skripte wie in /etc/init.d Führen Sie den Subprozess aus, trennen Sie ihn und geben Sie die Steuerung an den Aufrufer zurück. Wenn der Subprozess beendet wird, passiert nichts Besonderes und er muss manuell neu gestartet werden. Wenn Sie versucht haben, einfach zu rennen /etc/init.d/postgresql startVon Supervice aus würde es kontinuierlich Postgresql-Daemons erzeugen, da die Rückkehr vom Init-Skript als der Daemon-Prozess interpretiert würde, der beendet wurde, als es tatsächlich gestartet und gelöst wurde.


3
2018-06-18 23:56



Um zu vermeiden, dass der Dienst automatisch gestartet wird /etc/init.d Skripte, das Paket für Postgresql 9.1 bietet eine Datei /etc/postgresql/9.1/main/start.conf das beinhaltet:

# Automatische Startkonfiguration
# auto: Startet / stoppt den Cluster automatisch im Init-Skript
# manual: Starten / Stoppen nicht in Init-Skripten, sondern erlauben manuellen Start mit
# pg_ctlcluster
# disabled: Manuelles Starten mit pg_ctlcluster nicht erlauben (dies kann leicht sein
# umgangen und soll nur ein kleiner Schutz für sein
# Unfälle).

Auto

Dies ist die Datei, die geändert werden muss, um einen automatischen Start zu vermeiden, anstatt wegzugehen /etc/init.d/postgresql wie es im Blogpost heißt.

Ändern Sie auch Unix-Sockets-Parameter aus Mangel an /var/run/postgresql sieht nicht wie die beste Idee aus, weil es der Standard für jedes Programm ist, das mit libpq verbunden ist, und weil es kein Problem gibt, dieses Verzeichnis mit den richtigen Berechtigungen zu erstellen, so wie es in der Startsequenz des Pakets geschieht /usr/share/postgresql-common/init.d-functions:

# create socket directory
if [ -d /var/run/postgresql ]; then
    chmod 2775 /var/run/postgresql
else
install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi

Und obwohl der Standardwert kein Problem verursachen sollte, beachten Sie, dass postmaster Letztlich bleibt im Vordergrund oder Gabeln und läuft im Hintergrund wird durch die gesteuert stiller_modus Parameter in postgresql.conf. Stellen Sie sicher, dass es ausgeschaltet ist.


2
2018-06-19 02:09



Ich versuche sowohl Tomcat als auch Postgres unter Supervisor laufen zu lassen und finde hier einige Hinweise: https://serverfault.com/questions/425132/controlling-tomcat-with-supervisor

Hier ist meine modifizierte run_postgresql.shmit bash:

#!/bin/bash

# This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode

function shutdown()
{
    echo "Shutting down PostgreSQL"
    pkill postgres
}

if [ -d /var/run/postgresql ]; then
    chmod 2775 /var/run/postgresql
else
    install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi

# Allow any signal which would kill a process to stop PostgreSQL
trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP

exec sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main --config-file=/etc/postgresql/9.1/main/postgresql.conf

Mit diesem Skript stoppt postgresql korrekt danach supervisorctl stop postgres.


1
2018-04-10 07:25