Construcción del entorno de clúster distribuido de Redis

        Los clústeres distribuidos de Redis se pueden dividir en clústeres maestro- esclavo , clústeres centinela y clústeres fragmentados.En este artículo, presentaremos la construcción de estos tres entornos de clúster.

        Este entorno de compilación es un sistema de máquina virtual Linux.

        Antes de crear un clúster de Redis, debe instalar e implementar un Redis independiente en el sistema Linux (el directorio de instalación es: /usr/local/src), y puede hacer clic en los pasos detallados en el siguiente enlace: Servidor en la nube de Linux instalación e implementación redis pasos detallados

Ⅰ Construcción de clúster maestro-esclavo de Redis

1.1 Estructura del conglomerado 

La estructura de clúster maestro-esclavo que construimos se muestra en la figura:

Hay tres nodos en total, un nodo maestro y dos nodos esclavos (el nodo maestro se usa para operaciones de escritura y los nodos esclavos solo pueden realizar operaciones de lectura).

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

IP PUERTO Role
192.168.70.130 7001 maestro
192.168.70.130 7002 esclavo
192.168.70.130 7003 esclavo

1.2 Preparar y configurar la instancia

Para iniciar tres instancias en la misma máquina virtual, se deben preparar tres archivos y directorios de configuración diferentes, y el directorio donde se encuentran los archivos de configuración también es el directorio de trabajo.

1) Crear un directorio

Creamos tres carpetas llamadas 7001, 7002 y 7003:

# 进入 /usr/local/src 目录
cd /usr/local/src
# 创建目录
mkdir 7001 7002 7003

Como se muestra en la imagen:

2) Activar RDB y desactivar AOF (por defecto)

Modifique el archivo redis-6.2.4/redis.conf, cambie el modo de persistencia al modo RDB predeterminado y mantenga AOF apagado

# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000

# 关闭AOF
appendonly no

3) Copie el archivo de configuración en cada directorio de instancia

# 方式一:逐个拷贝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003

# 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf

4) Modificar el puerto y directorio de trabajo de cada instancia

Modifique los archivos de configuración en cada carpeta, modifique los puertos a 7001, 7002 y 7003 respectivamente, y modifique la ubicación de almacenamiento de los archivos rdb a su propio directorio (ejecute los siguientes comandos en el directorio /usr/local/src):

sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/usr\/local\/src\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/usr\/local\/src\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/usr\/local\/src\/7003\//g' 7003/redis.conf

5) Modificar la IP declarada de cada instancia

La máquina virtual en sí tiene varias direcciones IP. Para evitar confusiones en el futuro, debemos especificar la información de la dirección IP vinculante de cada instancia en el archivo redis.conf. El formato es el siguiente:

# redis实例的声明 IP
replica-announce-ip 192.168.150.101

Cada directorio necesita ser cambiado, y podemos completar la modificación con un clic (ejecutar el siguiente comando en el directorio /usr/local/src):

# 逐一执行
sed -i '1a replica-announce-ip 192.168.70.130' 7001/redis.conf
sed -i '1a replica-announce-ip 192.168.70.130' 7002/redis.conf
sed -i '1a replica-announce-ip 192.168.70.130' 7003/redis.conf

# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.70.130' {}/redis.conf

Si la contraseña requirepass está habilitada tanto en el maestro como en el esclavo, lo que genera una falla en la verificación exitosa, simplemente agregue masterauth 123321 en el archivo de configuración (redis.conf) del servidor esclavo redis (ejecute el siguiente comando en /usr/local/src directorio):

# 逐一执行
sed -i 'masterauth 123321' 7002/redis.conf
sed -i 'masterauth 123321' 7003/redis.conf

# 或者意见修改
printf '%s\n' 7002 7003 | xargs -I{} -t sed -i 'masterauth 123321' {}/redis.conf

(123321 es la contraseña de mi redis principal, este parámetro es la verificación de contraseña al conectarse con el principal)

1.3 inicio

