Docker-compose быстро создает кластер высокой доступности в режиме Redis Sentinel.

Redis

     Эта установка использует версию Ubuntu Server X64 18.04 LTS для установки среды кластера Redis, а узлы кластера — 1 главный и 2 подчиненных.
PS: Из-за нехватки ресурсов для развертывания на той же машине используется мостовая сеть docker-compose.Обычно производство должно избегать такой ситуации, когда яйца складываются в корзину.

Конфигурация среды

Имя процессора IP Роль система ЦП/память диск
redsis-master 192.168.23.134 хозяин Ubuntu Server 18.04 2 ядра 4G 40G
redsis-slave-1 192.168.23.134 от Ubuntu Server 18.04 2 ядра 4G 40G
redsis-slave-2 192.168.23.134 от Ubuntu Server 18.04 2 ядра 4G 40G
redis-sentinel-1 192.168.23.134 хозяин Ubuntu Server 18.04 2 ядра 4G 40G
redis-sentinel-2 192.168.23.134 от Ubuntu Server 18.04 2 ядра 4G 40G
redis-sentinel-3 192.168.23.134 от Ubuntu Server 18.04 2 ядра 4G 40G

redis

# docker-compose.yml
version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass redis_pwd  --masterauth redis_pwd
    ports:
      - 6380:6379
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd

docker-compose upЗапустить, добавить параметр -d для достижения фоновой работы, специально распечатываю сюда лог

# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
d48696ad6446        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6382->6379/tcp   redis-slave-2
49e9f9057550        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6381->6379/tcp   redis-slave-1
18cf4f04ebbc        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6380->6379/tcp   redis-master

Были запущены три контейнера Redis, и открытые номера портов были 6382, 6381 и 6380 (связанные с настройками портов в файле оркестрации).

Redis Sentinel

    Система Redis Sentinel используется для управления несколькими серверами (экземплярами) Redis. Система выполняет следующие три задачи:

  • монитор(Мониторинг): Sentinel будет постоянно проверять, правильно ли работают ваш главный и подчиненный серверы.
  • напоминать(Уведомление): Sentinel может отправлять уведомления администраторам или другим приложениям через API, когда возникает проблема с одним из отслеживаемых серверов Redis.
  • Автоматический переход на другой ресурс(Автоматический переход на другой ресурс): когда главный сервер не работает должным образом, Sentinel запускает операцию автоматического перехода на другой ресурс, он обновляет один из подчиненных серверов вышедшего из строя главного сервера до нового главного сервера и позволяет другим подчиненным серверам вышедшего из строя главный сервер Вместо этого реплицируйте новый главный сервер; когда клиент пытается подключиться к вышедшему из строя главному серверу, кластер также возвращает клиенту адрес нового главного сервера, чтобы кластер мог использовать новый главный сервер вместо отказавший сервер.

    Redis Sentinel — этоРаспределенные системы, вы можете запускать несколько процессов Sentinel (прогресс) в архитектуре, используяпротоколы сплетенполучать информацию о том, находится ли первичный сервер в автономном режиме, и использоватьпротоколы соглашениячтобы решить, выполнять ли автоматический переход на другой ресурс и какой ведомый сервер выбрать в качестве нового ведущего. Хотя Redis Sentinel выпущен как отдельный исполняемый файл redis-sentinel, на самом деле это просто сервер Redis, работающий в специальном режиме.Вы можете запустить Redis Sentinel, указав параметр --sentinel при запуске обычного сервера Redis.

# docker-compose.yml 
version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_default

смонтировать том данных

# sentinel1.conf
port 26379
dir /tmp# 172.18.0.2是redis的主节点ip 
# 指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 172.18.0.2 (docker inspect [containerIP]可以获取) 端口号为 6379
# 将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
sentinel monitor mymaster 172.18.0.2 6379 2 
# 
sentinel auth-pass mymaster redis_pwd
# 指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 30000
# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 
# 这个数字越小, 完成故障转移所需的时间就越长。
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

Так как есть три машины и три копии, имя здесь должно соответствовать томам файла аранжировки,docker-compose up -dбегать

# -> 输出如下
NTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                NAMES
bbd6093a6bdf        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
69eb1530998d        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
019a72cdbc95        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26381->26379/tcp   redis-sentinel-3
d48696ad6446        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6382->6379/tcp               redis-slave-2
49e9f9057550        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6381->6379/tcp               redis-slave-1
18cf4f04ebbc        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6380->6379/tcp               redis-master

проверять

redis

docker exec -it 18cf4f04ebbc redis-cliв основную машину

