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, ejecute
set num 123
-
Use redis-cli para conectarse a 7002, ejecute
get num
y luego ejecuteset num 666
-
Use redis-cli para conectarse a 7003, ejecute
get num
y 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
O./redis-trib.rb
: representa un comando de operación de clúster -
create
: representa la creación de un clúster -
--replicas 1
O--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á