Uso de Consul como proveedor de pertenencia

Consul es una plataforma de detección de servicios distribuida, de alta disponibilidad y compatible con centros de datos que incluye un registro de servicio simple, comprobación de estado, detección de errores y almacenamiento de clave-valor. Se basa en la premisa de que cada nodo del centro de datos ejecuta un agente de Consul que actúa como servidor o cliente. Cada agente se comunica mediante un protocolo gossip escalable.

Aquí encontrará una visión general detallada de Consul, incluidas las comparaciones con soluciones similares.

Consul está escrito en Go y es de código abierto; las descargas compiladas están disponibles para macOS X, FreeBSD, Linux, Solaris y Windows

¿Por qué elegir Consul?

Como proveedor de pertenencia de Orleans, Consul es una buena opción cuando necesita proporcionar una solución local que no requiera que sus clientes potenciales tengan infraestructura existente y un proveedor de TI cooperativo. Consul es un archivo ejecutable único ligero, no tiene dependencias y, como tal, se puede integrar fácilmente en la solución de middleware. Cuando Consul es su solución para detectar, comprobar y mantener sus microservicios, tiene sentido integrarla completamente con la pertenencia de Orleans por motivos de simplicidad y facilidad de funcionamiento. También existe una tabla de pertenencia en Consul (también conocida como " Orleans Custom System Store"), que se integra completamente con la administración de clústeres de Orleans.

Configurar Consul

Hay una amplia documentación disponible sobre Consul.io sobre cómo configurar un clúster de Consul estable y no tiene sentido repetirlo aquí. Sin embargo, para su comodidad, incluimos esta guía para que pueda ejecutar rápidamente Orleans con un agente de Consul independiente.

  1. Cree una carpeta para instalar Consul en (por ejemplo , C:\Consul).

  2. Cree una subcarpeta: C:\Consul\Data (Consul no crea este directorio si no existe).

  3. Descarga y descomprime Consul.exe en C:\Consul.

  4. Abre una ventana del símbolo de C:\Consul y ejecuta el siguiente comando:

    ./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
    

    En el comando anterior:

    • agent: indica a Consul que ejecute el proceso del agente que hospeda los servicios. Sin este modificador, el proceso de Consul intenta usar RPC para configurar un agente en ejecución.
    • -server: define el agente como un servidor y no un cliente (un cliente Consul es un agente que hospeda todos los servicios y datos, pero no tiene derechos de voto para decidir y no puede convertirse en el líder del clúster.
    • -bootstrap: el primer nodo (y solo el primero) de un clúster debe arrancarse para que asuma el liderazgo del clúster.
    • -data-dir [path]: especifica la ruta de acceso donde se almacenan todos los datos de Consul, incluida la tabla de pertenencia al clúster.
    • -client='0.0.0.0': comunica a Consul en qué dirección IP debe abrirse el servicio.

    Hay muchos otros parámetros y la opción de usar un archivo de configuración JSON. Para obtener una lista completa de las opciones, vea la documentación de Consul.

  5. Para comprobar que Consul se ejecuta y está listo para aceptar solicitudes de pertenencia de Orleans, abra el punto de conexión de servicios en el explorador en http://localhost:8500/v1/catalog/services. Cuando funciona correctamente, el explorador muestra el siguiente código JSON:

    {
        "consul": []
    }
    

Configuración de Orleans

Para configurar Orleans para usar Consul como proveedor de pertenencia, el proyecto de silo deberá hacer referencia al paquete NuGet Microsoft.Orleans.Clustering.Consul. Una vez hecho esto, puede configurar el proveedor de pertenencia en el archivo Program.cs del silo como se indica a continuación:

IHostBuilder builder = Host.CreateDefaultBuilder(args)
    .UseOrleans(silo =>
    {
        silo.UseConsulSiloClustering(options =>
        {
            // The address of the Consul server
            var address = new Uri("http://localhost:8500");
            options.ConfigureConsulClient(address);
        });
    })
    .UseConsoleLifetime();

using IHost host = builder.Build();
host.Run();

El código anterior:

Para configurar el cliente, haga referencia al mismo paquete NuGet y llame al método de extensión UseConsulClientClustering.

Client SDK

Si le interesa usar Consul para la detección de servicios, hay SDK de cliente para los idiomas más populares.

Detalles de la implementación

El proveedor de tablas de pertenencia usa la funcionalidad de almacén clave-valor de Consul con operaciones check-and-set (CAS). Cuando se inicia cada Silo, registra dos entradas de clave-valor, una que contiene los detalles del Silo y otra que contiene la última vez que el Silo informó de que estaba activo. Este último hace referencia a las entradas de diagnóstico "Estoy activo" y no a los latidos de detección de errores, que se envían directamente entre los silos y no se escriben en la tabla. Todas las escrituras en la tabla se realizan con CAS para proporcionar control de simultaneidad, como exige el protocolo de administración de clústeres de Orleans.

Una vez que Silo esté en ejecución, puede ver estas entradas en el explorador web en http://localhost:8500/v1/kv/?keys&pretty, que muestra algo parecido a lo siguiente:

[
    "orleans/default/192.168.1.11:11111@43165319",
    "orleans/default/192.168.1.11:11111@43165319/iamalive",
    "orleans/default/version"
]

Todas las claves tienen el prefijo orleans, que está codificado de forma rígida en el proveedor y está pensado para evitar la colisión de espacios de claves con otros usuarios de Consul. Puede usar cualquiera de estas claves para recuperar información adicional sobre cada una de estas claves y se puede leer anexando su nombre de clave (sin comillas) a la raíz de Consul KV en http://localhost:8500/v1/kv/. Al hacerlo, se presenta el siguiente archivo JSON:

[
    {
        "LockIndex": 0,
        "Key": "orleans/default/192.168.1.11:11111@43165319",
        "Flags": 0,
        "Value": "[BASE64 UTF8 Encoded String]",
        "CreateIndex": 321,
        "ModifyIndex": 322
    }
]

La descodificación de la cadena Value codificada en Base64 UTF-8 proporciona los datos reales de la pertenencia a Orleans:

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]