# -> info之前先进行授权 auth redis_pwd(requirepass的值)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
# 从节点信息
slave0:ip=172.18.0.4,port=6379,state=online,offset=2492,lag=0
slave1:ip=172.18.0.3,port=6379,state=online,offset=2492,lag=1
master_replid:2760a09897b3d82d0e304265fcc2b030e1740300
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2492
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2492

exitпокидать

Redis Sentinel

docker exec -it 69eb1530998d bash

 1) "name"
 2) "mymaster"
 3) "ip"
 4) "172.18.0.2"
 5) "port"
 6) "6379"
 7) "runid"
 8) "3fc8105ab0b5722b5deb266b9fdaddfa15a7e683"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "747"
19) "last-ping-reply"
20) "747"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "8849"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "69121"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> 


Записывать

Redis включить аутентификацию по паролю

     Redis master-slave и clsuter поддерживают аутентификацию по паролю.Redis Включает аутентификацию по паролю Обязательно настройте одновременные настройки.. Если главный узел установил аутентификацию входа в систему по требованию, при переключении ведущий-ведомый ведомый сначала должен отправить сообщение ping на главный узел при синхронизации данных с главным узлом, чтобы определить, активен ли главный узел, а затем контролировать, работает ли порт мастер-узла подключен и отправляет данные.Для синхронизации будет использоваться логин-пароль мастера и т. д. В противном случае вы не сможете войти в систему, а в ответ лог сообщит об ошибке. Другими словами, masterauth ведомого устройства и requirepass мастера соответствуют друг другу, поэтому рекомендуется установить для masterauth и requirepass каждого узла один и тот же пароль, когда redis включает пароль для снижения затрат на эксплуатацию и техническое обслуживание. Конечно, можно установить и по-другому, только обратите внимание на соответствие masterauth слейв-ноды и requirepass мастер-ноды.

  • мастер-роль: В основном устанавливается для ведомого узла, соответствующего ведущему, и используется при синхронизации данных ведомого узла.

  • роль requirepass: Ограничение разрешений на вход в систему. Требуемый пароль каждого узла Redis может быть независимым и различным.

Субъективный нижестоящий и объективный нижестоящий

     Из указанного выше конфигурации параметр «Вниз-Миллисекунды» указывает количество миллисекундных, требуемых Sentinel, чтобы рассмотреть сервер вниз. Если сервер не возвращает ответ на команду Ping, отправленную stentinel в пределах заданного количества миллисекунды, или возвращает ошибку, то Sentinel отмечает сервер как субъективно вниз (отделение для коротких)

  • Субъективно не работает (сокращенно SDOWN) относится к автономной оценке, сделанной одним экземпляром Sentinel на сервере.
  • Объективно отключен (сокращенно ODOWN) означает, что сервер находится в автономном режиме после того, как несколько экземпляров Sentinel вынесли оценку SDOWN на одном и том же сервере и взаимодействуют друг с другом с помощью команды SENTINEL is-master-down-by-addr. (Sentinel может спросить другого Sentinel, считает ли он, что данный сервер не работает, отправив команду SENTINEL is-master-down-by-addr другому Sentinel.) Объективные условия в автономном режиме.Только для главного сервера

Если сервер не находится в течение времени, указанного параметром master-down-after-milliseconds, верните действительный ответ [+PONG, -LOADING или -MASTERDOWN] Sentinel, отправившему ему команду PING. ], Sentinel пометит сервер как субъективно отключенный.

Команда часового

  • ПИНГ: возвращает ПОНГ.
  • Мастера SENTINEL: список всех отслеживаемых мастеров и текущее состояние этих мастеров.
  • SENTINEL slaves: Список всех ведомых для данного мастера и текущее состояние этих ведомых. SENTINEL get-master-addr-by-name : возвращает IP-адрес и номер порта главного сервера с заданным именем. Если этот основной сервер выполняет операцию перехода на другой ресурс или операция перехода на другой ресурс для этого основного сервера завершена, эта команда возвращает IP-адрес и номер порта нового основного сервера.
  • Сброс SENTINEL: сбрасывает все главные серверы, имена которых соответствуют заданному шаблону. Параметр шаблона представляет собой шаблон в стиле Glob. Операция сброса очищает все текущее состояние главного сервера, включая текущую отработку отказа, и удаляет все подчиненные серверы и Sentinel главного сервера, которые были обнаружены и связаны до сих пор.
  • Отказоустойчивость SENTINEL: при сбое основного сервера принудительно запустить автоматическую отработку отказа, не спрашивая мнения других Sentinels (но Sentinel, инициировавший отработку отказа, отправит новую конфигурацию другим Sentinels, а другие Sentinels будут выполнять соответствующие действия на основе эту конфигурацию. обновить).

конец

Про успех теста! ! ! 🍾🍾🍾

PS: для внешнего доступа необходимо настроить redis.conf