2012-06-18 10 views
5

Si desidera eseguire PostgreSQL 9.1 utilizzando Supervisor su Ubuntu 10.04. Al momento, mi metto manualmente PostgreSQL utilizzando lo script di init:Esecuzione di PostgreSQL con Supervisord

/etc/init.d/postgresql start 

Secondo questo post: http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/, ho bisogno di modificare la configurazione di PostgreSQL per farlo funzionare sulla porta TCP invece di socket Unix, al fine di rendere PostgreSQL funziona con Supervisor.

Ho due domande riguardanti questo approccio:

  1. considerando questo è più di hack, c'è qualche implicazione (ad esempio sicurezza/permessi, prestazioni, ecc) di fare questo?

  2. Perché non è possibile eseguire lo stesso script di init postgresql in Supervisor config? Invece, come mostrato nel link sopra, corre postmaster?

UPDATE:

grazie ai suggerimenti utili da entrambe le risposte di seguito, Ho installato uno script per il Supervisore per invocare PostgreSQL direttamente:

#!/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" 

Ho anche impostare la configurazione: /etc/postgresql/9.1/main/start.conf a manual in modo che PostgreSQL non si avvii automaticamente all'avvio (tuttavia, non mi è chiaro se questa configurazione è stata caricata). E poi ho la messa a punto di configurazione Supervisor per Postgres come:

[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 

Così ora, posso iniziare a PostgreSQL supervisorctl facendo start postgres, che funziona bene. Tuttavia, dopo l'emissione di stop postgres, sebbene supervisorctl dichiari l'arresto di postgres, apparentemente il server è ancora in esecuzione poiché posso inserirlo in psql.

Mi chiedo se si tratta di un problema di configurazione Supervisor o di un problema PostgreSQL. Qualsiasi suggerimento benvenuto!

risposta

3

Il post del blog è scritto piuttosto male. Non esiste una "modalità TCP": il metodo suggerito dal post continuerà ad essere ascoltato su un socket Unix, solo in una directory diversa. I commenti nel post come "file pid esterno - non necessario per la modalità TCP" sono molto fuorvianti.

postmaster è il nome tradizionale dell'eseguibile postgresql (per distinguere il processo di distribuzione principale dagli slave back-end). Da qualche tempo non esiste un eseguibile separato, e ora è installato semplicemente come "postgres".

Supponendo che il Supervisore sia in linea di massima simile allo schema qmail/daemontools supervise, sarebbe del tutto possibile (in effetti, abbastanza normale) eseguire uno script che imposta le directory e l'ambiente e quindi eseguire i postgres con il argomenti richiesti (o propagano argomenti dati allo script wrapper, che sarebbe insolito con supervise ma ha più senso quando si ha un file di configurazione in cui inserire argomenti).

Il modo in cui funziona supervise (e ho intenzione di continuare ad assumere "Supervisore" è lo stesso) è che il processo supervisore esegua un sottoprocesso come specificato e semplicemente rilanci un nuovo sottoprocesso se esce.Questo si basa sull'idea che il processo che si sta avviando sia un processo daemon di lunga durata che termina solo quando qualcosa va storto e che il semplice riavvio è una correzione valida. Al contrario, gli script di init come in /etc/init.d eseguono il sottoprocesso e lo scollegano e restituiscono il controllo al chiamante, se il sottoprocesso termina, non accade nulla di speciale, e deve essere riavviato manualmente. Se si è tentato di eseguire semplicemente /etc/init.d/postgresql start da supervisione, continuerebbe a generare i daemon postgresql, in quanto il ritorno dallo script init sarebbe interpretato mentre il processo del daemon è stato chiuso, quando in realtà era stato avviato e staccato.

+0

grazie per voi punto sulla mia seconda domanda, che è stato ben spiegato! In relazione alla mia prima domanda (e alla tua interpretazione di ciò che effettivamente accade con lo script nel link), stai suggerendo che dovrei scrivere uno script che crei la directory necessaria per postgresql e poi esegua 'postmaster' (o' postgres'?) con la configurazione postgresql originale e chiama questo script invece nel file di configurazione Supervisor? – MLister

+0

Esatto, puoi avere uno script di shell che fondamentalmente fa '[-d/run/postgresql] || make_rundir; exec /usr/lib/postgresql/9.1/postgres "$ @" 'che creerà la directory se necessario, quindi concatena l'eseguibile' postgres' ('postmaster' è ora un nome obsoleto). Con supervisione, questo sarebbe stato letteralmente chiamato 'run' all'interno della directory dei servizi. – araqnid

+0

L'ipotesi che 'supervisord' funzioni come' supervise' è corretta; inizierà e respawn un sottoprocesso per demoni sotto la sua responsabilità. –

2

Per evitare automaticamente l'avvio del servizio con i /etc/init.d script, il pacchetto per PostgreSQL 9.1 fornisce un file /etc/postgresql/9.1/main/start.conf che contiene:

 
# 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 

Questo è il file da modificare per evitare auto-start al contrario di movimento via /etc/init.d/postgresql come suggerisce il post del blog.

Inoltre, la modifica dei parametri di socket unix per mancanza di /var/run/postgresql non sembra l'idea migliore, perché è l'impostazione predefinita per qualsiasi programma collegato con libpq e perché non c'è alcuna difficoltà nel creare quella directory con le autorizzazioni appropriate, proprio come è fatto dalla sequenza di avvio del pacchetto /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 

e anche se il valore di default non dovrebbe causare un problema, notare che se postmaster rimane in ultima analisi, in primo piano o forchette e viene eseguito in background è controllata dal parametro silent_mode in postgresql.conf. Assicurati che sia spento.

+0

grazie per la lunga spiegazione. Due domande: 1. perché vogliamo evitare l'auto-avvio '/ etc/init.d/postgresql'? Questo non mi è chiaro nell'articolo originale; 2. Sulla base della risposta di cui sopra, sembra che debbano essere modificate solo due cose per farlo funzionare con Supervisor: in primo luogo, passare a ** manual ** in '/ etc/postgresql/9.1/main/start.conf', e in secondo luogo, impostare il parametro 'silent_mode' in '/ etc/postgresql/9.1/main/postgresql.conf' ** off **. È corretto? – MLister

+0

1: se postgresql è avviato all'avvio, sarebbe fuori dal controllo del supervisore che contraddice l'obiettivo: mantenere i demoni sotto il controllo del supervisore. 2: sì –

+0

Vedo. è fantastico!Ma ho bisogno di creare uno script contenente la parte che hai citato sopra per creare le autorizzazioni necessarie per la directory e l'impostazione, e poi chiamare l'eseguibile postresql (btw, che eseguibile dovrei usare: '/usr/lib/postgresql/9.1/bin/ postgres' o '/ usr/lib/postgresql/9.1/bin/pg_ctl'?)? E poi esegui questo script con Supervisor? grazie ancora! – MLister

1

che sto cercando di fare sia Tomcat e Postgres eseguito con supervisore, e ho trovato alcuni suggerimenti qui: https://serverfault.com/questions/425132/controlling-tomcat-with-supervisor

Ecco il mio modificato run_postgresql.sh, utilizzando 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 

Con questo script postgresql ferma correttamente dopo supervisorctl stop postgres.