Instalación de Redis 5.0.0 (clúster)

1. Comparación de las soluciones de clúster de Redis

Modo centinela

En versiones anteriores a redis3.0, los clústeres se implementan generalmente mediante el uso de la herramienta centinela para monitorear el estado del nodo maestro. Si el nodo maestro es anormal, cambiará entre maestro y esclavo, y usará un esclavo como maestro. La configuración del centinela es un poco complicada y su desempeño Tiene un desempeño general en todos los aspectos como alta disponibilidad, especialmente cuando hay una interrupción transitoria de acceso en el momento de la conmutación maestro-esclavo , y el modo centinela tiene un solo nodo maestro para proporcionar servicios externos, que no pueden admitir una alta concurrencia, y la memoria de un solo nodo maestro no es adecuada. Si la configuración es demasiado grande, hará que el archivo persistente sea demasiado grande y afectará la eficiencia de la recuperación de datos o maestro. sincronización de esclavos.

Modo de clúster de alta disponibilidad

El clúster de redis es un clúster de servidores distribuidos compuesto por múltiples clústeres de nodos maestro-esclavo . Tiene las características de replicación, alta disponibilidad y fragmentación . El clúster de Redis no necesita centinela para completar las funciones de eliminación de nodos y conmutación por error. Cada nodo debe configurarse en modo clúster, este modo no es el centro de los nodos del clúster, escalable horizontalmente, de acuerdo con el archivo de texto oficial llamado extendido linealmente a decenas de miles de nodos (el funcionario recomendó no más de 1000 nodos). El rendimiento y la alta disponibilidad del clúster de redis son mejores que el modo centinela de la versión anterior, y la configuración del clúster es muy simple.

Dos, construcción de clústeres de alta disponibilidad de Redis

2.1. Instalar redis independiente

El propósito es obtener comandos ejecutables relevantes y archivos de configuración originales, consulte: Instalación de Redis 5.0.0 (versión independiente)

2.2. Instalar cluster redis

El clúster de redis necesita al menos tres nodos maestros (para garantizar que la elección del maestro cumpla con la mayoría de los principios, tenga en cuenta: solo el nodo maestro tiene derecho a voto, el principio se explica a continuación ), construimos tres nodos maestros aquí, y construir un nodo esclavo para cada maestro Hay un total de 6 nodos redis. Aquí, se utilizan tres máquinas para implementar seis instancias de redis, cada máquina tiene un maestro y un esclavo. Los pasos para construir un clúster son los siguientes:

Paso 1: Cree una carpeta redis-cluster en / usr / local en la primera máquina, luego cree dos carpetas debajo y copie los comandos ejecutables en el directorio del clúster.

(1) mkdir -p / usr / local / redis-cluster

(2) mkdir 9001 、 mkdir 9004

(3) cp / usr / local / redis / bin -r / usr / local / redis-cluster (copie el comando ejecutable en el directorio del clúster)

Paso 2: Copie el archivo de configuración original anterior redis.conf a 9001 y modifique el siguiente contenido:

(1)daemonize yes
(2)port 9001(分别对每个机器的端口号进行设置)
(3)dir /usr/local/redis-cluster/9001/data/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
(4)cluster-enabled yes(启动集群模式)
(5)cluster-config-file nodes-9001.conf(集群节点信息文件,这里900x最好和port对应上)
(6)cluster-node-timeout 5000
(7)# bind 127.0.0.1(去掉bind绑定访问ip信息)
(8)protected-mode  no   (关闭保护模式)
(9)appendonly yes
 # 如果要设置密码需要增加如下配置:
(10)requirepass smsp     (设置redis访问密码)
(11)masterauth smsp      (设置集群节点间访问密码,跟上面一致)

Paso 3: Copie el archivo de configuración modificado a 9002, modifique los números de puerto en los elementos 2, 3 y 5, puede reemplazarlos en lotes:

:% s / cadena de origen / cadena de destino / g

Paso 4: Las otras dos máquinas también deben realizar los pasos anteriores, la segunda máquina usa 9002 y 9005, y la tercera máquina usa 9003 y 9006

