Hola,
ayer estuve haciendo algunas pruebas con el script de stop para verificar el comportamiento del cluster ante distintas situaciones ocasionadas por fallos dentro de este script de parada.
Estuve haciendo algunas búsquedas en google ( cluster wait stop script, application server stop script...) y no encontré una documentación clara. Aunque sólo hay que hacer caso a la teoría para sabar cómo va a reaccionar el cluster ante situaciones indeseadas provocadas por el script de parada (lo mismo aplica al script de arranque), he preferido realizar algunas pruebas para documentarlo.
Para no dejar aquí todo un log de sesión, he omitido algunas líneas esperando que sea más claro. Si no, sólo tenéis que preguntar dejando un comentario.
NOTA: Lo que se conoce como Application Server ha pasado a llamarse Application Controller Scripts en PowerHA7.1.
Entorno de test:
- dos nodos con AIX7.1 en cluster gestionado por PowerHA7.1.2.
- prueba 1: stop_script con bucle infinito + intento de takeover
- prueba 2: stop_script con último comando reportando error (touch /home/dir_no_existe/prueba)
- prueba 3: stop_script con penúltimo comando reportando error (el touch de antes) y uno final correcto (touch /home/prueba).
En resumen, PowerHA no se encarga de verificar si lo que ha hecho el script de stop está bien o mal antes de hacer un takeover (es decir, si tiene que parar una BBDD y no lo hace porque no habéis puesto el db2stop, p.ej.) , él sólo comprueba que el script termina bien (exit 0), por lo que en el caso del bucle infinito lo que ocurrirá es que el cluster no hace takeover hacia el otro nodo y hay que "meterle mano" (kill del proceso del stop_script + resolver la situación de error en que queda el cluster después de esta muerte inesperada del script). En la prueba 2, fallará porque la salida del script no es 0, al dar error el último comando y en la prueba 3, terminará bien y hará el takeover ya que, no se tiene en cuenta que no haya comandos erróneos dentro del script, sino que lo que importa es que la salida del script sea 0.
La información de la sesión de pruebas:
------ Creando y añadiendo un Application Server o Application Controller Scripts a un RG --------
1) Crear los scripts de stop/start
2) Crear el recurso Application Server o Application Controller indicando la ruta completa a estos scripts.
PowerHA6.1:
#smitty hacmp --> Initialization and Standard Configuration --> Configure Resources to Make Highly Available --> Configure Application Servers --> Add an Application Server
o
# smitty hacmp --> Extended Configuration --> Extended Resource Configuration --> HACMP Extended Resources Configuration --> Configure HACMP Applications Servers --> Add an Application Server
PowerHA7.1
# smitty sysmirror --> Cluster Applications and Resources --> Resources --> Configure User Applications (Scripts and Monitors) --> Application Controller Scripts --> Add Application Controller Scripts -->
3) Añadir el Application Server/Controller al Resource Group
PowerHA6.1:
# smitty hacmp --> Initialization and Standard Configuration --> Configure HACMP Resource Groups --> Change/Show a Resource Group --> Change/Show Resources in a Resource Group
o
# smitty hacmp --> Extended Configuration --> Extended Resource Configuration --> HACMP Extended Resource Group Configuration --> Change/Show Resources and Attributes for a Resource Group
PowerHA7.1:
# smitty sysmirror --> Cluster Applications and Resources --> Resource Groups --> Change/Show Resources and Attributes for a Resource Group
4) Sincronizar el cluster
Comprobaciones:
1) Ver que el App. Server está activo
# clRGinfo -m
---------------------------------------------------------------------------------------------------------------------
Group Name Group State Application state Node
---------------------------------------------------------------------------------------------------------------------
RG_prueba ONLINE node01
App_Contr_Jorge ONLINE NOT MONITORED
2) Hacer un takeover para probar que los scripts hacen lo que tienen que hacer.
3) También podéis echar un vistazo al hacmp.out para ver que ha pasado con el App.Server. Hay varias cadenas que podéis buscar para centraros en el App.Server:
node_up_local_complete
start_server
stop_server
node01# grep node_up_local_complete hacmp.out | more
+RG_prueba:reconfig_resource_complete[633] node_up_local_complete
+RG_prueba:node_up_local_complete[+123] . /usr/es/sbin/cluster/events/reconfig_udresources
+RG_prueba:node_up_local_complete[+125] STATUS=0
+RG_prueba:node_up_local_complete[+140] server_acquire_lpar_resources App_Contr_Jorge
+RG_prueba:node_up_local_complete[+148] clcallev start_server App_Contr_Jorge
+RG_prueba:node_up_local_complete[+150] : exit status of start_server App_Contr_Jorge is: 0
+RG_prueba:node_up_local_complete[acquire_udresources+123] +RG_prueba:node_up_local_complete[acquire_udresources+123] getudres types_after APPLICATION
+RG_prueba:node_up_local_complete[+160] : exit status of acquire_udresources is: 0
node01# grep start_server hacmp.out | more
+RG_prueba:start_server[start_and_monitor_server+12] dspmsg scripts.cat 99999 Checking whether App_Contr_Jorge is already running
Checking whether App_Contr_Jorge is already running...
+RG_prueba:start_server[start_and_monitor_server+33] dspmsg scripts.cat 99999 Application monitor(s) indicate that App_Contr_Jorge is not active. Continuing with application startup.\n
Application monitor(s) indicate that App_Contr_Jorge is not active. Continuing with application startup.
+RG_prueba:start_server[start_and_monitor_server+59] dspmsg scripts.cat 99999 Running application controller start script for App_Contr_Jorge in the background at Wed Apr 2 11:36:07 CEST 2014.\n
Running application controller start script for App_Contr_Jorge in the background at Wed Apr 2 11:36:07 CEST 2014.
Apr 2 11:36:07 EVENT COMPLETED: start_server App_Contr_Jorge 0
------------ Prueba 1: movimiento de RG con script de stop con bucle infinito --------------
node01# clmgr move rg RG_prueba NODE=node02
Attempting to move resource group RG_prueba to node node02.
Waiting for the cluster to process the resource group movement request....
Waiting for the cluster to stabilize.................... ................... ..........
(se queda aquí: bucle)
(TRAS KILL DEL SCRIPT DE STOP)
ERROR: Event processing has failed for the requested resource
group movement. The cluster is unstable and requires manual intervention
to continue processing.
node01# more /var/hacmp/log/hacmp.out
+RG_prueba:stop_server[+124] /tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+124] ODMDIR=/etc/objrepos
(ESPERANDO...)
(TRAS KILL DEL SCRIPT DE STOP)
/usr/es/sbin/cluster/events/stop_server[124]: 10092872 Terminated
+RG_prueba:stop_server[+126] [ 143 -ne 0 ]
+RG_prueba:stop_server[+128] cl_log 312 Failed to stop App_Contr_Jorge. App_Contr_Jorge
+RG_prueba:cl_log[+47] [[ high == high ]]
+RG_prueba:cl_log[+47] version=1.11 $Source: 61haes_r711 43haes/usr/sbin/cluster/events/utils/cl_log.sh 1$
+RG_prueba:cl_log[+48] +RG_datos_pro:cl_log[+48] basename /usr/es/sbin/cluster/events/utils/cl_log
PROGNAME=cl_log
+RG_prueba:cl_log[+49] [[ high == high ]]
+RG_prueba:cl_log[+91] SYSLOG_FILE=/var/hacmp/adm/cluster.log
***************************
Apr 2 2014 12:14:35 !!!!!!!!!! ERROR !!!!!!!!!!
***************************
Apr 2 2014 12:14:35 Failed to stop App_Contr_Jorge.
+RG_prueba:stop_server[+129] STATUS=1
+RG_prueba:stop_server[+131] cl_RMupdate resource_error App_Contr_Jorge stop_server
Reference string: Wed.Apr.2.12:14:35.CEST.2014.process_resources.All_servers.RG_datos_pro.ref
+RG_prueba:process_resources[258] (( 1 != 0 ))
+RG_prueba:process_resources[261] : If this failed while stopping an application, manual intervention is required.
+RG_prueba:process_resources[263] [[ stop_server == stop_server ]]
+RG_prueba:process_resources[265] cl_log 650 'process_resources: Failure occurred while processing Resource Group RG_prueba. Manual intervention required.' process_resources RG_prueba
node02# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba RELEASING node01
OFFLINE node02
(TRAS KILL DEL SCRIPT DE STOP)
node02# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba ERROR node01
OFFLINE node02
- Corregimos la situación desde el nodo 1:
1) Corregir el script de parada.
2) Recuperar el cluster de la situación de error.
# smitty hacmp --> Problem Determination Tools --> Recover From PowerHA SystemMirror Script Failure
node01# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba OFFLINE node01
ACQUIRING node02
node01# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba OFFLINE node01
ONLINE node02
NOTA: Sin corregir el script de parada se puede ejecutar el "Recover" y el RG se moverá al otro nodo.
--------------------- Prueba 2: script de stop con un último comando que da error ----------------
- Los pasos son iguales, así que sólo muestro el hacmp.out:
[...]
STOP=/tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+107] +RG_prueba:stop_server[+107] cut -d -f1
+RG_prueba:stop_server[+107] echo /tmp/jorge/stop_script.ksh
STOP_SCRIPT=/tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+109] PATTERN=node02 App_Contr_Jorge
+RG_prueba:stop_server[+109] [[ -n ]]
+RG_prueba:stop_server[+109] [[ -z ]]
+RG_prueba:stop_server[+109] [[ -x /tmp/jorge/stop_script.ksh ]]
+RG_prueba:stop_server[+119] [ REAL = EMUL ]
+RG_prueba:stop_server[+124] /tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+124] ODMDIR=/etc/objrepos
touch: /tmp/jorge/prueba/error.err cannot create
+RG_prueba:stop_server[+126] [ 1 -ne 0 ]
+RG_prueba:stop_server[+128] cl_log 312 Failed to stop App_Contr_Jorge. App_Contr_Jorge
+RG_pruebao:cl_log[+47] [[ high == high ]]
+RG_pruebao:cl_log[+47] version=1.11 $Source: 61haes_r711 43haes/usr/sbin/cluster/events/utils/cl_log.sh 1$
+RG_prueba:cl_log[+48] +RG_datos_pro:cl_log[+48] basename /usr/es/sbin/cluster/events/utils/cl_log
PROGNAME=cl_log
+RG_prueba:cl_log[+49] [[ high == high ]]
+RG_prueba:cl_log[+91] SYSLOG_FILE=/var/hacmp/adm/cluster.log
***************************
Apr 2 2014 15:28:44 !!!!!!!!!! ERROR !!!!!!!!!!
***************************
Apr 2 2014 15:28:44 Failed to stop App_Contr_Jorge.
+RG_prueba:stop_server[+129] STATUS=1
+RG_prueba:stop_server[+131] cl_RMupdate resource_error App_Contr_Jorge stop_server
node02# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba OFFLINE node01
ERROR node02
-------------- Prueba 3: script de stop con touch "malo" más último touch bueno ---------------
- Los pasos son iguales, así que sólo muestro el hacmp.out:
[..]
STOP_SCRIPT=/tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+109] PATTERN=node01 App_Contr_Jorge
+RG_prueba:stop_server[+109] [[ -n ]]
+RG_prueba:stop_server[+109] [[ -z ]]
+RG_prueba:stop_server[+109] [[ -x /tmp/jorge/stop_script.ksh ]]
+RG_pruebao:stop_server[+119] [ REAL = EMUL ]
+RG_prueba:stop_server[+124] /tmp/jorge/stop_script.ksh
+RG_prueba:stop_server[+124] ODMDIR=/etc/objrepos
touch: /tmp/jorge/prueba/error.err cannot create
+RG_prueba:stop_server[+126] [ 0 -ne 0 ]
+RG_prueba:stop_server[+154] ALLNOERRSERV=All_nonerror_servers
+RG_prueba:stop_server[+155] [ REAL = EMUL ]
+RG_prueba:stop_server[+160] cl_RMupdate resource_down All_nonerror_servers stop_server
2014-04-02T15:46:09.890087
2014-04-02T15:46:09.897215
Reference string: Wed.Apr.2.15:46:09.CEST.2014.stop_server.All_nonerror_servers.RG_datos_pro.ref
+RG_prueba:stop_server[+163] exit 0
Apr 2 15:46:09 EVENT COMPLETED: stop_server App_Contr_Jorge 0
node02# clRGinfo
-----------------------------------------------------------------------------
Group Name Group State Node
-----------------------------------------------------------------------------
RG_prueba OFFLINE node01
ONLINE node02
Un saludo.