Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Información general y arquitectura
El directorio de grano 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. Puede implementar su propio directorio implementando la IGrainDirectory interfaz 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 menos necesidad de implementaciones de directorios externos, pero se mantiene la API por compatibilidad retroactiva y flexibilidad. Puede configurar el directorio de granos por tipo.
Para optimizar el rendimiento, Orleans almacena en caché las búsquedas de directorios localmente dentro de cada silo. Esto significa que las lecturas de directorios potencialmente remotas 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 virtualmente sincrónica de dos fases. También se estructura como una tabla hash distribuida, pero ofrece un equilibrio de carga mejorado a través 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:
- Operación normal: las particiones procesan las solicitudes localmente sin coordinación con otros hosts.
- 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 durante los cambios de vista.
Esto garantiza que el propietario correcto de la partición de directorio procese todas las solicitudes.
Estrategia de particiones
El directorio se particiona mediante un anillo hash coherente, con intervalos asignados a los silos activos del clúster. Los identificadores de grano se aplica un algoritmo hash para buscar el silo que posee la sección del anillo correspondiente 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 utilizado por Amazon Dynamo y Apache Cassandra, donde se crean varios "nodos virtuales" (intervalos) para cada nodo físico (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 rango se divida entre varios silos durante un cambio de vista. Esto 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 intervalo se crean durante un cambio de vista y se liberan 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 une al clúster, es posible que las particiones existentes se reduzcan para hacer espacio.
- Si un silo sale del clúster, las particiones restantes pueden crecer para hacerse cargo 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:
- El propietario anterior sella el intervalo y crea una instantánea de las entradas del directorio.
- El nuevo propietario solicita y aplica la instantánea.
- El nuevo propietario comienza a atender las solicitudes del intervalo.
- 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:
- Consulta de todos los silos activos en el clúster para obtener sus registros de granos.
- Restablecer el estado del directorio para los rangos afectados.
- Asegurarse de que no ocurran activaciones duplicadas de granos.
La recuperación también es necesaria cuando la pertenencia al clúster cambia 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 entrega normal de partición a partición.
- El sistema mantiene la coherencia a pesar de que faltan estados intermedios.
Una mejora futura en la pertenencia a clústeres podría reducir o eliminar estos escenarios garantizando que todos los silos compartan todas las perspectivas.