Compartir a través de


Implementación del directorio de granos

Información general y arquitectura

El directorio de granos de Orleans es un almacén de clave-valor donde la clave es un identificador de grano y el valor es una entrada de registro que apunta a un silo activo que (potencialmente) hospeda el grano.

Aunque Orleans ofrece una implementación de directorio distribuido en memoria predeterminada (descrita en este artículo), el sistema de directorio de granos está diseñado para que se pueda conectar. Los desarrolladores pueden implementar su propio directorio implementando la interfaz IGrainDirectory y registrándola con la colección de servicios del silo. Esto permite implementaciones de directorio personalizadas que pueden usar diferentes back-end de almacenamiento o modelos de coherencia para adaptarse mejor a los requisitos específicos de la aplicación. Desde la introducción del nuevo directorio de coherencia fuerte, hay poca necesidad de implementaciones de directorios externos, pero la API permanece para la compatibilidad retroactiva y la flexibilidad. El directorio de granos se puede configurar por tipo.

Para optimizar el rendimiento, las búsquedas de directorios se almacenan en caché localmente dentro de cada silo. Esto significa que las lecturas potencialmente remotas del directorio solo son necesarias cuando falta la entrada de caché local o no es válida. Este mecanismo de almacenamiento en caché reduce la sobrecarga de red y la latencia asociadas a búsquedas de ubicaciones específicas.

Originalmente, Orleans implementó un directorio coherente finalmente estructurado como una tabla hash distribuida. Esto fue reemplazado por un directorio fuertemente coherente en Orleans v9.0, basado en la metodología de dos fases Metodología virtualmente sincrónica y también estructurado como tabla hash distribuida, pero con un equilibrio de carga mejorado a través del uso de nodos virtuales. En este artículo se describe la última implementación del directorio de granos más reciente.

Directorio de grano distribuido

El directorio de grano distribuido en Orleans ofrece una coherencia fuerte, incluso equilibrio de carga, alto rendimiento y tolerancia a errores. La implementación sigue un diseño de dos fases basado en la metodología de sincronización virtual con similitudes con Vertical Paxos.

Las particiones de directorio tienen dos modos de operación:

  1. Operación normal: las particiones procesan las solicitudes localmente sin coordinación con otros hosts.
  2. Ver cambio: Los hosts se coordinan entre sí para transferir la propiedad de los intervalos de directorio.

El directorio hace uso del sistema de pertenencia de clústeres de fuerte coherencia de Orleans, donde las configuraciones denominadas "vistas" tienen números de versión que aumentan de forma monotónica. A medida que se unen silos y dejan el clúster, se crean vistas sucesivas, lo que da lugar a cambios en la propiedad del intervalo.

Todas las operaciones de directorio incluyen la coordinación de la visualización.

  • Las solicitudes llevan el número de vista del llamador.
  • Las respuestas incluyen el número de vista de la partición.
  • Las discrepancias de números de vista activan la sincronización.
  • Las solicitudes se reintentan automáticamente al cambiar de vista.

Esto garantiza que el propietario correcto de la partición del directorio procese todas las solicitudes.

Estrategia de particiones

El directorio se particiona mediante un anillo hash coherente con intervalos que se asignan a los silos activos del clúster. Los identificadores de grano se transforman mediante un hash para encontrar el silo que posee la sección del anillo que corresponde a su hash.

Cada silo activo posee un número preconfigurado de intervalos, que tiene como valor predeterminado 30 intervalos por silo. Esto es similar al esquema usado por Amazon Dynamo y Apache Cassandra, donde se crean varios "nodos virtuales" (intervalos) para cada nodo (host).

El tamaño de una partición viene determinado por la distancia entre su hash y el hash de la siguiente partición. Es posible que un intervalo se divida entre varios silos durante un cambio de vista, lo que agrega complejidad al procedimiento de cambio de vista, ya que cada partición debe coordinarse potencialmente con varias otras particiones.

Visualización del procedimiento de cambio

Las particiones de directorio (implementadas en GrainDirectoryPartition) utilizan bloqueos de intervalos con versiones para evitar el acceso no válido a los intervalos durante los cambios de vista. Los bloqueos de intervalos se crean al cambiar de vista y se desbloquean cuando se completa el cambio de vista. Estos bloqueos son análogos a los 'wedges' usados en la metodología de sincronización virtual.

Cuando se produce un cambio de vista, una partición puede crecer o reducirse:

  • Si un nuevo silo se ha unido al clúster, las particiones existentes se pueden reducir para hacer espacio.
  • Si un silo ha dejado el clúster, las particiones restantes pueden expandirse para encargarse de los intervalos huérfanos.

Los registros de directorio deben transferirse del propietario anterior al nuevo propietario antes de que se puedan atender las solicitudes. El proceso de transferencia sigue estos pasos:

  1. El propietario anterior sella el intervalo y crea una instantánea de las entradas del directorio.
  2. El nuevo propietario solicita y aplica la instantánea.
  3. El nuevo propietario comienza a atender las solicitudes del intervalo.
  4. Se notifica al propietario anterior y se elimina la instantánea.

Proceso de recuperación

Cuando un host falla sin transferir correctamente sus particiones de directorio, los propietarios de las particiones subsiguientes deben realizar la recuperación. Esto implica:

  1. Consulta de todos los silos activos en el clúster para obtener sus registros de granos.
  2. Restablecer el estado del directorio para los rangos afectados.
  3. Asegurarse de que no ocurran activaciones duplicadas de granos.

La recuperación también es necesaria cuando los cambios de pertenencia al clúster se producen rápidamente. Aunque la pertenencia de clústeres garantiza la monotonicidad, es posible que los silos pierdan las vistas de asignación intermedias. En tales casos:

  • Las transferencias de instantáneas han sido abandonadas.
  • La recuperación se realiza en lugar de la transferencia normal de partición a partición.
  • El sistema mantiene la coherencia a pesar de que faltan estados intermedios.

Una mejora futura del sistema de pertenencia de clústeres puede reducir o eliminar estas situaciones garantizando que se pueda acceder a todas las vistas en todos los silos.