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 Redis
proporciona el comando del centinela. El centinela es un proceso independiente. Como proceso, se ejecutará de forma independiente. Redis
El principio es que Sentinel supervisa varias Redis
instancias que se ejecutan mediante el envío de comandos y la espera de que el servidor responda.
Los centinelas aquí tienen dos propósitos:
- Al enviar un comando, el
Redis
servidor 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á
master
automá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.slave
master
Sin embargo, cuando un proceso centinela Redis
monitorea 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 1
detecta el resultado primero y el sistema no procede de inmediato. failover
Es solo que el centinela 1
cree 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 failover
operar. 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 Redis
Configurar el modo centinela
Configure 3
un servidor centinela y un servidor 1
maestro - 2
esclavo Redis
para demostrar este proceso.
Tipo de servicio | ¿Es el servidor maestro? | dirección IP | Puerto |
---|---|---|---|
Dilo otra vez | sí | 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 |
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
slaveof
El 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 3
un centinela, y la configuración de cada centinela es la misma. Redis
Hay un sentinel.conf
archivo en el directorio de instalación, copy
uno 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 Redis
al directorio del directorio de instalación src
e 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 3
el proceso de servicio de un centinela.
Java
Modo 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 Jedis
para el uso, y también se puede usar Spring
para 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 /tmp asegurarse de que tenga permisos de escritura. |
sentinel down-after-milliseconds |
<nombre del servicio><milisegundos (entero)> | Cuando el centinela está monitoreando el Redis servicio, cuando el Redis servicio 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 Redis servicios 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 3 minutos. |
sentinel notification-script |
<nombre del servicio><ruta del script> | Especifica el script de alarma que se invocará cuando se sentinel detecte que redis la 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-milliseconds
El 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 monitor
el número configurado, iniciará una votación y procederá failover
, en este momento el centinela reescribirá Redis
el archivo de configuración del centinela para adaptarlo a las necesidades de la nueva escena.