04 septiembre 2013

Upgrade de RAID en FreeNAS: Elige tu propia aventura





Hace ya tiempo que, tras mucho investigar diferentes alternativas para disponer de una plataforma NAS en la que centralizar diversidad de contenidos, me decanté por FreeNAS como la solución más adecuada a mis problemas. De hecho, realicé una comparativa entre diferentes opciones libres para NAS en Security By Default.

 En esa época monté sobre un ordenador HP de sobremesa, un RAIDZ con tres discos SATA de 500 GB. En este caso, resultó un volumen de 1 TB de capacidad, sobre el que luego definí diversos datasets y sobre ellos, recursos compartidos por CIFS, NFS y AFP.

Sin embargo, las necesidades van cambiando, y sobre todo con la creación de Securízame, hay ciertas obligaciones legales como la LOPD, así como necesidades intrínsecas a la hora de ofrecer alta disponibilidad y continuidad de negocio, que me han llevado a generar muchos más backups de información sensible, haciendo que me quede prácticamente sin espacio en el NAS.

Para incrementar el espacio de almacenamiento, y ya pensando un dimensionamiento adecuado, compré dos discos duros Western Digital Red NAS de 3 Terabytes para formar un RAID 1 o Mirroring (sí, desperdiciando 3 TB, pero ganando en disponibilidad y en rendimiento, al poder realizar operaciones de lectura/escritura en los dos discos a la vez, al ir en diferentes buses). Uno de los requisitos de esta migración es poderla hacer dando el mayor tiempo de servicio posible, asumiendo que habría reinicios de máquina (al no ser hot-swappable), movimientos de datos entre volúmenes, etc…. 

FreeNAS se encontraba en versión 8.0.2 si no recuerdo mal, así que busco en la web de FreeNAS un procedimiento para hacer el upgrade a la última versión, la 9.1.1.

Se puede hacer vía GUI, por lo previo backup de todo el sistema y configuración, hago el upgrade. Un reinicio después, todo está correctamente en versión 9.1.1 y se permite nuevas mejoras en los RAIDZ. Dejo un par de días esta nueva versión para comprobar que la estabilidad y funcionamiento en los servicios existentes es correcto y que no hay ninguna incidencia. Estamos listos para comenzar con la odisea.



Empieza la fiesta!

Así pues, apago la máquina, quito la carcasa y procedo a conectar a la placa base los dos discos duros nuevos. Sabía que por espacio físico iba a ser imposible tener todo funcionando dentro, por lo que mientras durase el movimiento de datos, sería como una operación a corazón abierto en un quirófano. Y a partir de aquí empiezan los problemas. La placa base de la máquina, sólo dispone de tres conectores SATA. Game Over… ¿Cómo conecto los discos nuevos si no hay conectores? Veo que la máquina, dispone de varios Slots libres PCI y PCI Express, por lo que busco en internet tarjetas de expansión que me den un par de conectores SATA. Como veo que eso existe, y lo quiero hacer YA (gran defecto esto de las prisas), me voy de paseo a un centro comercial cercano y a varias tiendas de informática de barrio. En ningún sitio tengo suerte con la famosa tarjeta, hasta que, finalmente, en una de estas tiendas, me dicen que nueva no tienen ninguna, pero que me prestan una usada (que no me la pueden vender). Como no todo podía ser tan bonito, la que me prestan sólo tiene una conexión SATA. Además, me prestan un cable de datos SATA y un adaptador de corriente de una fuente de alimentación de las antiguas para dos discos duros SATA. Apago la máquina de nuevo. Pincho la tarjeta, conecto uno de los discos SATA, su cable de datos y, cuando voy a conectar el adaptador de corriente a la fuente de alimentación, me doy cuenta que el conector antiguo no vale para esta fuente. Nuevo contratiempo. Rescato una máquina antigua que tenía apagada y le conecto el adaptador a la fuente de alimentación, quito la conexión IDE que tenía al disco duro para que no tome el control el sistema operativo (únicamente quiero la fuente para dar corriente al disco nuevo) y arranco ambas máquinas. Parece que la BIOS detecta el cambio, y FreeNAS también. Estupendo, sigo dando servicio a los clientes y veo el nuevo disco con toda su capacidad. 

La idea es crear un volumen nuevo, con dos discos en RAID 1 de 3TB y replicar la configuración de datasets dentro de éste. Comienzo con la creación del RAID y… nuevo problema: FreeNAS sólo te deja crear un RAID1 cuando tiene discos suficientes detectados. Hago la prueba con dos pendrives USB de 2GB y efectivamente, si inserto sólo un pendrive, no me deja crear más que un volumen normal. Si inserto el segundo USB, me deja crear el RAID de ambos. Se me ocurre que al tener anteriormente un RAID 5, lo normal es que con un disco menos, el sistema arranque igualmente y sea capaz de recuperar los datos. 

Enésimo apagón 

Apago nuevamente la máquina en ventana horaria programada, apago la máquina que da corriente al nuevo disco, quito uno de los discos de 500GB y pincho a ese SATA el otro disco de 3TB. Arranco, la BIOS detecta que le falta un disco y que detecta uno nuevo de 3TB. Arranca FreeNAS y levanto el resto de los servicios de los clientes en máquinas virtuales. Nagios detecta que todo vuelve a la vida y que los datos siguen disponibles. En el gestor de volúmenes de FreeNAS veo que el RAID 5 que tenía, detecta un error por faltar un disco y que el estado del RAID ha pasado de Healthy a Degraded. Es decir, que si en ese momento revienta uno de los discos de 500 GB, se va al garete. Bueno, pero de momento funciona, ¿verdad?




Creando el RAID 1 y el nuevo volumen 

Ahora sí, creamos un volumen de 3TB con configuración de discos en Mirroring, y con estado Healthy. Clonamos, manualmente, la configuración de los datasets del volumen antiguo, espacios máximos y mínimos reservados, permisos de usuario en la raíz, y determinados permisos avanzados, etc,… Nos conectamos por SSH al FreeNAS y empieza la copia de los datos. Uno a uno, y empezando por el menos crítico, tiramos abajo el servicio de uno de los clientes (ya avisado y en ventana de mantenimiento) y para hacer una copia perfecta manteniendo los permisos de los ficheros correctamente, efectuamos un "rsync -av --progress /mnt/volume/clienteA /mnt/datos/clienteA" (en este caso, el volumen antiguo es "/mnt/volume" y el nuevo "/mnt/datos"). Al no haber servicio, mientras tanto, modificamos los recursos compartidos (en unos casos serán NFS, en otros CIFS y en otros AFP) para hacer que la ruta a compartir, que antes era /mnt/volume/clienteA ahora será /mnt/datos/clienteA. Una vez termina la copia correctamente, Arranco el servicio del cliente y veo que efectivamente todo funciona, y obviamente los servicios tiran del volumen nuevo. Estupendo! Ahora sólo resta migrar los demás datasets con el mismo procedimiento. Como todo el mundo estaba avisado de la operación, digo, "tiro todos los servicios de los clientes que quedan y minimizo el tiempo de ejecución y de parada" (craso error). Abro una conexión SSH por cada dataset a migrar y ejecuto una línea rsync por cada dataset a mover. Mientras esto se empieza a hacer, modifico los recursos a compartir (el s/volume/datos/g que decíamos antes). Las copias se siguen haciendo, y voy monitorizando el estado de los volúmenes en la GUI de FreeNAS. Todo bien, hasta que aparece un warning. El estado del nuevo RAID ha pasado de Healthy a Degraded… Uno de los discos nuevos no es detectado. Me acerco a la máquina y veo que en la tarjeta PCI que me daba una conexión SATA, antes se encendía un led verde, y ahora está apagado…. Sin embargo, la copia se sigue haciendo al RAID 1, aunque obviamente a uno de los discos. 


Varias horas después, de bastante tensión por cierto, terminan todos los rsyncs. Apago la máquina NAS, la que da corriente al disco que aparentemente se ha muerto, y quito la corriente de la fuente de alimentación del NAS. Quito la tarjeta PCI prestada, los 2 discos de 500GB con el RAID antiguo degradado, y pincho el disco de 3TB nuevo a una de las tomas SATA de la placa base. Arranco el NAS, la BIOS reconoce los cambios de discos de nuevo, arranca FreeNAS y los recursos compartidos están disponibles. Empiezo a levantar servicios de clientes y todo parece que funciona correctamente. En el gestor de volúmenes un indicador amarillo aparece un Error grave porque el volumen antiguo no es detectado. Sin embargo, el volumen nuevo está en estado Healthy. Me conecto vía SSH y ejecuto "zpool status" y me muestra el estado del volumen nuevo indicando que está haciendo un "Resilvering" es decir, que hay problemas de integridad, pero que los está corrigiendo. Recordemos que a partir de "vaya usted a saber cuándo" uno de los discos duros del RAID 1 "se fue a dormir" y sólo quedó el otro, por lo que ahora que es capaz de detectarlo correctamente, lo "está poniendo al día".



Una vez que esta tarea ha terminado correctamente, según dice el resilvering de 428GB ha tardado 1 hora y 33 minutos, ya tenemos el RAID 1 up & running correctamente. Procedemos pues a eliminar de la configuración de los volúmenes el que dice que no existe y que no detecta, y dejamos únicamente el nuevo, tras comprobar que sigue dando servicio correctamente.



Por otra parte, en el Dashboard de FreeNAS, vemos que las estadísticas de espacio ocupado por volumen y cada recurso nuevos, se actualizan correctamente. Sin embargo, las stats referentes al volumen antiguo, siguen apareciendo, aunque en blanco. 



Para arreglar eso, me dispongo a buscar, vía SSH, y con un sencillo "grep -r -i volume *" a lo largo y ancho del disco. Cuando veo que aparece por un montón de ficheros, se me ocurre que será más sencillo buscar por "datos" que es el nombre del nuevo volumen, y revisar esos mismos ficheros en busca de "volume". Así doy con la ruta /var/db/collectd/rrd/localhost, donde se encuentran diferentes directorios con los nombres de cada "estadística". Por si acaso reventaba algo, los muevo a un directorio temporal en /tmp, y recargo la GUI…. et voilá, ya no aparecen.





