Logo
Englika

Как запустить несколько экземпляров Redis

Как запустить несколько экземпляров Redis

Несмотря на то, что Redis поддерживает несколько баз данных, каждую БД удобнее хранить в отдельном экземпляре Redis, чтобы она имела свой собственный файл с дампом и отдельный конфиг. Чтобы реализовать это, можно запускать Redis либо в различных docker-контейнерах, либо в разных systemd-юнитах. Давайте рассмотрим второй вариант.

Честно говоря, это настолько просто, что даже нет смысла писать об этом, однако, к сожалению, инструкции в большинстве статей не работают, если вы подключаетесь к Redis, используя unix-сокет. Даже если вы собираетесь использовать TCP-порт, это действительно не самая лучшая идея, например, хранить конфиги для различных экземпляров Redis в одной директории.

Безопаснее хранить разные экземпляры Redis в разных директориях, включая pid, unixsocket, logfile, dir (рабочая директория), и конфиг тоже, особенно, учитывая, что "redis-server can write to its own config file when in cluster mode" (цитата из redis-server.service).

Давайте подготовим 2 отдельные директории для нового экземпляра Redis с теми же правами доступа и владельцами.

# Для хранения конфига
mkdir /etc/redis-rspamd
chown redis:redis /etc/redis-rspamd
chmod 2770 /etc/redis-rspamd

# Для хранения дампа
mkdir /var/lib/redis-rspamd
chown redis:redis /var/lib/redis-rspamd
chmod 0750 /var/lib/redis-rspamd

Чтобы создать новый экземпляр Redis вам нужно просто создать новый Redis конфиг и systemd-юнит с небольшими изменениями.

Скопируйте ваш Redis конфиг.

cp -p /etc/redis/redis.conf /etc/redis-rspamd/redis.conf

Измените в файле /etc/redis-rspamd/redis.conf следующие строки.

pidfile /run/redis-rspamd/redis-server.pid
unixsocket /run/redis-rspamd/redis.sock
dir /var/lib/redis-rspamd
# logfile /var/log/redis-rspamd/redis-server.log

Если вы подключаетесь к Redis, используя TCP-порт, также измените его здесь.

Скопируйте systemd-юнит.

cp -p /lib/systemd/system/redis-server.service /lib/systemd/system/redis-server-rspamd.service

Измените в файле /lib/systemd/system/redis-server-rspamd.service следующие строки.

ExecStart=/usr/bin/redis-server /etc/redis-rspamd/redis.conf
PIDFile=/run/redis-rspamd/redis-server.pid
RuntimeDirectory=redis-rspamd
ReadWriteDirectories=-/var/lib/redis-rspamd
ReadWriteDirectories=-/var/log/redis-rspamd
ReadWriteDirectories=-/run/redis-rspamd
ReadWriteDirectories=-/etc/redis-rspamd
Alias=redis-rspamd.service

Перезапустите systemd daemon.

systemctl daemon-reload

Убедитесь, что новый экземпляр Redis запущен и будет включен при загрузке.

systemctl start redis-rspamd
systemctl enable redis-rspamd

Вот и все. Второй экземпляр Redis хранит все в других директориях и не имеет доступа к первому экземпляру (см. ReadOnlyDirectories и ReadWriteDirectories в итоговом файле redis-server-rspamd.service). Вы можете создать сколько угодно экземпляров Redis тем же способом.

Важно отметить, что если вы не измените RuntimeDirectory, то выполнение systemctl stop redis-rspamd приведет к изчезновению unix-сокета, который принадлежит первому экземпляру Redis, потому что runtime-директория удаляется автоматически после остановки systemd-юнита. В то же время, systemctl status redis и pid aux | grep redis скажут, что все в порядке – systemd-юнит первого экземпляра Redis активен и процесс запущен, однако unix-сокета не будет, не смотря на то, что вы останавливали только второй экземпляр Redis. Поэтому критически важно изменять RuntimeDirectory для каждого экземпляра Redis также, как и ReadWriteDirectories.

Похожие статьи

Как получить N строк для каждой группы в SQL

Давайте предположим, что вы разрабатываете главную страницу в интернет-магазине. На этой странице должны отображаться категории товаров с 10 товарами в каждой. Как сделать запрос к базе данных? Какие индексы нужно создать, чтобы ускорить выполнение...

Как получить N строк для каждой группы в SQL