HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: linux, nosql, linux-администрирование, redis, кластер, система управления базами данных, линукс, docker swarm</p>
1 <p>Теги: linux, nosql, linux-администрирование, redis, кластер, система управления базами данных, линукс, docker swarm</p>
2 <p>Здравствуй,<strong>$username</strong>! В данной статье мы рассмотрим, как развернуть полноценный кластер<strong>Redis</strong>с отказоустойчивостью и миграцией мастера между нодами в случае его падения. Всё это мы будем делать в кластере<strong>Docker SWARM</strong>.</p>
2 <p>Здравствуй,<strong>$username</strong>! В данной статье мы рассмотрим, как развернуть полноценный кластер<strong>Redis</strong>с отказоустойчивостью и миграцией мастера между нодами в случае его падения. Всё это мы будем делать в кластере<strong>Docker SWARM</strong>.</p>
3 <p>Как мы уже знаем, Redis представляет собой базу данных класса<strong>NoSQL</strong>с открытым исходным кодом и работает со структурой данных типа<strong>ключ:значение</strong>. Также данный продукт часто используется для хранения кэшей и в качестве брокера сообщений.<strong>Redis sentinel</strong>предоставляет мониторинг, оповещение и переключение в автоматическом режиме мастера.</p>
3 <p>Как мы уже знаем, Redis представляет собой базу данных класса<strong>NoSQL</strong>с открытым исходным кодом и работает со структурой данных типа<strong>ключ:значение</strong>. Также данный продукт часто используется для хранения кэшей и в качестве брокера сообщений.<strong>Redis sentinel</strong>предоставляет мониторинг, оповещение и переключение в автоматическом режиме мастера.</p>
4 <p><strong>Docker swarm</strong>является оркестратором, который позволяет управлять, декларативно описывать и обслуживать сервисы (контейнеры). Также он предоставляет встроенный сервис дискавери, при помощи которого все сервисы могут находить друг друга без проблем.</p>
4 <p><strong>Docker swarm</strong>является оркестратором, который позволяет управлять, декларативно описывать и обслуживать сервисы (контейнеры). Также он предоставляет встроенный сервис дискавери, при помощи которого все сервисы могут находить друг друга без проблем.</p>
5 <h2>Немного вводной информации по проекту</h2>
5 <h2>Немного вводной информации по проекту</h2>
6 <p>К нашему кластеру<strong>Redis</strong>будет подключаться некое приложение, которое будет писать и читать данные. Также это приложение умеет определять, является ли<strong>Redis</strong>, к которому оно подключилось,<strong>мастером</strong>, а в случае, если это<strong>slave</strong>, оно будет переключаться на другой. Кластер<strong>Docker swarm</strong>состоит из трёх нод (swarm-1, swarm-2, swarm-3); swarm-1 является лидером кластера и на ней будет запущен<strong>redis-мастер</strong>.</p>
6 <p>К нашему кластеру<strong>Redis</strong>будет подключаться некое приложение, которое будет писать и читать данные. Также это приложение умеет определять, является ли<strong>Redis</strong>, к которому оно подключилось,<strong>мастером</strong>, а в случае, если это<strong>slave</strong>, оно будет переключаться на другой. Кластер<strong>Docker swarm</strong>состоит из трёх нод (swarm-1, swarm-2, swarm-3); swarm-1 является лидером кластера и на ней будет запущен<strong>redis-мастер</strong>.</p>
7 <p>Чтобы определённый контейнер размещался на конкретной ноде, нам необходимо использовать<strong>теги</strong>. Сделать это можно следующим образом:</p>
7 <p>Чтобы определённый контейнер размещался на конкретной ноде, нам необходимо использовать<strong>теги</strong>. Сделать это можно следующим образом:</p>
8 docker node update --label-add redis-master=true swarm-1 --label-add redis-master=true - добавляем тег к нужной ноде, тег представляет собой ключ-значение.<p>Теги для всего кластера будут такими:</p>
8 docker node update --label-add redis-master=true swarm-1 --label-add redis-master=true - добавляем тег к нужной ноде, тег представляет собой ключ-значение.<p>Теги для всего кластера будут такими:</p>
9 docker node update --label-add redis-master=true swarm-1 docker node update --label-add redis-slave-1=true swarm-2 docker node update --label-add redis-slave-2=true swarm-3 docker node update --label-add redis-sentinel-1=true swarm-1 docker node update --label-add redis-sentinel-2=true swarm-2 docker node update --label-add redis-sentinel-3=true swarm-3<p>Посмотреть какие теги установлены на нодах мы можем следующей командой:</p>
9 docker node update --label-add redis-master=true swarm-1 docker node update --label-add redis-slave-1=true swarm-2 docker node update --label-add redis-slave-2=true swarm-3 docker node update --label-add redis-sentinel-1=true swarm-1 docker node update --label-add redis-sentinel-2=true swarm-2 docker node update --label-add redis-sentinel-3=true swarm-3<p>Посмотреть какие теги установлены на нодах мы можем следующей командой:</p>
10 docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'<p>Функционала просмотра тегов из коробки нет, поэтому и придётся прибегнуть к таким ухищрениям.</p>
10 docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'<p>Функционала просмотра тегов из коробки нет, поэтому и придётся прибегнуть к таким ухищрениям.</p>
11 <p>Таким образом, на схеме размещение контейнеров будет следующим:</p>
11 <p>Таким образом, на схеме размещение контейнеров будет следующим:</p>
12 <h2>Собираем контейнеры</h2>
12 <h2>Собираем контейнеры</h2>
13 <p>Теперь пришло время собирать контейнеры с нашими сервисами. Сначала мы создадим<strong>Dockerfile</strong>для каждого сервиса. За основу мы возьмем<strong>Ubuntu 18.04</strong>. Dockerfile для redis-master будет следующим:</p>
13 <p>Теперь пришло время собирать контейнеры с нашими сервисами. Сначала мы создадим<strong>Dockerfile</strong>для каждого сервиса. За основу мы возьмем<strong>Ubuntu 18.04</strong>. Dockerfile для redis-master будет следующим:</p>
14 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY redis.conf /etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/redis.conf"]<p>Файл конфигурации будет redis.conf. Он будет выглядеть следующим образом:</p>
14 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY redis.conf /etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/redis.conf"]<p>Файл конфигурации будет redis.conf. Он будет выглядеть следующим образом:</p>
15 <p>Стоит обратить внимание, что у нас не настроена авторизация в Redis, поэтому к нашему кластеру может подключиться абсолютно любой. Будьте с этим внимательны!</p>
15 <p>Стоит обратить внимание, что у нас не настроена авторизация в Redis, поэтому к нашему кластеру может подключиться абсолютно любой. Будьте с этим внимательны!</p>
16 <p>Dockerfile для redis-slave будет аналогичен redis-master:</p>
16 <p>Dockerfile для redis-slave будет аналогичен redis-master:</p>
17 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY redis.conf /etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/redis.conf"]<p>А конфигурация в файле redis.conf будет отличаться:</p>
17 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY redis.conf /etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/redis.conf"]<p>А конфигурация в файле redis.conf будет отличаться:</p>
18 bind 0.0.0.0 port 6379 slaveof redis-master 6379<p><strong>slaveof redis-master 6379</strong>- данной директивой мы указываем, к какому мастеру подключаться. Dockerfile для redis-sentinel будет отличаться от рассмотренных ранее:</p>
18 bind 0.0.0.0 port 6379 slaveof redis-master 6379<p><strong>slaveof redis-master 6379</strong>- данной директивой мы указываем, к какому мастеру подключаться. Dockerfile для redis-sentinel будет отличаться от рассмотренных ранее:</p>
19 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY sentinel.conf /etc/redis/sentinel.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/sentinel.conf", "--sentinel"]<p>Аналогично и файл конфигурации:</p>
19 FROM ubuntu:18.04 RUN apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install redis-server -y &amp;&amp; apt clean COPY sentinel.conf /etc/redis/sentinel.conf EXPOSE 6379 CMD ["redis-server", "/etc/redis/sentinel.conf", "--sentinel"]<p>Аналогично и файл конфигурации:</p>
20 bind 0.0.0.0 port 5000 sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 6000 sentinel parallel-syncs mymaster 1 logfile "/var/log/redis/redis-sentinel.log"<p>В конфигурационном файле указываем, что мы мониторим redis-master, который слушает порт 6379 и будет называть его mymaster.<strong>down-after-milliseconds mymaster</strong>указываем, через какое время мы считаем, что наш мастер "умер".<strong>failover-timeout</strong>указываем, через какое время начнёт работать failover.<strong>parallel-syncs</strong>указываем, сколько реплик будет переконфигурировано. Более подробно с описанием всех опций вы можете ознакомиться<a>здесь</a>.</p>
20 bind 0.0.0.0 port 5000 sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 6000 sentinel parallel-syncs mymaster 1 logfile "/var/log/redis/redis-sentinel.log"<p>В конфигурационном файле указываем, что мы мониторим redis-master, который слушает порт 6379 и будет называть его mymaster.<strong>down-after-milliseconds mymaster</strong>указываем, через какое время мы считаем, что наш мастер "умер".<strong>failover-timeout</strong>указываем, через какое время начнёт работать failover.<strong>parallel-syncs</strong>указываем, сколько реплик будет переконфигурировано. Более подробно с описанием всех опций вы можете ознакомиться<a>здесь</a>.</p>
21 <p><em>Во<a>второй части</a>нашей статьи мы продолжим развёртывание полноценного кластера<strong>Redis</strong>, поэтому не пропустите! И оставляйте комментарии!</em></p>
21 <p><em>Во<a>второй части</a>нашей статьи мы продолжим развёртывание полноценного кластера<strong>Redis</strong>, поэтому не пропустите! И оставляйте комментарии!</em></p>
22  
22