sql >> Base de Datos >  >> NoSQL >> Redis

Introducción a la fragmentación de clústeres de Redis:ventajas, limitaciones, implementación y conexiones de clientes

Redis Cluster es la implementación de fragmentación nativa disponible en Redis que le permite distribuir automáticamente sus datos en varios nodos sin tener que depender de herramientas y utilidades externas. En ScaleGrid, agregamos recientemente soporte para Redis™* Clusters en nuestra plataforma totalmente administrada a través de nuestro hospedaje para planes Redis™. En esta publicación, le presentaremos las oportunidades avanzadas de sharding de Redis Cluster, discutiremos sus ventajas y limitaciones, cuándo debe implementar y cómo conectarse a su Redis Cluster.

Fragmentación con Redis Cluster

Todo el espacio de claves en Redis Clusters está dividido en 16384 ranuras (llamadas ranuras hash) y estas ranuras se asignan a varios nodos de Redis. Una clave determinada se asigna a una de estas ranuras y la ranura hash para una clave se calcula como:

HASH_SLOT =CRC16(clave) mod 16384

Las operaciones de varias claves son compatibles con los clústeres de Redis siempre que todas las claves involucradas en la ejecución de un solo comando pertenezcan a la misma ranura hash. Esto se puede asegurar utilizando el concepto de etiquetas hash.

La Especificación de clúster de Redis es la guía definitiva para comprender los aspectos internos de la tecnología, mientras que el Tutorial de clúster de Redis proporciona pautas de implementación y administración.

Ventajas

Consulte las principales ventajas de Redis Clusters para ver cómo puede beneficiar sus implementaciones:

  • Alto rendimiento

    Redis Cluster promete el mismo nivel de rendimiento que las implementaciones independientes de Redis.

  • Alta disponibilidad

    Redis Cluster es compatible con la configuración estándar de réplica principal de Redis para garantizar una alta disponibilidad y durabilidad. También implementa un enfoque de consenso similar a Raft para garantizar la disponibilidad de todo el clúster.

  • Escalabilidad horizontal y vertical

    Agregar o eliminar nuevos nodos de Redis del clúster puede ocurrir de manera transparente y sin tiempo de inactividad. Esto facilita agregar y eliminar fragmentos, retirar o escalar nodos individuales.

  • Solución nativa

    La implementación de clústeres de Redis no requiere proxies ni herramientas externas, por lo que no hay herramientas nuevas de las que deba aprender o de las que preocuparse. También proporciona una compatibilidad casi completa con las implementaciones independientes de Redis.

Limitaciones

También seamos conscientes de las limitaciones para garantizar que sea adecuado para su implementación:

  • Requiere asistencia al cliente

    Los clientes deben realizar cambios para admitir los clústeres de Redis. Si bien Redis Clusters ha existido durante muchos años, todavía hay clientes que no lo admiten. Consulte la documentación del cliente de Redis para asegurarse de que el cliente que utiliza sea compatible antes de elegir implementar clústeres de Redis.

  • Compatibilidad limitada con operaciones de varias teclas

    Como se mencionó en la sección anterior, las operaciones de varias teclas solo se admiten cuando todas las teclas en una sola operación pertenecen a la misma ranura. Esto es algo que debe tener cuidado al diseñar sus estructuras de datos.

  • Solo admite una base de datos

    A diferencia de las bases de datos independientes, los clústeres de Redis solo admiten una base de datos (base de datos 0) y el comando SELECCIONAR no está permitido. Dado que la mayoría de las personas no usan múltiples bases de datos, esto tampoco es una limitación importante.

¿Cuándo debería implementar un clúster de Redis?

La solución Redis Cluster puede ser una buena opción para usted si necesita una solución de Redis fragmentada. Redis Cluster es una solución nativa que es simple y ofrece un gran rendimiento.

Por lo general, las personas comienzan a pensar en fragmentar sus implementaciones de Redis cuando han comenzado a saturar un nodo de Redis independiente con escrituras y desean distribuir las escrituras en varios nodos. Aunque Redis es principalmente de un solo subproceso, la E/S generalmente se vincula a la red o a la memoria de forma independiente antes de que pueda comenzar a saturar la CPU. El límite de memoria se puede superar hasta cierto punto al elegir agregar más memoria a un sistema independiente, pero comienza a volverse prohibitivo en términos de costo, copia de seguridad, reinicio, tiempos de calentamiento, etc. más allá de cierto punto.

Por otro lado, si solo busca distribuir su lectura en varios nodos, es mucho más fácil simplemente agregar réplicas de lectura al independiente.

En comparación con otras soluciones de fragmentación para Redis, el reequilibrio de fragmentación en Redis Clusters es transparente para las aplicaciones. Esto hace que sea muy fácil agregar o eliminar fragmentos sin afectar la aplicación.

Introducción a la fragmentación de clústeres de #Redis:ventajas, limitaciones, cuándo implementar y conexiones de clientesHaga clic para twittear

Conexión a un clúster de Redis

Si elige implementar un clúster de Redis™ con ScaleGrid, obtiene una implementación de clúster de Redis con todas las funciones que es totalmente compatible con la versión estándar.

Si recién está comenzando, regístrese para obtener una prueba gratuita de 30 días en la consola de ScaleGrid y consulte esta documentación sobre cómo crear su primera implementación de ScaleGrid para Redis™.

Esto es lo que necesita para conectarse al clúster de Redis™ en ScaleGrid:

  • Lista de nombres de nodos
  • Puertos
  • Cadena de autenticación

