1.6 Planning
2.2.1 Basic Virtual Network Embedding Algorithms
Supongamos un cluster formado por tres nodos: ACE, King y Queen. El recurso al que van a dar servicio es WebServer. Vamos a tener en cuenta la siguiente consideración: para ejecutar el recurso WebServer tenemos como primera preferencia el nodo ACE aunque también puede correr en el nodo King. Sin embargo en Queen no debe correr.
Conocido ya el escenario podemos definir las restricciones de localización: <constraints>
<rsc_location id="rscloc-webserver" rsc="webserver"> <rule id="rscloc-webserver-rule-1" score="200">
<expression id="rscloc-webserver-expr-1" attribute="#uname" operation="eq" value="ace"/>
</rule>
<rule id="rscloc-webserver-rule-2" score="150"> <expression id="rscloc-webserver-expr-2" attribute="#uname" operation="eq" value="king"/>
</rule>
<rule id="rscloc-webserver-rule-3" score="-100"> <expression id="rscloc-webserver-expr-3" attribute="#uname" operation="eq" value="queen"/>
</rule> </rsc_location> </constraints>
Hasta el momento, en este escenario no vamos a hacer uso de los atributos
resource_stickiness y default_resource_stickiness.
Entonces según las restricciones que se han definido, inicialmente las puntuaciones se encuentran de la siguiente manera:
Tabla 4-9. Puntuaciones iniciales
Recurso Nodo Puntuación
WebServer ACE 200
WebServer King 150
WebServer Queen -100
Como se puede ver a través de la puntuación el recurso WebServer va a comenzar en
ACE. Supongamos ahora que previamente si que teníamos definidos los atributos resource_stickiness y default_resource_stickiness con los valores 100 y -100 respectivamente.
Se muestra el <crm_config> resultante: <crm_config>
<cluster_property_set id="cib-bootstrap-options"> <attributes>
<nvpair name="default-resource-stickiness" id="default- resource-stickiness" value="100"/> <nvpair name="default-resource-failure-stickiness" id="default-resource-failure-stickiness" value="-100"/> </attributes> </cluster_property_set> </crm_config>
Con esta nueva configuración del cluster y sabiendo que el recurso comenzó a ejecutarse correctamente en ACE la puntuación sería entonces:
ACE = (puntuación_restricciones) + (resource_stickiness) + (nºfallos * (resource_failure_stickiness))
ACE = 200+100+ (0*(-100))
La puntuación quedaría finalmente:
Recurso Nodo Puntuación
WebServer ACE 300
WebServer King 150
WebServer Queen -100
Como el recurso ha arrancado correctamente en ACE el valor de resource_stickiness se suma a la puntuación o preferencia por dicho nodo.
Escenario 2
Continuando con el escenario 1, supongamos que la operación que está monitorizando el estado del recurso WebServer informa de un error (hay que tener en cuenta que un error es distinto a que el recurso no esté ejecutándose) por lo hay que recalcular de nuevo todas las puntuaciones ya que el recurso tiene que ser arrancado de nuevo:
ACE = (puntuación_restricciones) + (resource_stickiness) + (nºfallos * (resource_failure_stickiness))
ACE= 200+100+ (1*(-100))
Tabla 4-11. Puntuación tras el error
Recurso Nodo Puntuación Errores
WebServer ACE 200 1
WebServer King 150 0
WebServer Queen -100 0
Dado que se ha producido un error en el servicio WebServer, el recurso es parado para ser arrancado de nuevo. Debido a que la mayor puntuación la vuelve a tener el nodo
ACE el recurso WebServer arranca de nuevo en este mismo nodo.
Imaginemos que de nuevo se vuelve a producir un nuevo error durante la ejecución del recurso.
ACE = (puntuación_restricciones) + (resource_stickiness) + (nºfallos * (resource_failure_stickiness))
ACE = 200 + 100 + (2 * (-100))
Tabla 4-12. Puntuación tras otro nuevo error
Recurso Nodo Puntuación Errores
WebServer ACE 100 2
WebServer King 150 0
Igual que antes el recurso WebServer para, pero esta vez para arrancar selecciona el nodo King dado que tiene una mayor puntuación.
Según la definición de resource_stickiness este atributo aumenta la puntuación si el servicio arranca con éxito en el nodo. Por tanto si WebServer arranca con éxito en King se le ha de sumar el valor de resource_stickiness a la puntuación o prioridad por el nodo King, sin olvidar que a ACE ya no hay que sumárselo:
ACE = (puntuación_restricciones) + (nºfallos * (resource_failure_stickiness)) ACE = 200 + (2 * (-100))
King = (puntuación_restricciones) + (resource_stickiness) + (nºfallos * (resource_failure_stickiness))
King = 150 + 100 + (0 * (-100))
Tabla 4-13. Puntuación tras cambiar el recurso de nodo
Recurso Nodo Puntuación Errores
WebServer ACE 0 2
WebServer King 250 0
WebServer Queen -100 0
Podemos apreciar como el recurso a pesar de haberse ejecutado más veces en el nodo
ACE no le da ninguna importancia a este hecho a la hora de calcular las puntuaciones aunque
por el contrario si que tiene en cuenta las veces que ha tenido un error.
Escenario 3
Ahora volvamos al escenario 1, es decir, no ha ocurrido ningún error y el recurso acaba de arrancar con éxito en el nodo ACE.
Durante una operación de monitorización del recurso realizada por el RA de WebServer se informa que el recurso no está ejecutándose. Ello obliga a recalcular de nuevo las puntuaciones:
ACE = (puntuación_restricciones) + (nºfallos * (resource_failure_stickiness)) ACE = 200 + (1 * (-100))
Tabla 4-14. Puntuación tras no ejecutarse
Recurso Nodo Puntuación Errores
WebServer ACE 100 1
WebServer King 150 0
WebServer Queen -100 0
A destacar que resource_stickiness no se suma ya que tal y como indica su definición este atributo solo incrementa la puntuación del recurso en el nodo si el recurso ha sido
previamente arrancado con éxito en el nodo. Sin embargo, el hecho de no estar ejecutándose, sí que se considera como un error ya que resource_failure_stickiness tiene valor uno.
De nuevo, y siguiendo los mismos pasos vistos anteriormente, el recurso para, comprueba que el nodo con mayor puntuación es King y comienza a arrancar en él. Finalmente, el recurso arranca con éxito en King.
King = (puntuación_restricciones) + (resource_stickiness) + (nºfallos * (resource_failure_stickiness))
King = 150 + 100 + (0 * (-100))
Tabla 4-15. Puntuación tras arrancar con éxito
Recurso Nodo Puntuación Errores
WebServer ACE 100 1
WebServer King 250 0
WebServer Queen -100 0
A diferencia del escenario anterior, ACE no se ve esta vez modificado ya que no hay que calcular una nueva puntuación sin resource_stickiness puesto que no lo arrancó con éxito.
En definitiva que un recurso no esté arrancado se considera como un error, con la diferencia que el valor de resource_stickiness si se añadiría a la puntuación si arrancó con éxito.
3.7 Principales problemas
Uno de los principales problemas de Heartbeat, en general de los cluster de alta disponibilidad, es el SplitBrain. A continuación, en el siguiente apartado, se muestra una situación SplitBrain para posteriormente ver las distintas soluciones existentes para evitarlo.