Paso 5: Inicie 6 instancias de redis respectivamente y luego verifique si el inicio es exitoso

(1) cd / usr / local / redis-cluster

(2) bin / redis-server 900 * / redis.conf

(3) ps -ef | grep redis para ver si el inicio es exitoso

Paso 6: use redis-cli para crear el clúster redis completo (la versión anterior del clúster redis5 se implementa mediante el script ruby ​​redis-trib.rb)

(1) cd / usr / local / redis-cluster

(2) bin / redis-cli -a smsp --cluster create --cluster-replicas 1 10.18.4.25:9001 10.18.4.26:9002 10.18.4.27:9003 10.18.4.25:9004 10.18.4.26:9005 10.18.4.27: 9006

--cluster-replicas 1 representa la creación de un nodo de servidor esclavo para cada nodo de servidor maestro creado

Nota: Al ejecutar --cluster create para crear un clúster, pueden ocurrir las siguientes situaciones:

[root@smsp-dev001-10 redis-cluster]# bin/redis-cli -a smsp --cluster create --cluster-replicas 1 10.18.4.25:9001 10.18.4.26:9002 10.18.4.27:9003 10.18.4.25:9004 10.18.4.26:9005 10.18.4.27:9006
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 10.18.4.26:9005 to 10.18.4.25:9001
Adding replica 10.18.4.25:9004 to 10.18.4.26:9002
Adding replica 10.18.4.27:9006 to 10.18.4.27:9003
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
M: 2349fa527eebba23a4c2749c56c9ee5a8b0d1812 10.18.4.25:9001
   slots:[0-5460] (5461 slots) master
M: 763dfcc1f6bc3a613dc56e77b09b787544297b99 10.18.4.26:9002
   slots:[5461-10922] (5462 slots) master
M: bc03f9c9c6fba1ac80f7073a46956cbbcf4b48dc 10.18.4.27:9003
   slots:[10923-16383] (5461 slots) master
S: 5c31db9af7f63807fb06c17e8707a0486eee88c5 10.18.4.25:9004
   replicates 763dfcc1f6bc3a613dc56e77b09b787544297b99
S: 2251b04ada543220f2e485a7371160fa2da6a059 10.18.4.26:9005
   replicates bc03f9c9c6fba1ac80f7073a46956cbbcf4b48dc
S: 95fe85fcf724be804d1ff4a3769ddeffa9f7c4ad 10.18.4.27:9006
   replicates 2349fa527eebba23a4c2749c56c9ee5a8b0d1812
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
# 在此等待n久集群节点还是没有成功加入集群,而节点启动端口号也已经在防火墙中开放了
Waiting for the cluster to join
.....................................................................................
.....................................................................................
......................................................

Después de esperar mucho tiempo, el nodo del clúster aún no pudo unirse al clúster y el número de puerto de inicio del nodo se abrió en el firewall.

Motivo: la espera a que el clúster se una al clúster de redis ha estado esperando

Solución: ¡Abra el puerto de inicio + puerto 10000 en el firewall también!

Al mismo tiempo, cada vez que el clúster se crea sin éxito, se generarán archivos relacionados con el clúster en el directorio de datos del nodo. Antes de volver a crear el clúster, primero debe cerrar el nodo y luego eliminar todos los archivos en los datos directorio para recrear el clúster!

Paso 7: Verifique el clúster:

(1) Simplemente conéctese a cualquier cliente: ./redis-cli -c -h -p (-a contraseña del servidor de acceso, -c significa modo de clúster, especifique la dirección IP y el número de puerto)

  Por ejemplo: bin / redis-cli -a smsp -c -h 10.18.4.25 -p 9001

(2) Realice la verificación: información del clúster (ver información del clúster), nodos del clúster (ver lista de nodos)

(3) Realice la verificación de la operación de datos

(4) Para apagar el clúster, debe apagar uno por uno, use el comando: bin / redis-cli -a smsp -c -h 10.18.4.25 -p 900 * shutdown

