Si su aplicación depende en gran medida de datos e interactúa frecuentemente con una base de datos, el almacenamiento en caché se vuelve crucial para mitigar los costos asociados. Las aplicaciones en línea que utilizan el almacenamiento en caché para acelerar la recuperación de datos, es imprescindible implementar una sólida replicación de datos y coherencia.
La replicación de datos es fundamental para crear copias de seguridad de datos críticos en múltiples servidores, garantizando información precisa y accesible. De manera similar, estos mecanismos de coherencia son vitales a la hora de sincronizar estas copias distribuidas sin problemas, evitando cualquier discrepancia en el proceso de solicitud. Por lo tanto, para garantizar que su aplicación interactúe con datos precisos y actualizados, debe emplear estas funciones para realizar copias de seguridad, alta disponibilidad y coherencia de los datos.
Por suerte, NCache proporciona un conjunto confiable de mecanismos de replicación y sincronización para estos sistemas distribuidos. Este blog detalla cómo NCache cumple estas condiciones.
NCache Topologías
Las topologías de almacenamiento en caché soportadas por NCache incluyen la Topología duplicada, Topología replicada, Topología de partición y réplica de particióny Topología de caché de cliente.
- Topología de espejo: Para todas las operaciones de lectura y escritura en la topología de caché reflejada, los nodos cliente solo se conectan al nodo servidor activo del clúster. Las aplicaciones cliente establecen inmediatamente una conexión con el nodo previamente pasivo si el nodo del servidor activo deja de funcionar.
- Topología replicada: La topología replicada garantiza que si varios servidores fallan al mismo tiempo, no se pierdan datos ya que cada servidor tiene la misma copia de datos.
- Topología de partición: Al conectar todas las aplicaciones cliente a servidores de caché, la topología de partición ofrece alta disponibilidad de datos al dividir los datos en fragmentos y, por lo tanto, conectar todas las aplicaciones cliente a los servidores de caché. De esta manera, la aplicación obtiene los datos requeridos incluso si el servidor conectado falla, solicitando a los otros servidores.
- Topología de partición-réplica: La topología partición-réplica no solo crea particiones dinámicas, sino también réplicas dinámicas de estas particiones en otros nodos del servidor, que actúan como respaldo en caso de una falla de conexión o de nodo. En estas situaciones, NCache obtiene datos del nodo de réplica y los distribuye.
- Topología de caché de cliente: En la topología de caché del cliente, el caché reside muy cerca de su aplicación y le permite almacenar en caché rápidamente los datos del caché distribuido.
Obtenga más información sobre topologías en el blog: Escalamiento horizontal y mantenimiento: exploración de topologías en NCache.
Replicación de datos en NCache
El objetivo principal de la replicación de datos es garantizar la coherencia, disponibilidad y tolerancia a fallos de los datos. Al mantener copias idénticas de los datos en diferentes ubicaciones, los sistemas pueden mejorar el rendimiento, reducir la latencia y proteger contra posibles pérdidas de datos o fallas del servidor.
Es síncrono o asíncrono, según la topología utilizada. En la replicación sincrónica, NCache garantiza que los datos se escriban simultáneamente en el servidor de caché principal y sus réplicas. Sin embargo, este método garantiza una sólida coherencia de los datos, pero el rendimiento puede verse afectado, ya que cualquier operación de escritura en caché debe esperar la confirmación de todas las réplicas.
Como alternativa, la replicación asincrónica actualiza las réplicas después de escribir datos en el servidor de caché principal. Dado que estas operaciones de escritura en caché no esperan la confirmación de la réplica, esta estrategia ofrece mayores ganancias de rendimiento. Aunque esta estrategia puede resultar en inconsistencias temporales de datos entre las réplicas y el servidor de caché principal.
Topologías para replicación de datos síncrona y asíncrona
Cada una de las topologías analizadas ofrece su propio conjunto de características, no todas se adaptan a la replicación de datos. Por ejemplo, la replicación sincronizada, empleada en el Topología de caché duplicada, garantiza la coherencia de los datos al escribir simultáneamente en los nodos principal y de réplica. Por otro lado, al escribir primero en los nodos primarios y actualizar las réplicas más tarde, la replicación asincrónica, utilizada en el Topología de caché replicada, mejora la eficiencia pero ocasionalmente puede provocar errores.
Afortunadamente, el Topología de partición-réplica logra un equilibrio entre redundancia, disponibilidad y rendimiento al combinar las ventajas de las topologías de caché particionada y replicada. Los usuarios pueden seleccionar la mejor técnica según sus requisitos.
Mecanismos de coherencia de datos
La coherencia de los datos se refiere a la confiabilidad y precisión de la información en un sistema o base de datos, lo que garantiza que los datos sigan siendo precisos y confiables durante diversas operaciones. Para garantizar la coherencia de los datos, NCache proporciona un mecanismo de Bloqueo distribuido que le permite bloquear elementos de caché específicos durante actualizaciones simultáneas. Varios usuarios pueden trabajar en varios elementos de la caché simultáneamente sin comprometer la integridad de los datos mediante la aplicación de bloqueos. Por tanto, los bloqueos de caché son útiles para gestionar recursos compartidos en un entorno distribuido.
Para mantener la consistencia de los datos, NCache actúa como un administrador de bloqueo distribuido y le proporciona dos tipos de bloqueo: Bloqueo optimista (versiones de elementos de caché) y Bloqueo pesimista (bloqueo exclusivo). Usos de bloqueo optimistas Control de versiones de elementos de caché. En este tipo de bloqueo, el método Agregar agrega un nuevo elemento en la caché y guarda la versión del elemento por primera vez, mientras que el método de inserción sobrescribe el valor de un elemento existente y actualiza su versión. El siguiente ejemplo crea un LockHandle y luego bloquea un elemento con la clave Producto:1001 durante un intervalo de tiempo de 10 segundos, de modo que el elemento se desbloqueará automáticamente después de 10 segundos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Prerequisite: Cache is already connected // Item is already added in the cache // Specify the key of the item string key = $"Product:1001"; // Create a new LockHandle LockHandle lockHandle = null; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = TimeSpan.FromSeconds(10); // Lock the item for a time span of 10 seconds bool lockAcquired = cache.Lock(key, lockSpan, out lockHandle); // Verify if the item is locked successfully if (lockAcquired == true) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } |
Alternativamente, el bloqueo pesimista bloquea el elemento usando el Manija de bloqueo, impidiendo que todos los demás usuarios realicen cualquier operación de escritura en ese elemento de caché. Al adquirir con éxito el candado mientras recupera el elemento, la aplicación ahora puede realizar operaciones de forma segura, sabiendo que ninguna otra aplicación puede obtener o actualizar este elemento mientras usted tenga este candado. El siguiente ejemplo bloquea un elemento en la memoria caché y luego obtiene el elemento mediante lockHandle. Luego, el elemento se actualiza y luego se reinserta en la memoria caché mediante la API Insertar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Specify the key of the item string key = $"Product:1001"; // Set acquireLock flag as true bool acquireLock = true; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = new TimeSpan(0, 0, 10); // Initialize the lockHandle LockHandle lockHandle = null; CacheItem item = cache.GetCacheItem(key, acquireLock, lockSpan, ref lockHandle); var product = new Product(); product = item.GetValue(); // Update the unitsinstock for the product product.UnitsInStock = 200; bool releaseLock = true; // Item is already locked with a LockHandle // Update the item and release the lock as well since releaseLock is set true // Make sure that the LockHandle matches with the already added LockHandle cache.Insert(key, item, null, lockHandle, releaseLock); |
Mejores prácticas para la replicación y coherencia de datos
Ahora que hemos aprendido sobre los mecanismos de replicación y coherencia de datos proporcionados por NCache, exploremos las prácticas recomendadas en este contexto. La topología replicada es la mejor opción para una aplicación que necesita alta disponibilidad y puede sobrevivir a fallas de (n-1) nodos sin pérdida de datos. Mientras que la topología de partición-réplica proporciona alta disponibilidad y la capacidad de satisfacer las crecientes necesidades de datos.
Si bien no tiene tanta disponibilidad como la topología replicada, aún puede resistir fallas de nodo sin pérdida de datos. Cada partición tiene una copia de seguridad; por tanto, cada nodo tiene esencialmente una partición y una copia de seguridad de otra partición. Por otro lado, la Topología Mirrored ofrece confiabilidad y disponibilidad de datos a través de replicación asíncrona desde el Nodo Activo al Nodo Pasivo.
NCache También admite estrategias de invalidación de datos basadas en el tiempo para caducar los datos de la caché. Invalidación de datos mediante Vencimiento significa que puede especificar el tiempo durante el cual los datos permanecen en la memoria caché, después del cual caducan. De esta manera, su caché tendrá los datos nuevos en la próxima solicitud del cliente, eliminando así los datos obsoletos, garantizando la coherencia de los datos. Invalidación mediante Dependencias garantiza que los datos de la caché se eliminen cada vez que se produzcan cambios en la base de datos.
Conclusión
La replicación y la coherencia de los datos son la columna vertebral de una aplicación confiable y de alto rendimiento. Afortunadamente, con NCache, tiene acceso a funciones sólidas que le permiten crear aplicaciones altamente escalables y tolerantes a fallas que pueden manejar incluso las necesidades de datos más complejas.