Para ver los registros convenientemente, podemos abrir 3 ventanas ssh, iniciar 3 instancias de redis respectivamente e iniciar el comando (ejecutar el siguiente comando en el directorio /usr/local/src):  

# 第1个
redis-server 7001/redis.conf
# 第2个
redis-server 7002/redis.conf
# 第3个
redis-server 7003/redis.conf

Si desea detenerse con una tecla, puede ejecutar el siguiente comando:

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

1.4 Abrir la relación maestro-esclavo

Ahora las tres instancias no tienen nada que ver entre sí.Para configurar el maestro-esclavo, puede usar el comando replicaof o slaveof (antes de 5.0).

Existen dos modalidades, temporal y permanente:

  • Modificar el archivo de configuración (permanente)

    • Agregue una línea de configuración a redis.conf:slaveof <masterip> <masterport>

  • Use el cliente redis-cli para conectarse al servicio redis y ejecute el comando slaveof (fallará después de reiniciar):slaveof <masterip> <masterport>

Nota : el comando replicaof se agrega después de 5.0, que tiene el mismo efecto que salveof.

Aquí usamos el segundo método para la demostración:

1) Conéctese a 7002 a través del comando redis-cli y ejecute el siguiente comando:

# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.150.101 7001

2) Conéctese a 7003 a través del comando redis-cli y ejecute el siguiente comando:  

# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 192.168.150.101 7001

3) Luego, conéctese al nodo 7001 para verificar el estado del clúster:

# 连接 7001
redis-cli -p 7001
# 查看状态
info replication

resultado:

1.5 Prueba

Haga lo siguiente para probar:

  • Use redis-cli para conectarse a 7001, ejecuteset num 123

  • Use redis-cli para conectarse a 7002, ejecute get numy luego ejecuteset num 666

  • Use redis-cli para conectarse a 7003, ejecute get numy luego ejecuteset num 888

Se puede encontrar que solo el nodo maestro 7001 puede realizar operaciones de escritura, y los dos nodos esclavos 7002 y 7003 solo pueden realizar operaciones de lectura.

Ⅱ Construcción del cúmulo centinela de Redis

2.1 Estructura del conglomerado

Aquí construimos un clúster Sentinel formado por tres nodos para supervisar el clúster maestro-esclavo de Redis anterior. Como se muestra en la imagen:  

 

La información de las tres instancias centinela es la siguiente:

nodo IP PUERTO
s1 192.168.70.130 27001
s2 192.168.70.130 27002
s3 192.168.70.130 27003

2.2 Preparar y configurar la instancia

Para iniciar tres instancias en la misma máquina virtual, se deben preparar tres archivos y directorios de configuración diferentes, y el directorio donde se encuentran los archivos de configuración también es el directorio de trabajo.

Creamos tres carpetas llamadas s1, s2, s3:

# 进入/usr/local/src目录
cd /usr/local/src
# 创建目录
mkdir s1 s2 s3

Como se muestra en la imagen:

Luego creamos un archivo sentinel.conf en el directorio s1 y agregamos el siguiente contenido:

port 27001
sentinel announce-ip 192.168.70.130
sentinel monitor mymaster 192.168.70.130 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/usr/local/src/s1"

explicar:

  • port 27001: es el puerto de la instancia actual de Sentinel

  • sentinel monitor mymaster 192.168.70.130 7001 2: Especifique la información del nodo maestro

    • mymaster: nombre de nodo maestro, definido por el usuario, escritura arbitraria

    • 192.168.70.130 7001: la ip y el puerto del nodo maestro

    • 2: El valor de quórum cuando se elige el maestro (es decir, si más de 2 centinelas piensan que el nodo está desconectado subjetivamente, se considera que el nodo está desconectado objetivamente)

Luego copie el archivo s1/sentinel.conf en los directorios s2 y s3 ​​(ejecute el siguiente comando en el directorio /usr/local/src):

# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

Modifique los archivos de configuración en las carpetas s2 y s3, y cambie los puertos a 27002 y 27003 respectivamente (ejecute los siguientes comandos en el directorio /usr/local/src):

sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

2.3 inicio

