Los datos del usuario se almacenan en dos clústeres de almacenamiento OpenStack Swift bastante grandes (> 1 PB). Que sean Grupo A y Grupo B .
Además, hay varios PoP que necesitan interactuar con esos datos. Los servidores en estos PoP están efectivamente sin disco, lo que significa que no se almacenan ni se descargan datos de los usuarios. Los PoP pueden agruparse en regiones del mundo en general (por ejemplo , América del Norte , Sudáfrica , Europa Central y otros).
Algunos PoP están bastante lejos de los puntos finales de Swift de cualquiera de los grupos, lo que introduce una latencia indeseable. Para mitigar esto de alguna manera, quiero configurar un servidor de puerta de enlace de almacenamiento en caché en cada una de las regiones, que almacenará en caché las solicitudes de r / w al clúster más cercano.
Actualmente, los clientes en cualquiera de los PoP acceden a los datos del usuario mediante un sistema de archivos virtual swift montado permanentemente , que es un módulo FUSE que monta Swift Object Storage como un dispositivo de bloque (más o menos). Sin embargo, svfs no es tan estable en primer lugar y en el futuro, los clientes deben acceder a los servidores de caché a través de NFS.
Este es un diagrama de una rama de la arquitectura deseada:
+------------------+ +------------------+ NFS +------------------+
| Cluster A | SVFS | Region 1 Cache +----------> R1 PoP a Client |
| +----------------> | | |
|Persistent Storage| |Ephemeral Storage+----+ |Generates R/W Load|
+-----------------++ +------------------+ | +------------------+
| |
| +------------------+ | NFS +------------------+
| SVFS | Region 2 Cache | +-----> R1 PoP b Client |
+-----------------> | | |
|Ephemeral Storage| |Generates R/W Load|
+------------------+ +------------------+
Estoy familiarizado con los conceptos básicos de configuración de NFS y svfs.
La pregunta es : ¿cómo puedo configurar el servidor de almacenamiento en caché para usar todos los recursos disponibles (una partición de caché designada, RAM) para almacenar en caché de la forma más agresiva y la mayor cantidad de datos posible antes de escribir en el punto de montaje svfs? Básicamente se trata de: ¿Cómo puedo almacenar en caché un directorio en Linux?
Si es posible, las lecturas y escrituras deben consolidarse y los tamaños de bloque en las solicitudes de FUSE deben ser de al menos 128k si es posible para maximizar el rendimiento y minimizar la latencia si la caché necesita escribir en el clúster.
Anexo 1 : He cambiado el módulo de montaje en clúster de svfs a S3QL en algunos de los servidores. El almacenamiento en caché de S3QL ha mejorado un poco el rendimiento. Intentaré obtener algunos datos de rendimiento para completar.
fuente
Respuestas:
Si los mecanismos de Linux inherentes (como
cachefs
akacachefilesd
) no funcionan Y tiene presupuesto, puede buscar WAFS (servicios de archivos de área amplia). Estos son dispositivos diseñados para el almacenamiento en caché agresivo de NFS (y CIFS), para tratar de ocultar las latencias generalmente involucradas en los enlaces WAN.fuente
Realmente no soy un experto en esta área (¡pero seguro que es interesante!).
Lo que he estado buscando últimamente es principalmente dm-cache para LVM, con SSD para la parte de almacenamiento en caché. Aquí hay un texto de ejemplo de readhat que tiene una buena visión general, pero no está vinculado a RH: https://www.redhat.com/en/blog/improving-read-performance-dm-cache
fuente