PD: para hacer que el entorno sea más realista, este artículo utiliza un entorno de múltiples máquinas
192.168.10.10
192.168.10.11
El entorno de infraestructura utilizado por cada máquina es el siguiente:
CentOS 7.8.2003
Docker version 19.03.12
Construir
Los pasos generales de construcción se dividen principalmente en los siguientes pasos:
- Descargue la imagen de Redis (de hecho, este paso se puede omitir, porque cuando se crea el contenedor, si la imagen local no existe, se extraerá de forma remota);
- Escriba el archivo de configuración de Redis;
- Crear contenedor de Redis;
- Cree un clúster de Redis Cluster.
Escribir archivo de configuración de Redis
Crea directorios y archivos
Respectivamente, 192.168.10.10
y 192.168.10.11
realice las siguientes operaciones en ambas máquinas.
# 创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
# 切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
# 编写 redis-cluster.tmpl 文件
vi redis-cluster.tmpl
Escribir archivo de configuración
192.168.10.10
El redis-cluster.tmpl
contenido de la máquina del archivo es el siguiente:
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
192.168.10.11
El redis-cluster.tmpl
contenido de la máquina del archivo es el siguiente:
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
port
: Puerto de nodo;requirepass
: Agregar autenticación de acceso;masterauth
: Si el nodo maestro ha habilitado la autenticación de acceso, el nodo esclavo requiere autenticación para acceder al nodo maestro;protected-mode
: Modo de protección, el valor predeterminado es sí, que está activado. Después de abrir el modo de protección, configurebind ip
o establezca la contraseña de acceso; el modo protegido apagado puede acceder directamente a la red externa;daemonize
: Ya sea para comenzar como un hilo demonio (comenzar en segundo plano), el valor predeterminado es no;appendonly
: Ya sea para habilitar el modo de persistencia AOF, el valor predeterminado es no;cluster-enabled
: Ya sea para habilitar el modo de clúster, predeterminado no;cluster-config-file
: Archivo de información del nodo del clúster;cluster-node-timeout
: Tiempo de espera de conexión del nodo del clúster;cluster-announce-ip
: IP del nodo del clúster, complete la IP del host;cluster-announce-port
: Puerto de mapeo de nodos de clúster;cluster-announce-bus-port
: Puerto de bus del nodo del clúster.
Cada nodo del clúster de Redis debe abrir dos conexiones TCP . Un puerto TCP de Redis normal que se utiliza para proporcionar servicios a los clientes, como 6379. También hay un puerto basado en el puerto 6379 más 10000, como 16379.
El segundo puerto se utiliza para el bus del clúster, que es un canal de comunicación de nodo a nodo que utiliza un protocolo binario. Los nodos utilizan el bus del clúster para la detección de fallas, actualizaciones de configuración, autorización de conmutación por error, etc. El cliente nunca debe intentar comunicarse con el puerto de bus del clúster, solo comunicarse con el puerto de comando normal de Redis, pero asegúrese de que ambos puertos en el firewall estén abiertos; de lo contrario, el nodo del clúster de Redis no podrá comunicarse.
En 192.168.10.10
la máquina, redis-cluster
ejecute el siguiente comando en el directorio:
for port in `seq 6371 6373`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
En 192.168.10.11
la máquina, redis-cluster
ejecute el siguiente comando en el directorio:
for port in `seq 6374 6376`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
Los dos comandos anteriores de shell para significan crear directorios y archivos relacionados con 6371 ~ 6376 en un bucle.
En el 192.168.10.10
comando de la máquina de ejecución para ver los resultados de la siguiente manera, si no hay un tree
comando para instalar yum install -y tree
.
En el 192.168.10.11
comando de la máquina de ejecución para ver los resultados de la siguiente manera.
El siguiente contenido son los detalles del archivo de configuración de cada nodo.
============================== 192.168.10.10 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.conf
port 6371
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6371
cluster-announce-bus-port 16371
port 6372
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6372
cluster-announce-bus-port 16372
port 6373
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6373
cluster-announce-bus-port 16373
============================== 192.168.10.10 ==============================
============================== 192.168.10.11 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{4..6}/conf/redis.conf
port 6374
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6374
cluster-announce-bus-port 16374
port 6375
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6375
cluster-announce-bus-port 16375
port 6376
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6376
cluster-announce-bus-port 16376
============================== 192.168.10.11 ==============================
Crear contenedor de Redis
Crea un contenedor
El 6371 ~ 6376
mapeo de Redis del puerto 6 de la computadora host entre contenedores, el directorio del catálogo dentro de la embarcación host y el mapeo (montaje de directorio). Recuerde especificar el modo de red, utilizando un host
modo de red.
Al 192.168.10.10
ejecutar la siguiente máquina de comandos:
for port in $(seq 6371 6373); do \
docker run -di --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
Al 192.168.10.11
ejecutar la siguiente máquina de comandos:
for port in $(seq 6374 6376); do \
docker run -di --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
En la 192.168.10.10
máquina a realizar docker ps -n 3
para ver si se ha creado el contenedor.
En la 192.168.10.11
máquina a realizar docker ps -n 3
para ver si se ha creado el contenedor.
Crear clúster de Redis
No ingrese a un nodo contenedor e ingrese /usr/local/bin/
al directorio:
# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
A continuación, podemos usar los siguientes comandos para crear un clúster de Redis Cluster.
redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
Aparece un mensaje de solicitud de selección, ingrese sí , el resultado es el siguiente:
El clúster se crea correctamente de la siguiente manera:
El siguiente contenido es la información detallada que se devuelve cuando se crea el clúster, es decir, todo el contenido de las dos imágenes anteriores.
root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.11:6376 to 192.168.10.10:6371
Adding replica 192.168.10.10:6373 to 192.168.10.11:6374
Adding replica 192.168.10.11:6375 to 192.168.10.10:6372
M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371
slots:[0-5460] (5461 slots) master
M: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372
slots:[10923-16383] (5461 slots) master
S: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373
replicates 7013270480d37eeab79b9cd0272e934d4548136a
M: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374
slots:[5461-10922] (5462 slots) master
S: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375
replicates ac805b90b6e20e26dc4268454bb2855beea6cc19
S: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376
replicates 299cf79ddafc83dced27f628f1f82dac483fbc4e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.10.10:6371)
M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375
slots: (0 slots) slave
replicates ac805b90b6e20e26dc4268454bb2855beea6cc19
S: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373
slots: (0 slots) slave
replicates 7013270480d37eeab79b9cd0272e934d4548136a
S: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376
slots: (0 slots) slave
replicates 299cf79ddafc83dced27f628f1f82dac483fbc4e
M: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Hasta ahora, se ha creado un clúster de Redis Cluster de alta disponibilidad, como se muestra en la figura siguiente, el clúster contiene 6 nodos de Redis, 3 maestros y 3 esclavos. Los tres nodos maestros asignarán ranuras para procesar las solicitudes de comando del cliente, y el nodo esclavo se puede usar para reemplazar el nodo maestro después de que falle el nodo maestro.
Ver el estado del clúster
Primero ingresamos al contenedor y luego verificamos el estado del clúster a través de algunos comandos de uso común en el clúster.
# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
Verificar el estado del clúster
redis-cli -a 1234 --cluster check 192.168.10.11:6375
Ver información del clúster e información del nodo
# 连接至集群某个节点
redis-cli -c -a 1234 -h 192.168.10.11 -p 6376
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
COLOCAR TOMAR
Para realizar la escritura y la lectura en el nodo 6371, los comandos son los siguientes:
# 进入容器并连接至集群某个节点
docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 1234 -h 192.168.10.10 -p 6371
# 写入数据
set name mrhelloworld
set aaa 111
set bbb 222
# 读取数据
get name
get aaa
get bbb
No se preocupe, déjeme explicar el proceso de operación en la imagen de arriba:
- Primero ingrese al contenedor y conéctese a un nodo en el clúster;
- Luego ejecute el primer comando set
set name mrhelloworld
, laname
clave se calcula de acuerdo con la función hash[5798]
. La distribución de las ranuras entorno de clúster actuales son:[0-5460] 6371节点
,,[5461-10922] 6374节点
,[10923-16383] 6372节点
lo que la clave se le asigna a la memoria 6374 nodo; - Veamos el segundo comando set
set aaa
, donde podemos tener algunas dudas, ¿por qué no ver elaaa
valor del enlace obtenido por la función hash después de la operación? Debido a que fui redirigido al nodo 6374 e inserté datos, si todavía hay datos insertados en este momento, sucede que el valor de la clave después del cálculo de la función hash todavía está dentro del rango del nodo, entonces los datos se pueden insertar directamente; - Seguido por el tercer comando set
set bbb
, labbb
clave se calcula según la función hash y el valor obtenido[5287]
, por lo que el almacenamiento de la clave se asigna al nodo 6371 ; - Luego está la operación de lectura En el cuarto comando
get name
, laname
clave[5798]
es redirigida al nodo 6374 para lectura de acuerdo con el valor obtenido después de la operación de función hash ; - El quinto comando
get aaa
,aaa
el valor obtenido después de que se calcula la clave de acuerdo con la función hash, también está en el nodo 6374 , que se lee directamente; - El sexto comando
get bbb
, labbb
clave[5287]
se redirige al nodo 6371 para lectura de acuerdo con el valor obtenido después de la operación de la función hash .
A través de la operación anterior aprendimos que name
la clave de almacenamiento se asigna a los 6374 nodos, si un nodo se conecta directamente al 6374 y obtiene el valor de ¿qué pasará? Así es, no es necesario redirigir el nodo, porque los datos están en el nodo, por lo que se leen directamente.
Conexión del cliente
Finalmente, llegue a una ola de operaciones de conexión de clientes, cualquier nodo, y vea si puede acceder al clúster de Redis Cluster de manera externa.