2012-06-18 18 views
5

Quiero ejecutar PostgreSQL 9.1 usando Supervisor en Ubuntu 10.04. Por el momento, comienzo manualmente PostgreSQL usando el guión de inicio:Ejecutando PostgreSQL con Supervisord

/etc/init.d/postgresql start 

De acuerdo con este mensaje: http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/, tengo que modificar la configuración de PostgreSQL para hacer que se ejecute en el puerto TCP en lugar de socket de Unix, con el fin de hacer PostgreSQL trabaja con el supervisor.

Tengo dos preguntas con respecto a este enfoque:

  1. considerando que es más de corte, ¿hay alguna implicación (por ejemplo, seguridad/permisos, rendimiento, etc.) de hacer esto?

  2. ¿Por qué no podemos simplemente ejecutar el mismo guión de inicio postgresql en la configuración del Supervisor? En cambio, como se muestra en el enlace de arriba, ejecuta postmaster?

ACTUALIZACIÓN:

Gracias a las sugerencias útiles de ambas respuestas a continuación, he fijado un guión para Supervisor para invocar PostgreSQL directamente:

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

También establecer la configuración: /etc/postgresql/9.1/main/start.conf a manual para que PostgreSQL no se inicie automáticamente al arrancar (sin embargo, no está claro si esta configuración está cargada). Y luego configuración que la configuración Supervisor de Postgres como:

[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 

Así que ahora, puede empezar a PostgreSQL en supervisorctl haciendo start postgres, que funciona muy bien. Sin embargo, después de emitir stop postgres, aunque supervisorctl declara que el postgres está detenido, aparentemente el servidor todavía se está ejecutando como puedo psql en él.

Me pregunto si esto es un problema de configuración del Supervisor, o un problema de PostgreSQL. Cualquier sugerencia bienvenida!

Respuesta

3

La publicación del blog está bastante mal escrita. No hay un "modo TCP": el método sugerido para la publicación seguirá escuchando en un socket Unix, solo en un directorio diferente. Los comentarios en la publicación como "archivo pid externo - no necesario para el modo TCP" son muy engañosos.

postmaster es el nombre tradicional para el ejecutable postgresql (para distinguir el proceso de envío maestro de los esclavos de fondo). Desde hace algún tiempo no ha habido ningún ejecutable por separado, y ahora está instalado simplemente como "postgres".

Asumiendo que Supervisor es ampliamente similar al esquema qmail/daemontools supervise, sería completamente posible (de hecho, bastante normal) ejecutar un script que configure los directorios y el entorno, y luego ejecutar postgres con el argumentos necesarios (o propaga los argumentos dados al script del contenedor, lo que sería inusual con la supervisión, pero tiene más sentido cuando tienes un archivo de configuración para poner argumentos).

La forma supervise trabajaron (y voy a seguir asumiendo "Supervisor" es la misma) es hacer que el proceso de supervisor de ejecutar un subproceso como se especifica, y simplemente relanzar un nuevo subproceso si se sale.Esto se basa en la idea de que el proceso que se inicia es un proceso de daemon de larga duración que solo se produce cuando algo sale mal y que simplemente reiniciarlo es una solución válida. Por el contrario, las secuencias de comandos de inicio como en /etc/init.d ejecutan el subproceso y lo separan, y devuelven el control a la persona que llama: si el subproceso se cierra, no ocurre nada especial y debe reiniciarse manualmente. Si intentas simplemente ejecutar /etc/init.d/postgresql start desde supervise, mantendría continuamente desove dagres de postgresql, ya que el retorno del guión de inicio se interpretaría como el proceso de daemon que había salido, cuando en realidad se había iniciado y separado.

+0

gracias por su punto en mi segunda pregunta, eso fue bien explicado! En relación con mi primera pregunta (y tu interpretación de lo que realmente sucede con el guión en el enlace), ¿estás sugiriendo que deba escribir un guión que cree el directorio necesario para postgresql y luego ejecute 'postmaster' (o' postgres'?) con la configuración de postgresql original, y llame a este script en su lugar en el archivo de configuración del Supervisor? – MLister

+0

Correcto, puede tener un script de shell que básicamente hace '[-d/run/postgresql] || make_rundir; exec /usr/lib/postgresql/9.1/postgres "$ @" 'que creará el directorio si es necesario, luego encadena el ejecutable' postgres' ('postmaster' es un nombre obsoleto ahora). Con supervise, esto literalmente se habría llamado 'ejecutar' dentro del directorio del servicio. – araqnid

+0

Su suposición de que 'supervisord' funciona igual que' supervise' es correcta; comenzará y reaparecerá un subproceso para daemons bajo su responsabilidad. –

2

Para evitar la auto-iniciar el servicio con los /etc/init.d guiones, el paquete para PostgreSQL 9.1 proporciona un archivo /etc/postgresql/9.1/main/start.conf que 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 

Este es el archivo de modificar para evitar el inicio automático en lugar de mover de distancia /etc/init.d/postgresql como sugiere la entrada del blog.

Además, el cambio de UNIX sockets parámetros por falta de /var/run/postgresql no parece la mejor idea, porque es el valor predeterminado para cualquier programa relacionado con libpq, y porque no hay ninguna dificultad en la creación de ese directorio con los permisos adecuados, al igual se hace por la secuencia de arranque del paquete en /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 

y aunque el valor por defecto no debe causar ningún problema, tenga en cuenta que si postmaster en última instancia, se queda en primer plano o tenedores y se ejecuta en segundo plano está controlado por el parámetro silent_mode en postgresql.conf. Asegúrate de que esté apagado.

+0

gracias por la larga explicación. Dos preguntas: 1. ¿Por qué queremos evitar el autoinicio '/ etc/init.d/postgresql'? Esto no está claro para mí en el artículo original; 2. Según su respuesta anterior, parece que solo se deben cambiar dos cosas para que esto funcione con Supervisor: primero, cambie a ** manual ** en '/ etc/postgresql/9.1/main/start.conf', y segundo, configure el parámetro 'silent_mode' en '/ etc/postgresql/9.1/main/postgresql.conf' ** off **. ¿Es eso correcto? – MLister

+0

1: si postgresql comenzó en el arranque, estaría fuera del control del supervisor lo que contradice el objetivo: mantener los demonios bajo el control del supervisor. 2: sí –

+0

Ya veo. ¡eso es genial!Pero sí necesito crear una secuencia de comandos que contenga la porción que citó arriba para crear el directorio necesario y los permisos de configuración, y luego llamar al ejecutable postresql (por cierto, qué ejecutable debería estar usando: '/usr/lib/postgresql/9.1/bin/ postgres' o '/ usr/lib/postgresql/9.1/bin/pg_ctl'?)? Y luego ejecuta este script con Supervisor? ¡gracias de nuevo! – MLister

1

que estoy tratando de hacer que tanto Tomcat y postgres correr bajo el supervisor, y encontré algunos consejos aquí: https://serverfault.com/questions/425132/controlling-tomcat-with-supervisor

Aquí está mi modificada run_postgresql.sh, usando 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 esta PostgreSQL guión se detiene correctamente después de supervisorctl stop postgres.