0

Microsoft Orleans #19: Escalabilidad y Alta Disponibilidad

En esta clase aprenderemos cómo Orleans escala en entornos distribuidos y cómo configurar alta disponibilidad para garantizar resiliencia del sistema.

Objetivos de la Clase

  • Comprender cómo Orleans maneja la escalabilidad en un clúster distribuido.
  • Configurar balanceo de carga y distribución de Granos entre múltiples nodos.
  • Implementar alta disponibilidad para evitar la pérdida de datos en caso de fallos.
  • Desplegar Orleans en un entorno altamente disponible y escalable.

¿Cómo Orleans Escala en un Clúster Distribuido?

Orleans está diseñado para escalar horizontalmente, lo que significa que puede agregar más nodos para manejar más carga sin afectar el rendimiento.

Estrategias de Escalabilidad en Orleans

  1. Uso de múltiples nodos Orleans (Siloses)
    • Se pueden agregar más Siloses para manejar más Granos.
  2. Balanceo de carga entre nodos
    • Orleans distribuye automáticamente los Granos entre los nodos activos.
  3. Configuración de almacenamiento persistente
    • Evita la pérdida de estado cuando un nodo Orleans falla.
  4. Uso de Stateless Workers
    • Permite manejar cargas masivas sin necesidad de estado.

Configurar un Clúster Orleans con Múltiples Nodos

Por defecto, Orleans usa clustering en localhost, pero para escalar se recomienda usar una base de datos o Consul como gestor de clústeres.

Configurar un Clúster Orleans con SQL Server

Si deseas varios nodos Orleans compartiendo el mismo estado, se puede usar SQL Server como almacenamiento de clúster.

Edita Program.cs en OrleansDemo y configura SQL Server:

using Orleans.Hosting;

var builder = Host.CreateDefaultBuilder()
    .UseOrleans(siloBuilder =>
    {
        siloBuilder.UseAdoNetClustering(options =>
        {
            options.Invariant = "System.Data.SqlClient";
            options.ConnectionString = "Server=localhost;Database=OrleansCluster;User Id=sa;Password=YourPassword;";
        });
    })
    .Build();

await builder.RunAsync();

Esto permite que varios nodos Orleans compartan el mismo clúster y se comuniquen entre sí.

Configurar Balanceo de Carga con Kubernetes

Si Orleans se ejecuta en Kubernetes, se recomienda usar un LoadBalancer para distribuir las solicitudes entre los nodos.

Crea un archivo orleans-deployment.yaml con la configuración del clúster:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: orleans-silo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: orleans
  template:
    metadata:
      labels:
        app: orleans
    spec:
      containers:
      - name: orleans
        image: orleans-demo
        ports:
        - containerPort: 11111

Esto iniciará 3 nodos Orleans automáticamente para balancear la carga.

Configurar una Base de Datos para Persistencia

Si un nodo Orleans falla, los Granos pueden perder su estado a menos que usen almacenamiento persistente.

Para evitar esto, configura SQL Server como almacenamiento de estado:

siloBuilder.AddAdoNetGrainStorage("orleansStore", options =>
{
    options.Invariant = "System.Data.SqlClient";
    options.ConnectionString = "Server=localhost;Database=OrleansStorage;User Id=sa;Password=YourPassword;";
});

Esto garantiza que el estado de los Granos se mantenga incluso si un nodo Orleans se reinicia.

Probar la Escalabilidad y Alta Disponibilidad

Ejecutar el Clúster Orleans en Múltiples Nodos

Inicia varios Siloses ejecutando:

dotnet run --project OrleansDemo -- --port=11111
dotnet run --project OrleansDemo -- --port=11112
dotnet run --project OrleansDemo -- --port=11113

Cada Silo Orleans se conectará al clúster compartido y Orleans distribuirá la carga automáticamente.

Verificar la Distribución de Carga

Llama repetidamente a un Grano desde el Cliente Orleans y verifica en qué nodo se activa:

var cliente = new ClientBuilder()
    .UseAdoNetClustering(options =>
    {
        options.Invariant = "System.Data.SqlClient";
        options.ConnectionString = "Server=localhost;Database=OrleansCluster;User Id=sa;Password=YourPassword;";
    })
    .Build();

await cliente.Connect();

var grain = cliente.GetGrain<IMiGrain>("test");
await grain.RealizarOperacion();

Si la configuración es correcta, el Grano se ejecutará en distintos nodos según la carga del clúster.

Cuestionario de Autoevaluación

  1. ¿Cómo Orleans maneja la distribución de Granos entre múltiples nodos?
  2. ¿Qué sucede si un nodo Orleans falla? ¿Cómo evitar la pérdida de datos?
  3. ¿Cómo se puede balancear la carga en un clúster Orleans?
  4. ¿Por qué es recomendable usar almacenamiento persistente en un clúster Orleans?
  5. ¿Cómo configurar Orleans en Kubernetes para alta disponibilidad?

Resumen de la Clase

  • Orleans escala horizontalmente agregando más Siloses al clúster.
  • Orleans distribuye Granos automáticamente entre los nodos activos.
  • El almacenamiento persistente evita la pérdida de estado en caso de fallos.
  • Kubernetes permite balancear la carga y garantizar alta disponibilidad.

Próxima Clase: Caso Práctico – Construcción de un Sistema Distribuido

En la siguiente clase, aprenderemos cómo proteger Orleans con autenticación, autorización y cifrado de datos, asegurando la seguridad del sistema.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *