Particionado de Redis
El particionado es el proceso de dividir los datos entre múltiples instancias de Redis, por lo que cada instancia solo guarda un subconjunto de las claves.
Ventajas del particionado
- Al utilizar la suma de la memoria de múltiples computadoras, nos permite construir bases de datos más grandes.
- Mediante múltiples núcleos y múltiples computadoras, nos permite ampliar la capacidad de cómputo; mediante múltiples computadoras y adaptadores de red, nos permite ampliar el ancho de banda de la red.
Desventajas del particionado
Algunas características de Redis no se comportan muy bien en cuanto al particionado:
- Las operaciones que involucran múltiples claves generalmente no se admiten. Por ejemplo, cuando dos sets se asignan a diferentes instancias de Redis, no puedes realizar la operación de intersección sobre estos dos sets.
- Las transacciones de Redis que involucran múltiples claves no se pueden utilizar.
- Cuando se usa el particionado, el manejo de datos es más complejo; por ejemplo, necesitas manejar múltiples archivos rdb/aof y hacer copias de seguridad de los archivos de persistencia desde múltiples instancias y hosts.
- Agregar o eliminar capacidad también es más complejo. La mayoría de los clústeres de Redis admiten la capacidad de equilibrar los datos de forma transparente al agregar o eliminar nodos en tiempo de ejecución, pero otros sistemas, como el particionado del lado del cliente o los proxies, no admiten esta característica. Sin embargo, una técnica llamada presharding es útil para esto.
Tipos de particionado
Redis tiene dos tipos de particionado. Supongamos que hay 4 instancias de Redis: R0, R1, R2, R3, y múltiples claves que representan usuarios, como user:1, user:2. Para una clave determinada, existen varias formas diferentes de elegir en qué instancia se almacena esta clave. Es decir, hay diferentes sistemas para mapear una clave a un servicio de Redis.
Particionado por rango
La forma más simple de particionado es el particionado por rango, que consiste en mapear objetos de un cierto rango a una instancia específica de Redis.
Por ejemplo, los usuarios con ID de 0 a 10000 se guardarán en la instancia R0, los usuarios con ID de 10001 a 20000 se guardarán en R1, y así sucesivamente.
Este método es viable y se utiliza en la práctica, pero la desventaja es que se necesita una tabla de mapeo de rangos a instancias. Esta tabla debe ser gestionada, y además se requieren tablas de mapeo para distintos objetos; por lo general, no es un buen método para Redis.
Particionado por hash
Otro método de particionado es el particionado por hash. Esto se aplica a cualquier clave y no es necesario que sea un object_name:
- Se utiliza una función hash para convertir la clave en un número, por ejemplo, la función hash crc32. Al ejecutar crc32(foobar) sobre la clave foobar se obtiene un entero similar a 93024922.
- A este entero se le aplica el módulo, convirtiéndolo en un número entre 0 y 3, y así se puede mapear este entero a una de las 4 instancias de Redis. 93024922 % 4 = 2, es decir, la clave foobar debería almacenarse en la instancia R2. Nota: la operación de módulo obtiene el resto de la división y, normalmente, se implementa con el operador % en varios lenguajes de programación.