2012-03-20 31 views
12

Por lo que puedo decir, la función capistrano :db se usa solo para ejecutar migraciones.capistrano,: db role, ¿para qué sirve?

(Por lo tanto, en la mayoría de los casos es probable que no debe ser en realidad el servidor que ejecuta la base de datos. ¿Por qué tener un rubí/rieles apilar allí (o permitir conexiones ssh allí)? Es justo lo que sea servidor que desea para ejecutar realmente las migraciones de rieles).

Y solo el servidor identificado como función db con :primary => true se utiliza para ejecutar migraciones.

Entonces, cualquier otro servidor identificado como rol 'db' pero sin :primary => true ... ¿se usa para nada? Entonces, ¿por qué deploy.rb por defecto creado por capify . lo alienta a listarlos? ¿Qué mencionarías incluso aquí?

¿Algo que me falta?

Respuesta

21

Obviamente, el nombre de la función :db es engañoso. Como señaló, Capistrano lo define (con :primary => true) como un host en el que ejecutamos rake db:migrate, pero los servidores de bases de datos no siempre se ejecutan en dichos hosts. Podemos alterar el esquema del servidor de base de datos remoto a través de una aplicación de Rails. El nombre de función correcto para este tipo de host no es :db.

A partir de los comentarios en lib/capistrano/configuration/roles.rb, el significado original de la función :db es un host en el que se ejecutan los servidores de bases de datos. Se espera que inicie sesión en los hosts :db y realice algunas tareas.

Los diseñadores de Capistrano deberían haber definido el rol :migration u otra cosa para la tarea deploy:migrate. Pero la asociación entre el rol :db con esta tarea se definió hace seis años con 9a6d2fb y no ha cambiado desde entonces.

En general, los usuarios de Capistrano pueden definir roles y asociarlos con tareas libremente. La tarea deploy:migrate se proporciona solo como una receta para desarrolladores de Rails. Desafortunadamente, esta receta incluye un concepto erróneo sobre cómo hacemos la migración de la base de datos y se usa ampliamente durante mucho tiempo.

+2

Ahora puede cambiar el nombre del rol para las migraciones (que también se recomienda): https://github.com/capistrano/rails#recommendations – NobodysNightmare

4

Es posible que tenga una configuración que incluya un servidor de base de datos maestro y varios servidores esclavos. En algunos casos, podría tener una tarea capistrano que debe ejecutarse en todos los servidores de bases de datos. En otros, es posible que desee ejecutar una tarea (por ejemplo, una migración) solo en el servidor maestro y permitir que los cambios se propaguen a las instancias esclavas.

+0

¿Puedes dar algún ejemplo de una tarea que se ejecutaría en todos los servidores de bases de datos? En este caso, ¿significa esto los hosts reales en los que se está ejecutando la base de datos? – jrochkind

+0

Sí. Un solo servidor PUEDE cumplir múltiples funciones, pero no tiene por qué. En muchos casos puede escalar su base de datos con un único maestro y múltiples esclavos. Es posible que desee ejecutar una migración de datos solo en el servidor primario (principal), pero tal vez, si tiene activado el inicio de sesión para todas las instancias de la base de datos, es posible que desee presionar todas ellas y archivar los archivos de registro. –