El incidente descrito no es un fallo puntual, sino una limitación arquitectónica recurrente en las implementaciones de alta disponibilidad (HA) de GitHub Enterprise Server (GHES) que utilizaban Elasticsearch. La causa raíz era la incompatibilidad fundamental entre el patrón leader/follower de GHES y el comportamiento de clustering de Elasticsearch en versiones anteriores. GHES esperaba que los nodos réplica fueran de solo lectura, pero Elasticsearch podía mover shards primarios (que requieren escrituras) a estos nodos. Esto creaba un escenario de deadlock: si una réplica con un shard primario se caía, Elasticsearch no podía recuperarse hasta que la réplica se reincorporara, pero la réplica no podía arrancar hasta que Elasticsearch estuviera sano.

Las salvaguardas existentes, como los checks de salud y los intentos de 'search mirroring', fallaron porque abordaban los síntomas en lugar de la causa raíz arquitectónica. El problema no era la falta de monitoreo o corrección de estados, sino una discrepancia fundamental en los modelos de consistencia y replicación entre GHES y Elasticsearch. El diseño original de clustering de Elasticsearch, aunque ofrecía beneficios de rendimiento al manejar solicitudes de búsqueda localmente, introdujo una complejidad y fragilidad significativas en el contexto de HA de GHES.

La solución implicó una re-arquitectura significativa para alinear el comportamiento de Elasticsearch con el modelo de HA de GHES. Al adoptar Cross Cluster Replication (CCR) y tratar cada instancia de GHES como un cluster Elasticsearch de un solo nodo, se eliminó la necesidad de que Elasticsearch gestionara la consistencia de los shards primarios entre nodos primarios y réplicas de GHES. CCR permite una replicación controlada y nativa de Elasticsearch de datos ya persistidos, asegurando que los datos críticos no terminen en nodos de solo lectura de GHES en un estado inconsistente o bloqueado. Esta es una lección clave sobre la importancia de la alineación de los patrones de replicación y consistencia entre componentes de un sistema distribuido.