Redis Advanced: clúster de fragmentación de Redis

La dirección del texto original se actualiza y el efecto de lectura es mejor.

Redis Advanced: Redis Sharded Cluster | CoderMast Programación Mast icono-predeterminado.png?t=N5K3https://www.codermast.com/database/redis/redis-advance-sharded-cluster.html

Crear un clúster de fragmentos

Maestro-esclavo y centinela pueden resolver el problema de alta disponibilidad y alta lectura simultánea. Pero todavía hay dos cuestiones sin resolver:

  • Problema de almacenamiento masivo de datos
  • El problema de la alta escritura concurrente

Los problemas anteriores se pueden resolver mediante el uso de clústeres de fragmentos.

  • Hay varios maestros en el clúster y cada maestro almacena datos diferentes
  • Cada maestro puede tener múltiples nodos esclavos
  • El maestro monitorea el estado de salud de cada uno a través de ping
  • Las solicitudes de los clientes pueden acceder a cualquier nodo del clúster y eventualmente se reenviarán al nodo correcto

# estructura de clúster

Los clústeres fragmentados requieren una gran cantidad de nodos. Aquí construimos un clúster fragmentado mínimo, incluidos 3 nodos maestros, y cada maestro contiene un nodo esclavo. La estructura es la siguiente:

 

Aquí abriremos 6 instancias de redis en la misma máquina virtual para simular un clúster fragmentado, la información es la siguiente:

IP PUERTO Role
192.168.150.101 7001 maestro
192.168.150.101 7002 maestro
192.168.150.101 7003 maestro
192.168.150.101 8001 esclavo
192.168.150.101 8002 esclavo
192.168.150.101 8003 esclavo

#Preparar instancia y configuración

Elimine los directorios anteriores 7001, 7002 y 7003 y vuelva a crear los directorios 7001, 7002, 7003, 8001, 8002 y 8003:

# 进入/tmp目录
cd /tmp
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003

Prepare un nuevo archivo redis.conf en /tmp con el siguiente contenido:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log

Copie este archivo en cada directorio:

# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

Modifique redis.conf en cada directorio y modifique 6379 para que sea coherente con el directorio:

# 进入/tmp目录
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

# inicio

Dado que se ha configurado el modo de inicio en segundo plano, el servicio se puede iniciar directamente:

# 进入/tmp目录
cd /tmp
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

Ver estado a través de ps:

ps -ef | grep redis

Los servicios de descubrimiento se han iniciado normalmente:

 

Si desea cerrar todos los procesos, puede ejecutar el comando:

ps -ef | grep redis | awk '{print $2}' | xargs kill

o (recomendado de esta manera):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

#Crear un clúster

Aunque el servicio está iniciado, actualmente cada servicio es independiente sin ninguna asociación.

Necesitamos ejecutar comandos para crear un clúster. Es problemático crear un clúster antes de Redis 5.0. Después de 5.0, los comandos de administración de clústeres están integrados en redis-cli.

  1. Antes de Redis5.0

Los comandos de clúster anteriores a Redis 5.0 se implementaron mediante src/redis-trib.rb en el paquete de instalación de redis. Debido a que redis-trib.rb está escrito en lenguaje ruby, es necesario instalar el entorno ruby.

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

Luego use el comando para administrar el clúster:

# 进入redis的src目录
cd /tmp/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
  1. Después de Redis5.0

Estamos usando la versión Redis6.2.4, administración de clúster e integrado en redis-cli, el formato es el siguiente:

redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

Descripción del comando:

  • redis-cli --clusterO ./redis-trib.rb: representa un comando de operación de clúster
  • create: representa la creación de un clúster
  • --replicas 1O --cluster-replicas 1 : especifique que el número de copias de cada maestro en el clúster es 1, y 节点总数 ÷ (replicas + 1) el número de maestros se obtiene en este momento. Por lo tanto, el primer n en la lista de nodos es el maestro y los demás nodos son todos esclavos, que se asignan aleatoriamente a diferentes maestros.

Cómo se ve después de ejecutar:

 

Ingrese sí aquí, y el clúster comenzará a crearse:

 

Puede ver el estado del clúster con el comando:

redis-cli -p 7001 cluster nodes

 

# prueba

Intente conectarse al nodo 7001 y almacene un dato:

# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

El resultado es trágico:

 

Durante el funcionamiento del clúster, debe redis-cliagregar -cparámetros:

redis-cli -c -p 7001

Esta vez funciona:

 

# ranura hash

