Rb: Implementación de Sharding No Replicado para Redis en Python

Introducción

Rb es una biblioteca de Python que facilita el sharding no replicado en Redis. Construida sobre python-redis, introduce un sistema de enrutamiento personalizado que distribuye automáticamente los comandos a diferentes nodos sin necesidad de gestión manual. Aunque no cubre todas las funcionalidades de Redis, es ideal para operaciones clave-valor que pueden ser enrutadas de manera eficiente.

Instalación

La biblioteca está disponible en PyPI y se instala mediante pip:

$ pip install rb

Configuarción

Para configurar un clúster, se define un conjunto de nodos en lugar de un único host. Aquí un ejemplo con hosts en localhost pero diferentes puertos:

from rb import Cluster

redis_cluster = Cluster(hosts={
    'nodo_a': {'port': 6380},
    'nodo_b': {'port': 6381},
    'nodo_c': {'port': 6382},
    'nodo_d': {'port': 6383},
}, host_defaults={'host': '127.0.0.1'})

El parámetro hosts mapea identificadores de host a configuraciones, mientras que host_defaults proporciona valores comunes. Por defecto, se utiliza el PartitionRouter para el enrutamiento.

Enrutamiento de Operaciones

Se puede obtener un cliente con enrutamiento automático usando get_routing_client. Este cliente redirige comandos a nodos específicos basándose en la clave:

cliente_ruta = redis_cluster.get_routing_client()
valores = {}
for id_clave in lista_claves:
    valores[id_clave] = cliente_ruta.get(id_clave)

Para ejecutar operaciones en paralelo, se emplea el contexto map, que agrupa comandos y los envía concurrentemente. Los resultados se almacenan como objetos Promise:

resultados_mapa = {}
with redis_cluster.map() as cliente_map:
    for item in datos:
        resultados_mapa[item] = cliente_map.get(item)
for clave, promesa in resultados_mapa.items():
    print(f'{clave}: {promesa.value}')

Comandos a Todos los Nodos

Para operaciones globales, como limpiar bases de datos, se utiliza all:

with redis_cluster.all() as cliente_global:
    cliente_global.flushdb()

El resultado es un diccionario con el ID de host como clave y el valor correspondiente. Para enviar comandos a hosts específicos, se usa fanout:

with redis_cluster.fanout(hosts=['nodo_a', 'nodo_b']) as cliente_fan:
    info_nodos = cliente_fan.info()

Resumen de la API

La biblioteca expone varias clases clave:

  • Cluster: Gestiona el clúster y sus pools de conexión. Ofrece métodos como get_routing_client, map, y all.
  • RoutingClient: Enruta comandos a nodos individuales, con soporte para batching automático.
  • MappingClient: Permite operaciones paralelas y devuelve promesas que se resuelven al finalizar el contexto.
  • FanoutClient: Envía comandos a hosts específicos manualmente, útil para tareas administrativas.

Los routers disponibles incluyen PartitionRouter (usa crc32 para asignar claves) y ConsistentHashingRouter (basado en hashing consistente). Para pruebas, se puede usar make_test_cluster para generar clústeres temporales.

Etiquetas: Redis Python sharding non-replicated rb-library

Publicado el 6-11 04:23