La pestaña Descripción general de la página de detalles de la implementación de Redis™ tiene la lista de maestros de cada fragmento, junto con los números de puerto y la información de autenticación:

Alternativamente, la lista de todos los nodos del clúster está disponible en la pestaña Máquinas:

Como habrá notado, no hay muchos ejemplos disponibles que le muestren cómo conectarse a un clúster de Redis™ habilitado para la autenticación disponible en línea, aquí hay algunos ejemplos que usan algunos de los clientes populares.

Conexión con Java

Entre los populares clientes Java de Redis, Jedis y Lettuce son compatibles con los clústeres de Redis™. Tomaremos Jedis para nuestro ejemplo.

Jedis

Las conexiones de Redis™ Cluster son abstraídas por JedisCluster clase. Los mejores ejemplos del uso de esta clase para conectarse a Redis™ Clusters se pueden encontrar en las pruebas de Jedis, código fuente de Jedis. Desafortunadamente, en este momento, cuando se especifica la autenticación, el JedisCluster constructor no es muy limpio. Este es un ejemplo que escribe 100 claves en Redis™ Cluster. Tenga en cuenta que dado que las claves no están etiquetadas, terminarán en diferentes ranuras en diferentes nodos:

...
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
...

public class RedisClusterModeTest {
    public static final int    DEFAULT_TIMEOUT      = 5000;
    public static final int    DEFAULT_REDIRECTIONS = 5;

    public static void main(String[] args) {
        Set jedisClusterNodes = new HashSet();
        jedisClusterNodes.add(new HostAndPort("SG-example-1.servers.scalegrid.io, 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-2.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-3.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-4.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-5.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-6.servers.scalegrid.io", 6379));

        JedisCluster jedis = new JedisCluster(jedisClusterNodes, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, <auth>, new JedisPoolConfig());
        for (int i = 0; i < 100; i++) {
            jedis.set("key" + i, "value" + i);
        }
        jedis.close();
    }
}

Los argumentos del constructor están documentados en los documentos de la API de Jedis. Le recomendamos que especifique todos los nodos del clúster durante la creación del clúster con Jedis.

Conectando con Rubí

El cliente de Redis más popular en Ruby es redis-rb. También es compatible con los clústeres de Redis™, por lo que lo usaremos en nuestro ejemplo.

Redis-rb

las versiones 4.1.0 y posteriores de redis-rb son compatibles con los clústeres de Redis™. El 'clúster' La opción debe especificarse durante la inicialización de la conexión, y puede consultar esta documentación para conocer la semántica exacta. Aquí está el mismo programa que el ejemplo de Java anterior en Ruby:

require 'redis'
require 'pp'

NODES = ["redis://SG-example-1.servers.scalegrid.io:6379",
         "redis://SG-example-2.servers.scalegrid.io:6379",
         "redis://SG-example-3.servers.scalegrid.io:6379",
         "redis://SG-example-4.servers.scalegrid.io:6379",
         "redis://SG-example-5.servers.scalegrid.io:6379",
         "redis://SG-example-6.servers.scalegrid.io:6379"]
begin
    pp "Attempting connection..."
    redis = Redis.new(cluster: NODES, password: <auth>)
    100.times { |i| redis.set("key#{i}", "value#{i}") }
    pp "Done..."
    redis.close
rescue StandardError => e
    puts e.message
end

Conexión con Node.js

Node_redis es el cliente de Redis más popular en Node.js. Sin embargo, todavía no es compatible oficialmente con los clústeres de Redis™. ioredis es otro cliente de Redis popular que admite clústeres de Redis™, por lo que lo usaremos para nuestro ejemplo de Node.js.

ioredis

La documentación de ioredis describe los detalles de los parámetros adicionales que se deben pasar para conectarse a Redis™ Clusters, y también se proporciona un ejemplo básico en el LÉAME. Aquí hay un programa de ejemplo que solicita al usuario una clave y lee su valor del clúster de Redis™:

const readline = require('readline');
const Redis = require('ioredis');

var cluster = new Redis.Cluster([{
    port: 6379,
    host: 'SG-example-1.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-2.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-3.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-4.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-5.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-6.servers.scalegrid.io'
}
], { redisOptions: { password: '<auth>' } });

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'enter key> '
});

console.log('Welcome to the Redis Cluster reader. Enter the key which you want to read [Ctrl D to Exit]');
rl.prompt();
rl.on('line', (line) => {
    if (line.trim()) {
        cluster.get(line, function (err, result) {
            if (err) {
                console.error(err);
            } else {
                console.log("value: " + result);
            }
            rl.prompt();
        });
    } else {
        console.error("No input received");
        rl.prompt();
    }
}).on('close', () => {
    console.log('\nterminating');
    cluster.quit();
    process.exit(0);
});

Debería poder ejecutar cualquiera de estos ejemplos después de instalar las versiones más recientes de los controladores Redis en sus máquinas cliente.

Si está listo para migrar sus implementaciones de Redis a la plataforma totalmente administrada de ScaleGrid para alojamiento de Redis™, consulte las increíbles funciones disponibles en la consola de ScaleGrid a través de una prueba gratuita de 30 días. Nuestros planes de alojamiento de AWS para Redis™ están disponibles en 14 centros de datos diferentes en todo el mundo, y somos el único servicio para Redis™ que le permite administrar sus implementaciones dentro de su propia cuenta en la nube.