Redis asignará cada nodo maestro a un total de 16384 ranuras (ranuras hash) que van de 0 a 16383. Al ver la información del clúster, puede ver:

Las claves de datos no están vinculadas a los nodos, sino a las ranuras. Redis calculará el valor de la ranura en función de una pequeña parte de la clave, en dos casos:

  • Contiene en clave  {} y {}contiene al menos 1 carácter, y {}la parte en es una parte válida
  • No incluido en la clave  {}, toda la clave es una parte válida

::: Por ejemplo, si la clave es num, se calculará según num, si es {itcast}num, se calculará según itcast. El método de cálculo es usar el algoritmo CRC16 para obtener un valor hash y luego tomar el resto de 16384, y el resultado es el valor de la ranura. :::

¿Cómo determina Redis en qué instancia debe estar una clave?

  • Asigne 16384 ranuras a diferentes instancias
  • Calcule el valor hash en función de la parte efectiva de la clave y tome el resto de 16384
  • El resto se usa como la ranura, solo busque la instancia donde se encuentra la ranura

¿Cómo guardar el mismo tipo de datos de forma fija en la misma instancia de Redis?

  • Este tipo de datos utiliza la misma parte efectiva, por ejemplo, todas las claves tienen el prefijo { typeid }

#escalado de clústeres

El escalado de clústeres significa que los nodos del clúster se pueden aumentar y disminuir dinámicamente, y mientras el clúster se escala, también se acompaña del movimiento de ranuras y datos en las ranuras entre nodos.

redis-cli --cluster proporciona muchos comandos para operar el clúster, que se pueden redis-cli --cluster helpver a través de instrucciones.

Agregue un nuevo nodo maestro al clúster y almacene num = 1000:

  1. Inicie una nueva instancia de Redis con el puerto 7004

# 创建实例目录
mkdir 7004
# 创建 redis 服务
sed -i s/6379/7004/g 7004/redis.conf
# 运行 redis 服务
redis-server 7004/redis.conf
  1. Agregue 7004 al clúster anterior y actúe como un nodo maestro

redis-cli --cluster add-node 192.168.150.101:7004 192.168.150.101:7001
  1. Asigne una ranura al nodo 7004 para que el número de clave se pueda almacenar en la instancia 7004

# 重新分片
redis-cli --cluster reshard 192.168.150.101:7001
# 移动 3000 个插槽
How many slots do you want to move (from 1 to 16384)? 3000
# 接收插槽的 ID
What is the receiving node ID? 「这里输入 7001 的 ID 即可」
# 使用 done 结束
# 是否确认移动
Do you want to proceed with the proposed rehard plan (yes/no)? yes

#conmutación por error _

¿Qué sucede cuando un maestro en el clúster deja de funcionar?

  1. La primera es que la instancia pierde conexión con otras instancias

  2. Entonces hay un tiempo de inactividad sospechoso

  3. Finalmente, se determina desconectarse y promover automáticamente un esclavo al nuevo maestro

La forma de seleccionar esclavo aquí es filtrar de acuerdo con el desplazamiento y la identificación.

migración de datos

Con el comando de conmutación por error del clúster, puede apagar manualmente un maestro en el clúster y cambiar al nodo esclavo que ejecuta el comando de conmutación por error del clúster para realizar la migración de datos sin percepción. El proceso específico es el siguiente:

 

La conmutación por error manual admite tres modos diferentes:

  • Predeterminado: el proceso predeterminado
  • fuerza: comprobación de consistencia omitida para el desplazamiento
  • adquisición: ejecute el paso 5 directamente, ignorando la consistencia de los datos, el estado maestro y otras opiniones maestras

# Clúster de fragmentación de acceso de RedisTemplate

La capa inferior de RedisTemplate también implementa la compatibilidad con clústeres de fragmentación basados ​​en lechuga, y los pasos utilizados son básicamente los mismos que en el modo centinela:

  1. Introducir la dependencia inicial de redis

  2. Configurar la dirección del clúster de fragmentos

  3. Configurar la separación de lectura y escritura

En comparación con el modo centinela, solo la configuración de los clústeres fragmentados es ligeramente diferente, de la siguiente manera:

spring:
  redis:
    cluster:
      nodes:    # 指定分片集群的每一个节点信息
        - 192.168.150.101:7001
        - 192.168.150.101:7002
        - 192.168.150.101:7003
        - 192.168.150.101:8001
        - 192.168.150.101:8002
        - 192.168.150.101:8003

Supongo que te gusta

Origin blog.csdn.net/qq_33685334/article/details/131461773
Recomendado
Clasificación