2.3. Operación Java Redis Cluster

Con la ayuda del cliente java jedis de redis, se pueden operar los clústeres anteriores. Las coordenadas de maven de la versión jedis se referencian de la siguiente manera:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

Es muy sencillo escribir el código para acceder al clúster de redis en Java, como se muestra a continuación:

package com.ceair.screen.flight.service;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 访问redis集群
 * @author smsp
 *
 */
public class RedisCluster
{
    public static void main(String[] args) throws IOException
    {
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("10.18.4.25", 9001));
        jedisClusterNode.add(new HostAndPort("10.18.4.26", 9002));
        jedisClusterNode.add(new HostAndPort("10.18.4.27", 9003));
        jedisClusterNode.add(new HostAndPort("10.18.4.25", 9004));
        jedisClusterNode.add(new HostAndPort("10.18.4.26", 9005));
        jedisClusterNode.add(new HostAndPort("10.18.4.27", 9006));

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(10);
        config.setTestOnBorrow(true);
        //connectionTimeout:指的是连接一个url的连接等待时间
        //soTimeout:指的是连接上一个url,获取response的返回等待时间
        JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "smsp", config);
        System.out.println(jedisCluster.set("student", "zhuge"));
        System.out.println(jedisCluster.set("age", "19"));

        System.out.println(jedisCluster.get("student"));
        System.out.println(jedisCluster.get("age"));

        jedisCluster.close();
    }
}

El efecto de la operación es el siguiente:

OK OK smsp 19

 

3. Análisis del principio del clúster de Redis

Redis Cluster divide todos los datos en 16384 ranuras (ranuras) y cada nodo es responsable de algunas de las ranuras. La información de la ranura se almacena en cada nodo.

Cuando el cliente de Redis Cluster se conecta al clúster, también obtendrá una copia de la información de configuración de la ranura del clúster y la almacenará en caché localmente en el cliente. De esta forma, cuando el cliente quiere encontrar una clave, puede localizar directamente el nodo de destino. Al mismo tiempo, debido a que la información de la ranura puede ser inconsistente entre el cliente y el servidor (la información correspondiente de la ranura y el nodo cambiará cuando se amplíe y contraiga la capacidad), también se necesita un mecanismo de corrección para realizar la verificación y ajuste de la información de la ranura.

Algoritmo de ubicación de ranuras

De forma predeterminada, Cluster aplicará un hash al valor de la clave utilizando el algoritmo crc16 para obtener un valor entero y luego usará este valor entero en el módulo 16384 para obtener la ranura específica.

HASH_SLOT = CRC16 (clave) mod 16384

Salto de reubicación

Cuando el cliente envía una instrucción a un nodo incorrecto, el nodo encontrará que la ranura donde se encuentra la clave de la instrucción no está administrada por sí mismo. En este momento, enviará una instrucción de salto especial al cliente para que lleve el nodo. dirección de la operación de destino. Dígale al cliente que se conecte a este nodo para obtener datos. Después de que el cliente recibe la instrucción, además de saltar al nodo correcto para operar, también actualizará y corregirá el caché de la tabla de mapeo de ranuras local sincrónicamente, y todas las claves subsiguientes usarán la nueva tabla de mapeo de ranuras.

Fluctuación de la red

Las redes de salas de ordenadores del mundo real a menudo no son tranquilas y, a menudo, tienen varios pequeños problemas. Por ejemplo, la fluctuación de la red es un fenómeno muy común. De repente, algunas conexiones se vuelven inaccesibles y luego vuelven a la normalidad pronto.

Para resolver este problema, Redis Cluster proporciona una opción cluster-node-timeout , lo que significa que cuando un nodo está fuera de conexión durante un tiempo de espera continuo, se puede determinar que el nodo está defectuoso y requiere un conmutador maestro-esclavo. Sin esta opción, la fluctuación de la red provocará frecuentes conmutaciones maestro-esclavo (duplicación de datos).

 

Supongo que te gusta

Origin blog.csdn.net/u014225733/article/details/103043024
Recomendado
Clasificación