Pasar al Servidor Linux (Parte 2) - Transferencia de Datos Básicos
Introducción
Existen muchos escenarios donde es posible que tenga que moversen los datos y los requisitos operativos de un servidor a otro. Es posible que deba implementar sus soluciones en un nuevo centro de datos, actualizar a una computadora más grande o realizar la transición a un nuevo hardware a un nuevo proveedor de servidor.
Sean cuales sean sus razones, hay muchas consideraciones diferentes que debe hacer al pasar de un sistema a otro. Conseguir configuraciones funcionalmente equivalentes puede ser difícil si no está operando con una solución de administración de configuración como Chef, Puppet o Ansible. No sólo debe transferir datos, sino también configurar sus servicios para que operen de la misma manera en una computadora nueva.
En el último artículo, preparamos nuestros servidores para la migración de datos . En este punto, su sistema de destino y fuente debe ser capaz de comunicarse (el sistema de destino debe tener acceso SSH al sistema de origen). También debe tener una lista de software y servicios que necesita transferir, con números de versión de los componentes más importantes.
En este tutorial, continuaremos donde lo dejamos y comenzaremos la migración real a nuestro nuevo servidor.
Estrategia General
Antes de comenzar, debemos describir nuestra estrategia general para migrar datos de nuestra fuente a nuestro sistema de destino.
La idea general es transferir todas las partes relevantes de la información mientras se deja el sistema objetivo lo más limpio posible.
Algunas estrategias de migración simplemente apuntan rsync a la root de la computadora de origen y luego pasan algunas líneas de exclusión para indicar al proceso que no incluya archivos que sabemos si podrán causarán conflictos. No vamos a tomar este enfoque. La migración de grandes piezas de datos del sistema a un sistema operativo en vivo puede causar resultados impredecibles y queremos terminar con un sistema estable.
No sólo eso, sino que no queremos desordenar innecesariamente nuestro nuevo sistema con archivos que ya no son relevantes para nuestros requisitos operativos. Esto requerirá más esfuerzo, pero nos llevará a una configuración más útil y amigable cuando hayamos terminado.
Por lo tanto, no sólo migraremos todos los posibles archivos no conflictivos al nuevo sistema si no es relevante para lo que esperamos lograr. En su lugar, estaremos decidiendo exactamente qué datos necesitan ser movidos como requisito funcional para nuestros propósitos. Esto incluye datos y detalles de configuración, usuario, trabajos, etc.
Creación de una Secuencia de Comandos de Migración
Estaremos tomando estas decisiones a medida que avancemos y añadiéndolas a un script de migración.
Este le dará una serie de ventajas importantes. Le permitirá volver a ejecutar los comandos de nuevo si hay un problema o para capturar los cambios de datos en el sistema de origen después de la primera ejecución. Se autodocumentará los comandos que utilizó para transferir los datos. También permitirá que su servidor de origen continúe en el siguiente elemento de transferencia de datos sin la interacción del usuario.
Al escribir el guión, debería ser capaz de ejecutarlo varias veces, refinándolo a medida que vaya. La mayoría de los archivos se transferirán a través de rsync
, que sólo transferirá los cambios de archivo. Si las otras porciones de transferencia de datos tardan mucho tiempo, puede comentarlas con seguridad hasta que esté bastante seguro de que su secuencia de comandos está en su estado final.
Este tutorial será sobre todo una guía sobre qué agregar a la secuencia de comandos de migración para que la migración sea exitosa. Proporcionará pautas generales con más frecuencia que especificaciones.
Podemos crear una secuencia de comandos de migración simple en el directorio root del usuario root en el sistema de destino. Usaremos esto para automatizar una gran parte de nuestras operaciones de migración de datos:
nano /root/sync.sh
Dentro del archivo, comience con un encabezado de guión estándar (usaremos "sh" para hacer esto más portátil, pero puede usar "bash" si desea usar las funciones extendidas que ofrece y tenerlas disponibles en ambos sistemas):
#!/bin/sh
Vamos a añadir a esto, a medida que continuamos. Por ahora, vamos a salir del archivo rápidamente para que podamos hacerlo ejecutable.
De vuelta en la línea de comandos, haga que el script sea ejecutable escribiendo:
chmod 700 /root/sync.sh
Para ejecutar el script en cualquier momento, ahora puede llamarlo usando su ruta absoluta:
/root/sync.sh
O su trayectoria relativa:
cd /root
./sync.sh
Usted debe probar el guión regularmente como usted va a lo largo de ver si hay problemas que surgen.
Instalar los Programas y Servicios Necesarios
El primer paso que debemos tomar antes de la automatización es adquirir los paquetes que necesita para poner estos servicios en funcionamiento. También podríamos añadir esto al script, pero es más fácil hacer esta parte a mano y documentarla en nuestro script.
Los detalles de configuración vendrán más tarde. Por ahora, necesitamos estas aplicaciones instaladas y el acceso básico configurado para que podamos llegar a trabajar. Debe tener una lista de paquetes y versiones requeridos de su servidor de origen.
Agregue Depósitos Adicionales si es Necesario
Antes de intentar obtener estas versiones de nuestro gestor de paquetes, deberíamos inspeccionar nuestro sistema de origen para ver si se han agregado depósitos adicionales.
En servidores Ubuntu / Debian, puede ver si hay fuentes alternativas de software en su sistema de origen investigando algunas ubicaciones:
nano /etc/apt/sources.list
Esta es la lista de fuentes principales. Las listas de fuentes adicionales pueden estar contenidas en el directorio sources.list.d
:
ls /etc/apt/sources.list.d
Si es necesario, agregue los mismos orígenes a su servidor de destino para tener disponibles las mismas versiones de paquete.
En un sistema basado en RHEL, puede utilizar yum
para listar los repositorios configurados para el servidor:
yum repolist enabled
A continuación, puede agregar repositorios adicionales al sistema de destino escribiendo:
yum-config-manager --add-repo repo_url
Si realiza cambios en la lista de origen, agréguelos como comentarios en la parte superior de la secuencia de comandos de migración. De esta manera, si tiene que empezar desde una nueva instalación, sabrá qué procedimientos deben suceder antes de intentar una nueva migración.
nano /root/sync.sh
#!/bin/sh
#############
# Prep Steps
#############
# Add additional repositories to /etc/apt/source.list
# deb http://example.repo.com/linux/deb stable main non-free
Guardar y cerrar el archivo.
Especificación de Restricciones de Versiones e Instalación
Ahora tiene los repositorios actualizados para coincidir con su servidor de origen.
En servidores Ubuntu / Debian, ahora puede intentar instalar la versión del software que necesita en su servidor de destino escribiendo:
apt-get update apt-get install package_name=version_number
Muchas veces, si la versión del paquete es anterior, se habrá eliminado de los repositorios oficiales. En este caso, puede tener que buscar manualmente la versión anterior de los archivos .deb y sus dependencias e instalarlos manualmente con:
dpkg -i package.deb
Esto es necesario si coincide con la versión del software es importante para su aplicación. De lo contrario, sólo puede instalar regularmente con su gestor de paquetes.
Para sistemas basados en RHEL, puede instalar versiones específicas del software escribiendo:
yum install package_name-version_number
Si necesita buscar archivos rpm que se hayan eliminado del repositorio a favor de versiones más recientes, puede instalarlos con yum después de encontrarlos así:
yum install package_name.rpm
Instale cualquier software relevante que esté disponible desde su administrador de paquetes en el nuevo sistema. En el caso de que el software que necesita no esté disponible a través de un repositorio u otro medio fácil y haya sido instalado por fuente o extraído como binario desde el sitio web de un proyecto, tendrá que replicar este proceso en el sistema de destino.
Una vez más, realizar un seguimiento de las operaciones que está realizando aquí. Los incluiremos como comentarios en un guión que estamos creando:
nano /root/sync.sh
#!/bin/sh ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1
De nuevo, guarde y cierre el archivo.
Inicio de la Transferencia de Datos
La transferencia real de datos puede ser fácilmente la parte más importante de la migración. Si está migrando un servidor con una gran cantidad de datos, es probable que sea una buena idea comenzar a transferir datos antes que tarde. Puede refinar sus comandos más adelante, y rsync sólo transfiere las diferencias entre los archivos, por lo que esto no debería ser un problema.
Podemos empezar por iniciar un rsync de cualquier gran cantidad de datos de usuario que necesitan ser transferidos. En este contexto, estamos utilizando datos de "usuario" para referirnos a cualquier dato significativo que necesite su servidor, excepto los datos de la base de datos. Esto incluye datos del sitio, directorios de inicio del usuario, archivos de configuración, etc.
Instalación y Uso de la Pantalla
Para hacerlo con eficacia, vamos a querer iniciar una sesión de screen
en nuestro sistema de destino que puede dejar en funcionamiento mientras continúa trabajando.
Puede instalar la screen
utilizando el gestor de paquetes de su distribución. En Ubuntu o Debian, puedes escribir esto:
apt-get update
apt-get install screen
Puede averiguar sobre la operación de la pantalla revisando el anterior enlace.
Básicamente, es necesario iniciar una nueva sesión de pantalla como esta en el servidor de destino:
screen
Se iniciará una sesión de pantalla y se le devolverá a una línea de comandos. Probablemente parezca que no ha sucedido nada, pero ahora está operando un terminal que está contenido dentro del programa de pantalla.
Todo el trabajo que haremos durante nuestra migración ocurrirá dentro de una sesión de pantalla. Esto nos permite saltar fácilmente entre múltiples sesiones de terminal, y nos permite recoger donde lo dejamos si tenemos que salir de nuestro terminal local o nos desconectamos.
Puede emitir comandos aquí y luego desconectar el terminal, lo que le permite seguir ejecutándose. Puede desconectarse en cualquier momento escribiendo:
CTRL-a d
Puede volver a conectar más tarde escribiendo:
screen -r
Si necesita crear otra ventana de terminal dentro de su sesión de pantalla, escriba:
CTRL-a c
Para cambiar entre ventanas, escriba estos dos para recorrer las ventanas en cualquier dirección:
CTRL-a n
CTRL-a p
Destruye una ventana escribiendo:
CTRL-a k
Inicio de las Transferencias de Archivos
En el interior de la sesión de pantalla, inicie cualquier tarea de rsync que anticipe que tardará mucho tiempo en completarse. La escala de tiempo aquí depende de la cantidad de datos significativos (no de base de datos) que tiene que transferir.
El comando general que desea utilizar es:
rsync -avz --progress source_server:/path/to/directory/to/transfer /path/to/local/directory
Puede obtener más información sobre cómo crear comandos rsync adecuados leyendo este tutorial. Es posible que tenga que crear los directorios que conducen al destino para que el comando se ejecute correctamente.
Cuando tenga su sesión de rsync en ejecución, cree una nueva ventana de pantalla y cambie a ella escribiendo:
CTRL-a c
Compruebe periódicamente para ver si la sincronización está completa y tal vez para iniciar una sincronización posterior escribiendo:
CTRL-a p
Ahora, debe agregar el mismo comando rsync que acaba de ejecutar en el script que está creando. Agregue cualquier comando rsync adicional que necesite para obtener todos los datos importantes de usuario y aplicación en su servidor de destino.
No nos preocuparemos por los archivos de base de datos en este momento, porque hay mejores métodos de transferir esos archivos. Discutiremos esto en una sección posterior.
#!/bin/sh ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1 ############# # File Transfer ############# # Rsync web root rsync -avz --progress 111.222.333.444:/var/www/site1 /var/www/ # Rsync the apache configuration files rsync -avz --progress 111.222.333.444:/etc/apache2/* /etc/apache2/ # Rsync php configuration rsync -avz --progress 111.222.333.444:/etc/php5/* /etc/php5/ # Rsync mysql config files rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ # Rsync home directories . . .
Debe agregar cualquier comando rsync que necesite para transferir sus datos y configuraciones fuera del sistema de origen.
Esto no necesita ser perfecto, porque siempre podemos retroceder y ajustarlo, así que intente lo mejor posible. Si no está seguro de si necesita algo en este momento, déjelo por el momento y simplemente añada un comentario.
Vamos a ejecutar el script varias veces, lo que le permite modificarlo para recoger archivos adicionales si usted termina necesitando ellos. Ser conservador sobre lo que usted transfiere mantendrá su sistema del blanco limpio de archivos innecesarios.
Estamos tratando de replicar la funcionalidad y los datos del sistema original, y no necesariamente el lío.
Modificación de Archivos de Configuración
Aunque muchas piezas de software funcionarán exactamente igual después de transferir los detalles de configuración relevantes y los datos del servidor original, es probable que tenga que modificar alguna configuración.
Esto presenta un pequeño problema con nuestro script de sincronización. Si ejecutamos el script para sincronizar nuestros datos y luego modificar los valores para que reflejen la información correcta para su nuevo hogar, estos cambios se borrarán la próxima vez que ejecute el script nuevamente.
Recuerde que probablemente ejecutaremos el script rsync varias veces para ponernos al día con los cambios que se han producido en el sistema de origen desde que iniciamos nuestra migración. El sistema de origen puede cambiar significativamente durante el transcurso de la migración y la prueba del nuevo servidor.
Hay dos caminos generales que podemos tomar para evitar borrar nuestros cambios. En primer lugar, voy a hablar de la manera más fácil, y el seguimiento de lo que considero la solución más efectiva.
La Manera Rápida
La manera fácil de abordar esto es modificar los archivos según sea necesario en el sistema de destino después de la primera operación de sincronización. A continuación, puede modificar los comandos rsync en su secuencia de comandos para excluir los archivos que ajustó.
Esto hará que rsync no sincronice estos archivos en ejecuciones subsiguientes, lo que sobrescribiría sus cambios con los archivos originales de nuevo.
Esto se puede lograr comentando el comando de sincronización anterior y añadiendo uno nuevo con algunas instrucciones de exclusión como esta:
# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/
Debe agregar líneas de exclusión para cualquier archivo bajo la especificación del directorio rsync que se haya modificado. También sería una buena idea agregar un comentario en cuanto a lo que se modificó en el archivo, en caso de que realmente tiene que volver a crearlo en cualquier momento.
# Adding exclude rule. Changed socket to '/mysqld/mysqld.sock' # rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/
La Manera Recomendada
Mientras que el método anterior aborda el problema de alguna manera, es realmente sólo evitar el problema en lugar de resolverlo. Podemos hacerlo mejor.
Los sistemas Linux incluyen una variedad de manipuladores de texto que son muy útiles para scripts. De hecho, la mayoría de estos programas se hacen específicamente para permitir su uso en un entorno de secuencias de comandos.
Las dos utilidades más útiles para esta tarea son sed
y awk
.
La idea básica es que podemos programar cualquier cambio que haríamos manualmente, de modo que el propio script realice las modificaciones necesarias.
Así que en el ejemplo anterior, en lugar de agregar una exclusión para el archivo que modificamos después del hecho, podríamos mantener ese comando rsync y hacer ese cambio automáticamente usando un comando sed:
rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ # Change socket to '/mysqld/mysqld.sock' sed -i 's_/var/run/mysqld/mysqld.sock_/mysqld/mysqld.sock_g' /etc/mysql/my.cnf
Esto cambiará la ubicación del socket en cada instancia del archivo, cada vez que se transfiera el archivo. Asegúrese de que las líneas de manipulación de texto vienen después de las líneas que sincronizan los archivos en los que operan.
De manera similar, podemos fácilmente realizar cambios en los archivos de datos tabulares mediante awk. Por ejemplo, el /etc/shadow
se divide en pestañas delimitadas por el carácter de dos puntos (:). Podríamos usar awk para quitar la contraseña de root hash de la segunda columna como esto:
awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow && rm shadow.tmp
Este comando le dice a awk que tanto el original como el delimitador de salida deben ser ":" en lugar del espacio predeterminado. A continuación, especificamos que si la columna 1 es igual al "root", entonces la columna 2 debe establecerse en una cadena vacía.
Hasta las versiones bastante nuevas de awk, no había ninguna opción para editar en el lugar, por lo que aquí estamos escribiendo este archivo en un archivo temporal, sobrescribiendo el archivo original y, a continuación, eliminar el archivo temporal.
Debemos hacer todo lo posible para codificar todos los cambios necesarios en nuestros archivos. De esta manera, será fácil reutilizar algunas de las líneas de nuestro script de migración para otras migraciones, con algunas modificaciones fáciles.
Una manera fácil de hacerlo es ir a través de su script y añadir comentarios a su script para cada archivo que necesita ser modificado. Después de conocer sus requisitos, vuelva y agregue los comandos que realizarán las operaciones necesarias.
Agregue estos cambios a su script y vamos a seguir adelante.
Descarga y Transfiere tus Archivos de Base de Datos
Si su sistema está utilizando un sistema de gestión de base de datos, deseará volcar la base de datos utilizando los métodos disponibles para su sistema. Esto variará dependiendo del DBMS que uses (MySQL, MariaDB, PostgreSQL, etc.).
Para un sistema MySQL regular, puede exportar la base de datos utilizando algo como esto:
mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db
Las opciones de volcado de MySQL dependen en gran medida del contexto, por lo que tendrás que explorar qué opciones son las adecuadas para tu sistema antes de decidir. Esto está más allá del alcance de este artículo.
Vamos a repasar lo que estas opciones harán para el volcado de la base de datos.
- -Q : Esta opción está habilitada de forma predeterminada, pero se agrega aquí para mayor seguridad. Pone identificadores como nombres de bases de datos dentro de comillas para evitar malas interpretaciones.
- -q : Esto significa rápido y puede ayudar a acelerar volcados de mesa grandes. En realidad, le está diciendo a MySQL que funcione en una fila por fila en lugar de tratar de manejar toda la tabla a la vez.
- -e : Esto crea archivos de volcado más pequeños agrupando instrucciones de inserción en lugar de manipularlas individualmente cuando se carga el archivo de volcado.
- -R : Esto permite a MySQL también volcar las rutinas almacenadas junto con el resto de los datos.
- --add-drop-table : Esta opción especifica que MySQL debe emitir un comando DROP TABLE antes de cada CREATE TABLE para evitar ejecutar un error si la tabla ya existe.
- -A : Esta opción especifica que MySQL debe volcar todas las bases de datos.
- -u : Esto detalla el usuario de MySQL para usar para la conexión. Esto debe ser root.
- -p : Es la contraseña necesaria para la cuenta root de MySQL.
Esto creará un volcado de MySQL de los datos de MySQL del sistema fuente en el sistema original. Podemos envolver esto en un comando SSH para que se ejecute de forma remota:
ssh Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. 'mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db'
A continuación, podemos utilizar un comando rsync normal para recuperar el archivo cuando haya terminado:
rsync -avz --progress 111.222.333.444:/root/database_name.db /root/
Después de eso, podemos importar el dump en la instancia MySQL del sistema de destino:
mysql -u root -proot_password < /root/database_name.db
Otra opción es configurar una configuración de replicación entre la base de datos original y la base de datos del sistema de destino. Esto puede permitirle simplemente intercambiar el maestro y el esclavo cuando haya terminado, para finalizar la migración de la base de datos.
Esto también está más allá del alcance de este artículo, pero puede encontrar detalles sobre configurar la replicación maestro-esclavo aquí.
Si vas por esta ruta, asegúrate de añadir comentarios a tu script especificando tu configuración. Si hay un gran problema, usted quiere ser capaz de tener buena información sobre lo que hizo para que pueda evitarlo en un segundo intento.
Conclución
Ahora debe tener la mayoría de sus datos en su sistema de destino, o estar en el proceso de transferencia. Esto logrará la mayor parte de la transferencia de datos, pero todavía tenemos que hacer un poco de configuración en nuestro sistema para que coincida con nuestra servidor anterior.
En el siguiente tutorial , pasaremos a transferir otra información y configuración de usuario.
Fuente. Artículo traducido y con muy ligeras modificaciones de: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian