Para crear un cluster de zonas se debe tener bien claro los siguientes conceptos:
El cluster de zonas de Solaris no es realmente un "cluster de zonas" al estilo VMWare. En un cluster de VMWare hay dos o mas nodos que pueden acceder simultaneamente a un volumen compartido con un filesystem distribuido. La máquina virtual que se crea se ejecuta en alguno de los nodos, y migra completa al otro nodo. Solo puede estar en un nodo a la vez.
En un cluster de Solaris previamente configurado y funcinando se crean zonas que se ponen en cluster entre ellas. Es decir que cada zona esta en cluster con otras zonas. Por lo que se habla de tener un cluster físico entre las zonas globales de los nodos y clusters virtuales (o sub clusters) entre las zonas de los nodos. Además se debe crear un volumen compartido para cada cluster de zonas, ya que el pool (de zfs) migrará con el grupo de recursos independientemente de los otros volúmenes (de los otros grupos derecursos, en el mismo cluster de zonas o en otros clusters).
Partimos de un cluster llamado zbox que ya está configurado en dos máquinas llamadas zbox1 y zbox2.
Para configurar las zonas que se pondrán en cluster se deben realizar los siguientes pasos:
Verificar que tenemos configuradas la cantidad requerida de zonas en el cluster:
zbox1# cluster show-netprops | grep num_zoneclusters
num_zoneclusters: 12
En este caso, el número máximo de zonas que se pueden ejecutar en este cluster es de 12. Si no es suficiente, se agranda el número a la cantidad requerida con el siguiente comando:
zbox1# cluster set-netprops -p num_zoneclusters=24
Creación de las zonas
En vez de utilizar el comando zonecfg se utiliza el comando clzonecluster (o clzc) que tiene la misma sintaxis y en general las mismas funciones que zonecfg. Este comando sirve para crear todas las zonas del cluster a la vez. En este caso se crea un cluster de zonas llamado filesrvr, que consta de dos zonas, una en cada nodo del cluster. Las zonas se llamarán filesrvr1 y filesrvr2 (filesrvr1 en zbox1 y filesrvr2 en zbox2). La ip del servicio será 192.168.1.35 (ip flotante entre las zonas), la ip de filesrvr1 es 192.168.1.33, la de filesrvr2 es 192.168.1.34. Todas estas ips usan el grupo ipmp de las zonas globales que se llaman vlan18, pero que en las configuraciones se identifican por la interfaz principal del grupo ipmp (en ambos nodos e1000g18000).
Comienza la configuración del cluster de zonas:
zbox1# clzonecluster configure filesrvr
filesrvr: No existe tal clúster de zona configurado
Use 'create' to begin configuring a new zone cluster.
Si quiero una zona big uso el comando create -b (igual que en zonecfg). En este caso se trata de una zona small (fs de binarios heredados de la zona global)
clzc:filesrvr> create
Especifico donde se crearan los root filesystems de cada una de las zonas (que coinciden en ambas máquinas), tanto en zbox1 como en zbox2 hay un zfs llamado /zone para crear zonas. Este volumen zfs está en los discos locales de la máquina, no en la SAN, con lo que en principio desde los otros nodos no puedo acceder fisicamente a la zona local. El /zone/filesrvr de zbox1 y el /zone/filesrvr de zbox2 no son el mismo.
clzc:filesrvr> set zonepath=/zone/filesrvr
Agrego las IP de servicio, que serán flotantes entre las zonas. Esta IP es común a ambas zonas
clzc:filesrvr> add net
clzc:filesrvr:net> set address=192.168.1.35
clzc:filesrvr:net> end
Ahora agrego cada uno de los nodos (zonas) a este cluster de zonas:
clzc:filesrvr> add node
Especifico el nodo físico donde estará este nodo (zona) del cluster:
clzc:filesrvr:node> set physical-host=zbox1
Especifico el hostname de la zona (el nombre de la zona sera filesrvr en ambos nodos, pero el hostname es diferente en cada uno de los nodos, y cada uno tiene su IP).
clzc:filesrvr:node> set hostname=filesrvr1
Agrego la configuración de red de este nodo (IP que corresponde con el hostname de esta zona exclusivamente, y que debe ser diferente de las otras zonas). Se trata de una IP tipo shared (comparte interfaz con la zona global), en este caso se aplican los mismos conceptos que en zonecfg.
clzc:filesrvr:node> add net
clzc:filesrvr:node:net> set address=192.168.1.33
clzc:filesrvr:node:net> set physical=e1000g18000
clzc:filesrvr:node:net> end
clzc:filesrvr:node> end
Y luego agrego el otro nodo (zona)
clzc:filesrvr> add node
clzc:filesrvr:node> set physical-host=zbox2
clzc:filesrvr:node> set hostname=filesrvr2
clzc:filesrvr:node> add net
clzc:filesrvr:node:net> set address=192.168.1.34
clzc:filesrvr:node:net> set physical=e1000g18000
clzc:filesrvr:node:net> end
clzc:filesrvr:node> end
Completo la configuración:
clzc:filesrvr> verify
clzc:filesrvr> commit
clzc:filesrvr> exit
zbox1#
Una vez hecho esto tenemos las zonas configuradas en cada uno de los nodos, pero como están en cluster, utilizamos el comando clzonecluster para administrarlas (en vez de zoneadm). Por lo que ahora toca instalar y arrancar:
zbox1# clzonecluster install filesrvr
Waiting for zone boot commands to complete on all the nodes of the zone cluster "filesrvr"...
zbox1# clzonecluster boot filesrvr
Waiting for zone boot commands to complete on all the nodes of the zone cluster "filesrvr"...
zbox1# zlogin -C filesrvr
... Responder las preguntas del sysidtool, recordando que el hostname de este nodo es filesrvr1 (a pesar de que se sugiera filesrvr como hostname)
...
~.
zbox2# zlogin -C filesrvr
... Responder las preguntas del sysidtool, recordando que el hostname de este nodo es filesrvr2 (a pesar de que se sugiera filesrvr como hostname)
...
~.
Si se van a compartir datos entre las zonas (HA-ZFS) se siguen los siguientes pasos:
Crear el Volumen en la SAN, luego reconfigurar el cluster para que se vea en ambos nodos:
zbox1# devfsadm
zbox1# scdidadm -r
zbox2# devfsadm
zbox2# scdidadm -r
Vemos cual es el did que corresponde con el volumen creado:
zbox1# scdidadm -L
1 zbox2:/dev/rdsk/c0t0d0 /dev/did/rdsk/d1
2 zbox2:/dev/rdsk/c3t600A0B800021B02B000045DF4C88553Ad0 /dev/did/rdsk/d2
2 zbox1:/dev/rdsk/c4t600A0B800021B02B000045DF4C88553Ad0 /dev/did/rdsk/d2
3 zbox1:/dev/rdsk/c0t0d0 /dev/did/rdsk/d3
4 zbox2:/dev/rdsk/c3t600A0B800021A3D4000055594C8D6141d0 /dev/did/rdsk/d4
4 zbox1:/dev/rdsk/c4t600A0B800021A3D4000055594C8D6141d0 /dev/did/rdsk/d4
En este caso es el d4, así que creamos un pool (en este caso llamado filesrvr) en ese disco:
zbox1# zpool create filesrvr /dev/did/dsk/d4
Creamos los zfs que hagan falta, recordando que la administración de los volúmenes se realiza desde la zona global, no desde las zonas.
zbox1# zfs create filesrvr/export
zbox1# zfs create filesrvr/export/pas
Cuando terminamos exportamos el pool para que lo tomen las zonas:
zbox1# zpool export filesrvr
Luego se configura el cluster de zonas para que accedan al pool, una vez hecho esto, el pool se monta en el root de la zona. El nombre del dataset es el pool (no el zfs)
zbox1# clzonecluster configure filesrvr
clzc:filesrvr> add dataset
clzc:filesrvr:dataset> set name=filesrvr
clzc:filesrvr:dataset> end
clzc:filesrvr> verify
clzc:filesrvr> commit
clzc:filesrvr> exit
zbox1#
Luego se reinicia el cluster de zonas:
zbox1# clzonecluster reboot filesrvr
A partir de aqui el cluster de zonas se comporta de forma muy similar un cluster normal. Por lo que utilizo los mismos comandos para crear recursos, tanto si los voy a crear en el cluster global, como si los voy a crear en los clusters de zonas.
Crear los recursos según el manual del servicio al que se desea poner en HA pero teniendo en cuenta que para crear el recurso en el cluster de la zona en vez de la zona global hay dos opciones, o bién se realiza desde la zona global, especificando -Z filesrvr como opción en todos los comandos, o se hace desde alguna de las zonas, como si se tratara del cluster de la zona global:
Ejemplo desde la zona global:
zbox1# clresourcegroup create -Z filesrvr -p Pathprefix=/export/pas/config -p Nodelist=filesrvr1,filesrvr2 filesrvr-rg
zbox1# clreslogicalhostname create -Z filesrvr -g filesrvr-rg -h 192.168.1.35 filesrvr-ip-rs
zbox1# clresourcetype register -Z filesrvr HAStoragePlus
zbox1# clresource create -g filesrvr-rg -t SUNW.HAStoragePlus -p Zpools=filesrvr -p ZpoolsSearchDir=/dev/did/dsk -Z filesrvr filesrvr-data-rs
zbox1# clresourcegroup online -M -Z filesrvr filesrvr-rg
Ejemplo desde la zona filesrvr:
filesrvr1# clresourcegroup create -n filesrvr1,filesrvr2 filesrvr-rg
filesrvr1# clreslogicalhostname create -g filesrvr-rg -h 192.168.1.35 filesrvr-ip-rs
filesrvr1# clresourcetype register HAStoragePlus
filesrvr1# clresource create -g filesrvr-rg -t SUNW.HAStoragePlus -p Zpools=filesrvr -p ZpoolsSearchDir=/dev/did/dsk filesrvr-data-rs
filesrvr1# clresourcegroup online -M filesrvr-rg