Conclusiones

  • Hacer este tipo de migraciones en las que hay servicio a clientes requiere una planificación bastante importante. Ya sabéis que, como dijo Abraham Lincoln, "si tuviese 8 horas para cortar un tronco, debería emplear 6 afilando el hacha".
  • Las prisas no son buenas consejeras para estas cosas. Si véis que un rsync funciona, en vez de ejecutar todos en paralelo, sería más rápido y sensato hacerlos en serie, tirando abajo los servicios de uno en uno y dejando tiempo para que los cambios sean estables. 
  • Después de esta aventura, pienso que podría haber realizado la migración sin contar con la tarjeta PCI-E. Habría bastado con tirar los servicios de los clientes primero, apagar el NAS, dejar conectado por SATA un disco del volumen antiguo (o incluso ninguno), y conectar los dos discos de 3TB, arrancar FreeNAS, ver que efectivamente da error el volumen antiguo puesto que no hay discos, generar un volumen nuevo en RAID 1 con los dos discos de 3TB, generar al menos un dataset en el nuevo volumen, apagar la máquina, quitar uno de los discos de 3TB, pinchar dos de los discos de 500GB, arrancar de nuevo el FreeNAS, ir al gestor de volúmenes, ver que el RAID 5 está en estado degradado y que el RAID 1 también lo está (obviamente nos falta un disco de cada volumen)… levantar los servicios de los clientes, hacer toda la migración y copia de los datasets, de uno en uno, modificar el volumen a compartir por cada recurso, apagar el freenas, quitar los discos de 500GB, conectar el disco de 3TB que falta y confiar en el resilvering de TODO el RAID 1. Sin embargo, es una conjetura que NO voy a probar con el sistema en producción y con todo estupendo como está ahora. 
  • Niños, no hagáis esto sin supervisión de un adulto!
      

10 comments :

Arturo dijo...

Soy lector asiduo de los que no comentan, pero debo decir que este es un excelente artículo. Felicitaciones por la migracion!

Jose Vicente dijo...

Muy interesante el articulo, menuda aventura, pero todo termino bien, enorabuena

Anonimo dijo...

Ahora mismo tendrías 2 años más de vida si hubieses invertido 150 euros en un equipo mini-itx nuevo con carcasa para 3 discos e instalado un NAS en paralelo y luego cursado el rsync x))))) , pero como los técnicos siempre tenemos ganas de complicarnos.... felicidades por conseguir que tu server siga vivo ;)

Valentin dijo...

Menudo trabajo, ¿y durante todo el proceso jugandotela?, eres un valiente.
Personalmente respecto a rendimiento (usas todos los LUM`s) y disponibilidad (hombre con 3 discos la disponibilidad es la misma que un raid1) me gusta mas el RAIDZ que el RAID1 pero supongo que intervino el tema económico para no comprar 3 discos.
Habiendo comprado los 3 discos, haciendo un autoexpand del pool y reemplazando poco a poco los discos (replace) te habrías quitado de mucho extresssss, viajes y prestamos.
Para terminar, ignoro que habrás realizado con los discos extraidos pero valora la separación de los dispositivos de Log (ZIL) que para NFS va bien.


saludos.

Lorenzo_Martinez dijo...

Hombre, esa opción también la valoré. De hecho, todavía me ronda por la cabeza la posibilidad de cambiar el hardware del equipo, y montarlo en un equipo nuevo de menor consumo... Simplemente fue más la prisa y necesidad de aumentar el espacio disponible antes que ponerme a buscar un equipo mini-itx adecuado :)

Lorenzo_Martinez dijo...

Hola, gracias por lo que indicas en tu comentario, pero... en qué parte del proceso me la jugué? Quieres decir si fallase uno de los dos discos que quedaban del RAIDZ mientras se hacía la copia? En un primer momento pensé en comprar 3 discos de 2 TB y hacer un RAIDZ en vez de 2 de 3TB y hacer un RAID 1.
No obstante, habiendo comprado los 3 discos nuevos, me puedes explicar cómo se hace el autoexpand del pool si no puedo tener 6 discos pinchados a la vez en el sistema?

kapisketo dijo...

Quitar uno de los discos viejos y meter uno nuevo, resilver. Cuando termine sustituir otro disco y resilver. Otra vez lo mismo.
Ya tienes 3 discos de mayor capacidad.
Lo que ahora no recuerdo si en raidz se puede hacer un resilver con el sistema en vivo.

Xeti dijo...

Una controladora profesional (1818) te hubiera ahorrado muchos problemas. O un NAS decente tipo Netapp o EMC. Si no, una máquina nueva con doble fuente y controladora raid en hw con slots cambiables en caliente también te hubiera solucionado l problema rápidamente y sin downtime.

Linuxito dijo...

La verdad que no sé cómo te funcionó eso de conectar las dos fuentes sin puentear las masas para que tengan el mismo voltaje de referencia. Saludos!!

jose dijo...

Soy nuevo en esto, necesito saber como desmonto un disco con raiz1 para dejar solo un disco en freenas...??