Docker crea un entorno de clúster de Redis Cluster

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.10y 192.168.10.11realice 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.10El redis-cluster.tmplcontenido 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.11El redis-cluster.tmplcontenido 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, configure bind ipo 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.10la máquina, redis-clusterejecute 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.11la máquina, redis-clusterejecute 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.10comando de la máquina de ejecución para ver los resultados de la siguiente manera, si no hay un treecomando para instalar yum install -y tree.

En el 192.168.10.11comando 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 ~ 6376mapeo 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 hostmodo de red.

Al 192.168.10.10ejecutar 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.11ejecutar 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.10máquina a realizar docker ps -n 3para ver si se ha creado el contenedor.

En la 192.168.10.11máquina a realizar docker ps -n 3para 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 , 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, la nameclave 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 el aaavalor 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, la bbbclave 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, la nameclave [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, aaael 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, la bbbclave [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 namela 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.

Supongo que te gusta

Origin blog.csdn.net/Cursh_programmer/article/details/111598031
Recomendado
Clasificación