{
    "Hostname": "[YOUR_MACHINE_NAME]",
    "ProxyPort": 30000,
    "StartTime": "2023-05-15T14:22:00.004977Z",
    "Status": 3,
    "SiloName": "Silo_fcad0",
    "SuspectingSilos": []
}

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive

"2023-05-15T14:27:01.1832828Z"

Cuando los clientes se conectan, leen los KV de todos los silos del clúster en un HTTP GET mediante el URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse.

Limitaciones

Hay algunas limitaciones que debe tener en cuenta al usar Consul como proveedor de pertenencia.

Orleans protocolo de adhesión ampliado (versión de la tabla y ETag)

Consul KV actualmente no admite actualizaciones atómicas. Por lo tanto, el proveedor de pertenencia Consul de Orleans solo implementa el protocolo de pertenencia básica de Orleans, como se describe en Administración de clústeres en Orleans, y no admite el protocolo de pertenencia extendida. Este protocolo extendido se introdujo como una validación de conectividad de silo adicional, pero no esencial, y como base para la funcionalidad que aún no se ha implementado.

Varios centros de datos

Los pares clave-valor de Consul no se replican actualmente entre los centros de datos de Consul. Hay un proyecto independiente para abordar este trabajo de replicación, pero aún no se ha demostrado que sea compatible con Orleans.

Cuando se ejecuta en Windows

Cuando Consul se inicia en Windows, registra el mensaje siguiente:

==> WARNING: Windows is not recommended as a Consul server. Do not use in production.

Este mensaje de advertencia se muestra debido a la falta de foco en las pruebas cuando se ejecuta en un entorno de Windows y no debido a problemas conocidos reales. Lee la discusión antes de decidir si Consul es la opción adecuada para ti.

Posibles mejoras futuras

  1. Demostrar que el proyecto de replicación KV de Consul puede admitir un clúster de Orleans en un entorno WAN entre varios centros de datos de Consul.
  2. Implementar la tabla reminder en Consul.
  3. Implementar el Protocolo de pertenencia extendida. El equipo detrás de Consul planea implementar operaciones atómicas, una vez que esta funcionalidad esté disponible, será posible quitar las limitaciones del proveedor.