2012-06-18 9 views
5

Ich möchte PostgreSQL 9.1 mit Supervisor auf Ubuntu 10.04 ausführen. Im Moment ich PostgreSQL mit dem Init-Skript manuell starten:Running PostgreSQL mit Supervisord

/etc/init.d/postgresql start 

Nach diesem Beitrag: http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/, ich brauche die PostgreSQL-Config zu ändern, um es auf dem TCP-Port statt Unix-Socket laufen zu lassen, um zu machen PostgreSQL arbeitet mit Supervisor.

Ich habe zwei Fragen zu diesem Ansatz:

  1. Betrachtet man dies eher Hack ist, gibt es eine Implikation (zum Beispiel Sicherheit/Berechtigungen, Leistung, etc.), dies zu tun?

  2. Warum können wir nicht einfach das gleiche Init-Skript postgresql in Supervisor-Konfiguration ausführen? Stattdessen, wie im obigen Link gezeigt, läuft es postmaster?

UPDATE:

Dank der nützlichen Anregungen von beiden Antworten unten, ich habe Setup ein Skript für den Supervisor 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 habe auch die config: /etc/postgresql/9.1/main/start.conf zu manual, so dass PostgreSQL nicht automatisch beim Booten startet (es ist mir jedoch nicht klar, ob diese Konfiguration geladen ist). Und dann habe ich Setup die Supervisor-Config für Postgres als:

[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 

So, jetzt kann ich PostgreSQL in supervisorctl indem start postgres, beginnen die fein läuft. Allerdings, nachdem ich stop postgres, obwohl supervisorctl deklariert postgres gestoppt wird, ist der Server anscheinend noch läuft, wie ich psql hinein kann.

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

Antwort

3

Der Blogpost 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 dem Schema qmail/daemontools supervise weitestgehend ähnlich, wäre es durchaus möglich (in der Tat ganz normal), ein Skript ausführen zu lassen, das die Verzeichnisse und die Umgebung einrichtet und dann mit dem PostgreSQL startet erforderliche Argumente (oder propagiert Argumente, die dem Wrapper-Skript übergeben werden, was bei Supervise ungewöhnlich wäre, macht aber mehr Sinn, wenn Sie eine Konfigurationsdatei zum Einfügen von Argumenten haben). Die Methode supervise hat funktioniert (und ich gehe weiterhin davon aus, dass "Supervisor" dasselbe ist), damit der Supervisor-Prozess einen Subprozess wie angegeben ausführt und einfach einen neuen Subprozess neu startet, 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 führen Init-Skripte wie in /etc/init.d den Subprozess aus und trennen ihn und geben die Steuerung an den Aufrufer zurück. Wenn der Subprozess beendet wird, passiert nichts Besonderes und er muss manuell neu gestartet werden. Wenn Sie versuchen, einfach /etc/init.d/postgresql start von überwachen zu laufen, würde es fortlaufend Postgresql-Dämonen hervorbringen, da die Rückkehr von dem Init-Skript als der Daemon-Prozess interpretiert würde, der beendet wurde, als es tatsächlich gestartet und gelöst wurde.

+0

danke für dich Punkt auf meine zweite Frage, das wurde gut erklärt! Bezogen Sie sich auf meine erste Frage (und Ihre Interpretation dessen, was tatsächlich mit dem Skript im Link passiert), schlagen Sie vor, dass ich ein Skript schreiben soll, das das notwendige Verzeichnis für postgresql erstellt und dann 'postmaster' (oder' postgres'?) mit der ursprünglichen postgresql config, und rufen Sie dieses Skript stattdessen in der Supervisor Config-Datei? – MLister

+0

Richtig, Sie können ein Shell-Skript haben, das grundsätzlich '[-d/run/postgresql] || make_rundir; exec /usr/lib/postgresql/9.1/postgres "$ @" ', das das Verzeichnis bei Bedarf erstellt und dann die ausführbare Datei' postgres' kettet ('postmaster' ist jetzt ein veralteter Name). Mit Supervise würde dies buchstäblich im Service-Verzeichnis "run" genannt werden. – araqnid

+0

Ihre Annahme, dass 'supervisord' genauso funktioniert wie' supervise', ist korrekt; Es startet und respawnen einen Subprozess für Dämonen unter seiner Verantwortung. –

2

Um Auto-Start des Dienstes mit den /etc/init.d Skripte zu vermeiden, bietet das Paket für postgresql 9.1 eine Datei /etc/postgresql/9.1/main/start.conf das enthält:

 
# Automatic startup configuration 
# auto: automatically start/stop the cluster in the init script 
# manual: do not start/stop in init scripts, but allow manual startup with 
#   pg_ctlcluster 
# disabled: do not allow manual startup with pg_ctlcluster (this can be easily 
#   circumvented and is only meant to be a small protection for 
#   accidents). 

auto 

Dies ist die Datei Autostart zu ändern, wie zu bewegen Gegensatz zu vermeiden weg /etc/init.d/postgresql wie der Blog-Post vorschlägt.

Auch die Änderung von Unix-Sockets-Parameter für das Fehlen von /var/run/postgresql sieht nicht wie die beste Idee, weil es die Standardeinstellung für jedes Programm mit libpq verbunden ist, und da gibt es keine Schwierigkeiten bei der Erstellung dieses Verzeichnisses mit den richtigen Berechtigungen, einfach

# 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 nicht zu einem Problem führen sollte, beachten sie, dass, ob postmaster schließlich im Vordergrund bleibt oder Gabeln und läuft im Hintergrund wird vom silent_mode Parameter gesteuert: es ist in /usr/share/postgresql-common/init.d-functions durch das Paket der Startsequenz getan postgresql.conf. Stellen Sie sicher, dass es ausgeschaltet ist.

+0

danke für die ausführliche Erklärung. Zwei Fragen: 1. Warum wollen wir vermeiden, '/ etc/init.d/postgresql' automatisch zu starten? Das ist mir im Originalartikel nicht klar; 2. Auf der Grundlage Ihrer Antwort scheint es, dass nur zwei Dinge geändert werden müssen, damit dies mit Supervisor funktioniert: Zuerst ändern Sie in **/etc/postgresql/9.1/main/start.conf zu ** manual **, und zweitens setze 'silent_mode' Parameter in '/ etc/postgresql/9.1/main/postgresql.conf ** aus **. Ist das korrekt? – MLister

+0

1: Wenn postgresql beim Booten gestartet wird, liegt es außerhalb der Kontrolle des Supervisors, was dem Ziel widerspricht: Dämonen unter Kontrolle des Supervisors zu halten. 2: ja –

+0

Ich verstehe. das ist großartig!Aber ich muss ein Skript erstellen, das den Abschnitt enthält, den Sie oben für das Erstellen notwendiger Verzeichnis- und Einstellungsberechtigungen zitiert haben, und dann die ausführbare Datei postresql aufrufen (übrigens, welche ausführbare Datei sollte ich verwenden: '/usr/lib/postgresql/9.1/bin/ postgres' oder '/ usr/lib/postgresql/9.1/bin/pg_ctl'?)? Und dann führe dieses Skript mit Supervisor aus? Danke noch einmal! – MLister

1

Ich versuche, sowohl Kater und Postgres unter Aufsicht laufen zu machen, und fand hier ein paar Hinweise: https://serverfault.com/questions/425132/controlling-tomcat-with-supervisor

Hier run_postgresql.sh meine geändert, bash mit:

#!/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 Script postgresql stoppt richtig nach supervisorctl stop postgres.