Para ver los registros convenientemente, podemos abrir 3 ventanas ssh, iniciar 3 instancias de redis respectivamente e iniciar el comando (ejecutar el siguiente comando en el directorio /usr/local/src):  

# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

2.4 Pruebas

Intente apagar el nodo maestro 7001, verifique el registro de centinela:  

Compruebe el registro de 7003:

Compruebe el registro de 7002:

2.5 plantilla redis (opcional)

En el clúster maestro-esclavo de Redis supervisado por el clúster de Sentinel, sus nodos cambiarán debido a la conmutación por error automática, y el cliente de Redis debe detectar este cambio y actualizar la información de conexión a tiempo. La capa inferior de RedisTemplate de Spring usa lechuga para realizar la percepción del nodo y el cambio automático.

A continuación, implementamos el mecanismo centinela de integración de RedisTemplate a través de una prueba.

1) Introducir dependencias en el archivo pom del proyecto:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2) Luego, especifique la información relacionada con el centinela de redis en el archivo de configuración application.yml:

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.70.130:27001
        - 192.168.70.130:27002
        - 192.168.70.130:27003

3) En la clase de inicio del proyecto, agregue un nuevo bean y configure la separación de lectura y escritura:

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

Este bean está configurado con estrategias de lectura y escritura, incluidos cuatro tipos:

  • MAESTRO: leer desde el nodo maestro

  • MASTER_PREFERRED: Lea primero desde el nodo maestro, lea la réplica cuando el maestro no esté disponible

  • RÉPLICA: leer desde el nodo esclavo (réplica)

  • REPLICA _PREFERRED: Lea primero desde el nodo esclavo (réplica), todos los esclavos no están disponibles para leer el maestro

Ⅲ Construcción de clústeres de fragmentación de Redis 

3.1 Estructura del conglomerado

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.70.130 7001 maestro
192.168.70.130 7002 maestro
192.168.70.130 7003 maestro
192.168.70.130 8001 esclavo
192.168.70.130 8002 esclavo
192.168.70.130 8003 esclavo

3.2 Preparar y configurar la instancia

Cree los directorios 7001, 7002, 7003, 8001, 8002, 8003 (si ya existe el mismo nodo, recuerde eliminar los directorios 7001, 7002, 7003 anteriores):

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

Prepare un nuevo archivo redis.conf en /usr/local/src con el siguiente contenido:

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

Copie este archivo en los directorios 7001, 7002, 7003, 8001, 8002, 8003 (ejecute los siguientes comandos en el directorio /usr/local/src):

# 执行拷贝
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 (ejecute el siguiente comando en el directorio /usr/local/src):

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

3.3 inicio

 Debido a que se ha configurado el modo de inicio en segundo plano, el servicio se puede iniciar directamente (ejecute el siguiente comando en el directorio /usr/local/src):

# 一键启动所有服务
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
# 或者
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown # 推荐

3.4 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. Era 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

Antes de Redis5.0, todos los comandos del clúster se implementaban con src/redis-trib.rb en el paquete de instalación de redis. Debido a que redis-trib.rb está escrito en lenguaje ruby, necesita 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 /usr/local/src/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.70.130:7001 192.168.70.130:7002 192.168.70.130:7003 192.168.70.130:8001 192.168.70.130:8002 192.168.70.130:8003

2) 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.70.130:7001 192.168.70.130:7002 192.168.70.130:7003 192.168.70.130:8001 192.168.70.130:8002 192.168.70.130:8003

Descripción del comando:

  • redis-cli --cluster ./redis-trib.rb: representa un comando de operación de clúster

  • create: representa la creación de un clúster

  • --replicas 1 --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 obtenido en este momento es el número de maestros. Por lo tanto, los primeros n nodos de la lista de nodos son maestros y los otros nodos son nodos 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

3.5 Pruebas

Intente conectarse al nodo 7001 y almacene un dato:

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

Nota: el parámetro -c debe agregarse al conectarse, de lo contrario, la operación fallará

Supongo que te gusta

Origin blog.csdn.net/weixin_52850476/article/details/125084910
Recomendado
Clasificación