Редис-сентинель Режим
Введение в Redis Sentinel
Redis Sentinel — высокодоступная реализация Redis. Sentinel — это инструмент для управления несколькими экземплярами Redis, который может отслеживать, уведомлять и автоматически переключаться на отказоустойчивость Redis.
Основные возможности Redis Sentinel
Система Sentinel для Redis используется для управления несколькими серверами Redis (экземплярами), и система выполняет следующие три задачи:
-
Мониторинг: Sentinel постоянно проверяет правильность работы ваших главных и подчиненных серверов.
-
Уведомление: Sentinel может отправлять уведомления администраторам или другим приложениям через API, когда возникает проблема с одним из контролируемых серверов Redis.
-
Автоматическое переключение при сбое: если основной сервер не работает должным образом, Sentinel запустит операцию автоматической миграции сбоя, которая обновит отказавший главный сервер с сервера на новый основной сервер и позволит отказавшему основному серверу Другой с сервера скопировать новый первичный сервер; когда клиент пытается подключиться к отказавшему первичному серверу, кластер также возвращает адрес нового первичного сервера клиенту, чтобы кластер мог использовать новый первичный сервер вместо отказоустойчивого сервера.
Развертывание Redis Sentinel
Конфигурация кластера Redis
Кластер Redis запускается
Скопируйте 3 файла конфигурации reids.conf
cp redis.conf /home/redis/redis6379.conf
cp redis.conf /home/redis/redis6380.conf
cp redis.conf /home/redis/redis6381.conf
Измените файл конфигурации reids.conf, взяв за пример конфигурацию 6379.
vim redis6379.conf
#启用后台启动
daemonize yes
#pidfile位置
pidfile "/home/redis/6379/redis6379.pid"
#端口
port 6379
#日志文件位置
logfile "/home/redis/6379/log6379.log"
#rdb备份文件名称
dbfilename "dump6379.rdb"
#rdb备份文件路径
dir "/home/redis/rdb/"
Измените файл конфигурации redis-slave, измените и освойте вышеуказанную конфигурацию, файлы конфигурации 6380, 6381, добавьте следующее
slaveof 192.168.126.200 6379
Сначала запустите службу Master, затем запустите службу SLAVE.
master节点服务
./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.126.200,port=6380,state=online,offset=975350,lag=1
slave1:ip=192.168.126.200,port=6381,state=online,offset=975350,lag=1
master_repl_offset:975495
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:975494
slave节点服务
./redis-cli -p 6380
# Replication
role:slave
master_host:192.168.126.200
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:989499
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
Конфигурация кластера Sentinel
Записать файл конфигурации Sentinel, основную конфигурацию
touch sentinel1.conf
vim sentinel1.conf
#Sentinel节点的端口
port 26379
dir "/home/redis/sentinel"
daemonize yes
logfile "sentinel-26379.log"
#当前Sentinel节点监控 127.0.0.1:6379 这个主节点
#代表判断主节点失败至少需要2个Sentinel节点节点同意
#mymaster是主节点的别名
sentinel monitor mymaster 192.168.126.200 6380 2
#每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000
#当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向>新的主节点发起复制操作的从节点个数为1
sentinel leader-epoch mymaster 1
#故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000
#同理创建修改sentinel2.conf、sentinel3.conf配置文件
Запустить 3 дозорных службы
./redis-sentinel /home/redis/sentinel1.conf
./redis-sentinel /home/redis/sentinel2.conf
./redis-sentinel /home/redis/sentinel3.conf
SpringBoot в сочетании с режимом Redis Sentinel
Создайте проект SpringBoot и добавьте зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--redis连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
Основной файл конфигурации application.yml
server:
port: 80
spring:
redis:
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认为8
max-active: 8
# 连接池中的最大空闲连接 默认为8
max-idle: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认为-1
max-wait: -1ms
# 连接池中的最小空闲连接 默认为 0
min-idle: 0
sentinel:
# 主节点的别名
master: mymaster
# sentinel服务的ip和端口
nodes: 192.168.126.200:26379,192.168.126.200:26380,192.168.126.200:26381
Программные вызовы
@RestController
@RequestMapping("/redis")
public class RedisController {
// 使用SpringBoot封装的RestTemplate对象
@Autowired
RedisTemplate<String, String> redisTemplate;
@RequestMapping("/get")
public String get(String key) {
String value = redisTemplate.opsForValue().get(key);
return value;
}
@RequestMapping("/set")
public String set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
return "success";
}
}
Имитация отказа
После закрытия мастер-службы redis вручную фон попытается повторно подключиться.Когда максимальное время ожидания превышено и соединение не может быть установлено, часовой переизберет нового мастера, а программа получит новый мастер-узел и предоставит службы чтения и записи.