Modo centinela para alta disponibilidad de Redis

1.1 Resumen

El método de tecnología de conmutación maestro-esclavo es: cuando el servidor maestro está inactivo, es necesario cambiar manualmente un servidor esclavo al servidor maestro, lo que requiere una intervención manual, que requiere mucho tiempo y mano de obra, y también provoca la servicio no esté disponible durante un período de tiempo. Esta no es una forma recomendada y, con mayor frecuencia, priorizamos el modo centinela.

1.2 Modo Centinela

El modo centinela es un modo especial que primero Redisproporciona el comando del centinela. El centinela es un proceso independiente. Como proceso, se ejecutará de forma independiente. RedisEl principio es que Sentinel supervisa varias Redisinstancias que se ejecutan mediante el envío de comandos y la espera de que el servidor responda.
inserte la descripción de la imagen aquí
Los centinelas aquí tienen dos propósitos:

  • Al enviar un comando, el Redisservidor vuelve a monitorear su estado de ejecución, incluido el servidor maestro y el servidor esclavo.
  • Cuando el centinela detecta el tiempo de inactividad, lo cambiará masterautomáticamente y luego notificará a otros servidores esclavos a través del modo de publicación-suscripción, modificará el archivo de configuración y les permitirá cambiar el host.slavemaster

Sin embargo, cuando un proceso centinela Redismonitorea el servidor, puede haber problemas, por lo que podemos usar múltiples centinelas para monitorear. El seguimiento también se realizará entre cada centinela, formando así un modo multicentinela.

Describa el (failover)proceso de conmutación por error en palabras. Suponiendo que el servidor principal está inactivo, el centinela 1detecta el resultado primero y el sistema no procede de inmediato. failoverEs solo que el centinela 1cree subjetivamente que el servidor principal no está disponible, y este fenómeno se convierte en un fuera de línea subjetivo. Cuando los siguientes centinelas también detecten que el servidor principal no está disponible y el número alcanza un cierto valor, se realizará una votación entre los centinelas y el resultado de la votación será iniciado por un centinela para failoveroperar. Después de que el cambio sea exitoso, cada centinela cambiará el host desde el servidor que monitorea a través del modelo de publicación-suscripción.Este proceso se llama objetivo fuera de línea. De esta manera todo es transparente para el cliente.

1.3 RedisConfigurar el modo centinela

Configure 3un servidor centinela y un servidor 1maestro - 2esclavo Redispara demostrar este proceso.

Tipo de servicio ¿Es el servidor maestro? dirección IP Puerto
Dilo otra vez 192.168.11.128 6379
Dilo otra vez no 192.168.11.129 6379
Dilo otra vez no 192.168.11.130 6379
Centinela - 192.168.11.128 26379
Centinela - 192.168.11.129 26379
Centinela - 192.168.11.130 26379

inserte la descripción de la imagen aquí
Primero configure el servidor maestro-esclavo de Redis, modifique el archivo redis.conf de la siguiente manera

# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.11.128 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456

slaveofEl contenido anterior es principalmente para configurar el servidor Redis, y el servidor esclavo tiene una configuración y contraseña más que el servidor maestro .

Configure 3un centinela, y la configuración de cada centinela es la misma. RedisHay un sentinel.confarchivo en el directorio de instalación, copyuno para modificar

# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

Lo anterior desactiva el modo protegido para facilitar las pruebas.

Con las modificaciones anteriores, podemos ingresar Redisal directorio del directorio de instalación srce iniciar el servidor y centinela con los siguientes comandos

# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf

Preste atención al orden de inicio. (192.168.11.128)El primero es el proceso de servicio del host Redis, luego se inicia el proceso de servicio del esclavo y finalmente se inicia 3el proceso de servicio de un centinela.

JavaModo centinela utilizado en 1.4

/**
 * 测试Redis哨兵模式
 * @author liu
 */
public class TestSentinels {
    
    
    @SuppressWarnings("resource")
    @Test
    public void testSentinel() {
    
    
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.11.128:26379",
                "192.168.11.129:26379","192.168.11.130:26379"));
        // 创建连接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
        // 获取客户端
        Jedis jedis = pool.getResource();
        // 执行两个命令
        jedis.set("mykey", "myvalue");
        String value = jedis.get("mykey");
        System.out.println(value);
    }
}

Lo anterior se usa Jedispara el uso, y también se puede usar Springpara la configuración RedisTemplate.

        <bean id = "poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!-- 最大空闲数 -->
            <property name="maxIdle" value="50"></property>
            <!-- 最大连接数 -->
            <property name="maxTotal" value="100"></property>
            <!-- 最大等待时间 -->
            <property name="maxWaitMillis" value="20000"></property>
        </bean>
        
        <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
            <constructor-arg name="sentinelConfig" ref="sentinelConfig"></constructor-arg>
            <property name="password" value="123456"></property>
        </bean>
        
        <!-- JDK序列化器 -->
        <bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
        
        <!-- String序列化器 -->
        <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        
        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="connectionFactory"></property>
            <property name="keySerializer" ref="stringRedisSerializer"></property>
            <property name="defaultSerializer" ref="stringRedisSerializer"></property>
            <property name="valueSerializer" ref="jdkSerializationRedisSerializer"></property>
        </bean>
        
        <!-- 哨兵配置 -->
        <bean id="sentinelConfig" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
            <!-- 服务名称 -->
            <property name="master">
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <property name="name" value="mymaster"></property>
                </bean>
            </property>
            <!-- 哨兵服务IP和端口 -->
            <property name="sentinels">
                <set>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.128"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.129"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.130"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                </set>
            </property>
        </bean>

1.5 Otros elementos de configuración del modo Sentinel

elemento de configuración Tipo de parámetro efecto
port entero Iniciar el puerto del proceso centinela
dir directorio de carpetas Carpeta temporal del servicio de proceso de Sentinel, el valor predeterminado es /tmpasegurarse de que tenga permisos de escritura.
sentinel down-after-milliseconds <nombre del servicio><milisegundos (entero)> Cuando el centinela está monitoreando el Redisservicio, cuando el Redisservicio no puede responder dentro de un número predeterminado de milisegundos, el tiempo fuera de línea subjetivo considerado por un solo centinela, el valor predeterminado es30000(30秒)
sentinel parallel-syncs <nombre del servicio><número de servidores (entero)> Especifica cuántos Redisservicios pueden sincronizar el nuevo host. En términos generales, cuanto menor sea el número, mayor será el tiempo de sincronización y cuanto mayor sea el número, mayores serán los requisitos de recursos de red.
sentinel failover-timeout <nombre del servicio><milisegundos (entero)> Especifica el número de milisegundos permitidos para la conmutación por error. Después de este tiempo, se considera que la conmutación por error ha fallado. El valor predeterminado es 3minutos.
sentinel notification-script <nombre del servicio><ruta del script> Especifica el script de alarma que se invocará cuando se sentineldetecte que redisla instancia a la que apunta la instancia supervisada no es normal. Este elemento de configuración es opcional y se usa más comúnmente

sentinel down-after-millisecondsEl elemento de configuración es solo un centinela que pensará que el host no está disponible después de que el centinela aún no obtenga una respuesta después del tiempo especificado. No es así para otros Centinelas. El centinela grabará este mensaje, cuando el centinela que tiene el subjetivo fuera de línea alcance sentinel monitorel número configurado, iniciará una votación y procederá failover, en este momento el centinela reescribirá Redisel archivo de configuración del centinela para adaptarlo a las necesidades de la nueva escena.

Supongo que te gusta

Origin blog.csdn.net/weixin_42039228/article/details/123653696
Recomendado
Clasificación