[redis]conmutación por error de clúster-clúster de redis
CLUSTER_NODE_PFAIL: cuando el nodo actual piensa que un nodo está fuera de línea, cambiará el estado del nodo a CLUSTER_NODE_PFAIL. Debido a que puede haber un error de cálculo, la decisión de marcar el nodo como fuera de línea debe basarse en otros nodos del clúster. CLUSTER_NODE_PFAIL puede entenderse como sospechoso de estar fuera de línea, similar al subjetivo fuera de línea en el clúster Sentinel.
CLUSTER_NODE_FAIL: Más de la mitad de los nodos del clúster están marcados como desconectados. En este momento, configure el nodo en CLUSTER_NODE_FAIL para marcar el nodo como fuera de línea, lo que indica que el nodo está realmente fuera de línea, similar al objetivo fuera de línea del clúster Sentinel.
Cuando la tarea programada del clúster atraviesa los nodos del clúster para su inspección, cada nodo atravesado se marca como nodo y el nodo actual se marca como mi. El contenido de la inspección incluye principalmente los siguientes aspectos:
1. Determinar el número de nodos maestros aislados
Si el nodo actual es un nodo esclavo, el nodo atravesado es el nodo maestro, y Si el nodo no está fuera de línea, se determinará el número de nodos aislados. Cuando se cumplen las siguientes tres condiciones, el nodo se considera un nodo huérfano y el número de nodos huérfanos se incrementará en 1:
En segundo lugar, verifique la conexión
Este paso es principalmente comprueba la conexión con el nodo ¿Es normal? Puede ser que el nodo esté en un estado normal pero haya algún problema con la conexión. La conexión debe liberarse en este momento y se volverá a conectar la próxima vez que se ejecute la tarea programada. Para liberar la conexión, se deben cumplir las siguientes condiciones al mismo tiempo:
3. Sospecha de juicio fuera de línea
Ping_delay registra el momento en que el nodo envía un mensaje Ping dentro del período actual. distancia de tiempo y data_delay registra la última hora. El tiempo para que el nodo interno envíe un mensaje al nodo actual. Elija el más grande de PING_delay y data_delay como tiempo de retraso.
Si el tiempo de retraso es mayor que el tiempo de espera, determine si el nodo ya está en el estado CLUSTER_NODE_PFAIL o CLUSTER_NODE_FAIL; de lo contrario, el estado del nodo se establecerá en CLUSTER_NODE_PFAIL y el nodo se considerará fuera de línea.
Una vez completada la verificación anterior, se juzgará si el nodo actual es un nodo esclavo. Si no está en el estado cluster_module_flag_no_failover, se llamará a clusterHandleSlaveFailover para manejar la conmutación por error. Sin embargo, es importante tener en cuenta que en este punto el nodo solo se coloca en un estado fuera de línea sospechoso, que no califica para conmutación por error. Debe esperar a que el nodo se establezca en el estado FAIL fuera de línea, luego ejecutar la tarea de sincronización del clúster nuevamente e ingresar a la función clusterHandleSlaveFailover para comenzar a procesar la conmutación por error.
Cuando el nodo actual piensa que un nodo está fuera de línea, establecerá el estado del nodo en cluster_node_pfailure, estado sospechoso fuera de línea. Cuando se intercambia información periódicamente con los nodos del clúster, es decir, cuando se envía un mensaje PING, el estado fuera de línea del nodo se registra en el cuerpo del mensaje.
Cuando otros nodos procesan el mensaje PING recibido, el nodo que considera que el nodo está fuera de línea se agregará a la lista vinculada fuera de línea del nodo FAIL_reports y se llamará a la función markNodeAsFailingIfNeeded para determinar si el nodo debe colocarse en un estado de falla fuera de línea:
markNodeAsFailingIfNeeded
MarkNodeAsFailingIfNeeded se utiliza para determinar si el nodo debe marcarse como fallido:
clusterHandleSlaveFailover
Como se puede ver en la arriba, el nodo que está objetivamente fuera de línea se establecerá en el estado CLUSTER_NODE_FAIL. La próxima vez que ejecute una tarea programada del clúster, puede verificar si es necesario realizar una conmutación por error según el estado en la función de procesamiento de conmutación por error clusterHandleSlaveFailover.
Pero antes de ver la función clusterHandleSlaveFailover, echemos un vistazo a las definiciones de variables relacionadas con la elección y la conmutación por error en clusterState:
Algunas variables en la función clusterHandleSlaveFailover
Data_age: registra la última vez que el nodo esclavo se sincronizó con el nodo maestro. Si está conectado al nodo principal, reste la hora de la última interacción con el nodo principal de la hora actual; de lo contrario, reste la hora en que se interrumpió la replicación maestro-esclavo con el nodo principal de la hora actual.
Auth_age: la hora actual menos la hora en que se inició la elección, es decir, cuánto tiempo ha pasado desde que se inició la elección. Se utiliza para determinar si la elección ha expirado.
Necesario _ quorum: el número de quórum, que es la mitad del número de nodos en el clúster más 1.
Auth_timeout: Esperando el tiempo de espera de la votación.
Auth_retry_time: el tiempo de espera para la votación de reelección, es decir, el tiempo de reintento.
1. Verificación de la situación de conmutación por error
Primero, realice algunas comprobaciones de condiciones para determinar si la conmutación por error es necesaria. Si ocurre una de las siguientes situaciones, esta función saltará y el proceso de conmutación por error finalizará:
2. Verificación del progreso de la copia maestro-esclavo
Cluster_slave_validity_factor establece la replicación máxima maestro-esclavo. tiempo de retraso para el factor de conmutación por error. Si no es 0, debe verificar si el tiempo de retardo de replicación maestro-esclavo cumple con los requisitos.
Si el tiempo de retardo de replicación maestro-esclavo data_age es mayor que el período para que mater envíe mensajes PING al tiempo de espera del nodo esclavo * factor de tiempo de retardo de replicación maestro-esclavo de conmutación por error, y la conmutación por error no se realiza manualmente, significa que el retraso de replicación maestro-esclavo es demasiado grande para finalizar la conmutación por error.
En tercer lugar, ¿es necesario reiniciar las elecciones?
Si el tiempo desde la última elección es mayor que el tiempo de reintento del tiempo de espera, significa que se puede reiniciar la votación.
Cuarto, posponer las elecciones.
Verbo (abreviatura de verbo) inicia una votación
Si se cumple la condición de falla de ejecución, el nodo esclavo necesita transmitir un mensaje a otros nodos en el clúster para iniciar una votación. pero sólo el nodo maestro tiene derecho a voto. Failover_auth_sent es 0, lo que indica que la votación aún no se ha iniciado y la votación comienza en este momento:
El verbo intransitivo realiza conmutación por error
Cuando un nodo obtiene el voto de la mayoría de los nodos en En el clúster, es posible la conmutación por error, lo cual se analiza en un capítulo posterior.
ClusterGetSlaveRank se utiliza para calcular el nivel del nodo actual y atravesar todos los nodos esclavos del nodo maestro. De acuerdo con el progreso de la replicación maestro-esclavo, cuanto mayor sea el valor de repl_offset, más datos replicará el nodo maestro, por lo que cuanto mayor sea el nivel, menor será el valor de clasificación correspondiente.
Al iniciar una elección, el nodo esclavo utiliza el valor de clasificación como tiempo de retraso.
Cuanto menor sea el valor, menor será el tiempo de retraso, lo que significa mayor prioridad electoral.
Cuando el nodo esclavo piensa que el nodo maestro ha fallado y necesita iniciar una votación para reelegir al nodo maestro, transmite el mensaje Cluster MSG _ Type _ Failover _ auth _ Request en el cluster. El procesamiento correspondiente está en la función clusterProcessPacket, que llamará a la función clusterendFailover authifNeeded para votar:
clusterSendFailoverAuthIfNeeded
La función clusterendfailoverauthifneeded se utiliza para votar. La lógica de procesamiento es la siguiente: <. /p>
Las condiciones anteriores están verificadas, lo que significa que el nodo actual puede votar por el nodo que envió la solicitud. En este momento, se actualiza lastVoteEpoch, registra la última época de votación (ronda), el nodo de tiempo de votación->slave of-gt;Voted_time y luego responde al nodo que inició la solicitud con un mensaje msg_type_failover_auth_ack del clúster.
El clúster de mensajes de respuesta msg_type_failover_auth_ack desde el nodo maestro al nodo que inició la solicitud de votación también está en la función de procesamiento de mensajes clusterProcessPacket, que verifica el nodo que envió el mensaje de respuesta:
Cuando las tres condiciones anteriores se cumplen al mismo tiempo, significa que el remitente ha votado por el nodo actual y se actualiza el número de votos recibidos por el registro del nodo actual. failover_auth_count aumenta a 1. En este momento, es posible obtener los votos de la mayoría de los nodos. Primero, llame a clusterDoBeforeSleep para establecer un indicador CLUSTER_TODO_HANDLE_FAILOVER. En el evento de tiempo de ejecución periódica, se llamará al estado de juicio para decidir si se realiza la conmutación por error.
Después de recibir el voto del nodo, se agregará el indicador CLUSTER_TODO_HANDLE_FAILOVER. A continuación, veamos cómo manejar el estado CLUSTER_TODO_HANDLE_FAILOVER.
En la función beforeSleep (en el archivo server.c), si se inicia el clúster, se llamará a la función clusterBeforeSleep, que contiene el procesamiento del estado CLUSTER_TODO_HANDLE_FAILOVER:
En el bucle de eventos de Redis. La función beforeSleep se llama en el método aeMain. Para obtener más información, consulte el artículo de análisis del código fuente del marco basado en eventos.
Clúster antes de dormir
En la función clusterBeforeSleep, si el nodo está marcado como CLUSTER_TODO_HANDLE_FAILOVER, se llamará a la función clusterHandleSlaveFailover para su procesamiento:
Hemos visto el Función clusterHandleSlaveFailover anterior. Esta vez nos centraremos en el manejo de la conmutación por error del clúster.
Si el nodo actual obtiene la mayoría de votos, es decir, failover_auth_count (número de votos obtenidos) es mayor o igual a Needle_quorum, y el número de Needle_quorum es la mitad del número de nodos en el cluster1. , luego se puede realizar la conmutación por error. Luego llame a la función clusterfallaverreplaceyurmaster para completar la conmutación por error.
clusterFailoverReplaceYourMaster
Si más de la mitad de los votos en el clúster se reciben de este nodo, puede convertirse en el nuevo maestro y ocupar el puesto del maestro fuera de línea. El procesamiento específico está en la función clusterfallreplaceyourmaster. La lógica de procesamiento principal es la siguiente:
Resumen
.