в debian, redis

Установка и настройка Redis Cluster в Debian Wheezy

redis
Redis (REmote DIctionary Server) — сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Начиная с версии 3.0 реализована поддержка Redis Cluster и, согласно заверениям разработчиков, значительно увеличено быстродействие.

Существует немало клиентов (полный список), а так как наш проект написан на php, то мы будем использовать phpredis. Давайте разберемся с установкой Redis в Debian Wheezy!

Сам Redis и PHP-клиент рекомендуют собирать из исходников, но в качестве альтернативы можно воспользоваться различными менеджерами пакетов (это более удачное решение с точки зрения сохранения конфигурации системы). Минус — в репозиториях может не оказаться нужной версии Redis.

Примечание. На момент написания статьи в репозитории wheezy доступна версия redis-server 2:2.4.14-1, в wheezy-backports версия redis-server 2:2.8.17-1~bpo70+2

Особенность Redis’а заключается в том, что это — однопоточный сервер, следовательно мы можем запустить несколько процессов Redis (например, по одному на каждое ядро процессора и каждый процесс будет прослушивать свой порт).

В данном примере рассмотрим создание кластера из 6 нод (3 мастера и 3 слейва) на одном сервере с операционной системой Debian Wheezy.

Подготовительные шаги:

  • если пакет tcl не установлен, устанавливаем его (тесты написаны на tcl):
aptitude install tcl
  • установим ruby (скрипт управления кластером написан на ruby):
aptitude install ruby
  • еще нам потребуется Redis-rb-клиент:
gem install redis

Приступим к установке Redis. Так как нам нужна версия не ниже 3.0, то воспользуемся рекомендациями разработчиков и разберемся как установить Redis из исходников:

  • установка Redis:
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
tar xzf redis-3.0.3.tar.gz
cd redis-3.0.3
make
make install
  • установка PHP-клиента:
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure
make && make install

Примечание. После установки phpredis не забываем выполнить /etc/init.d/apache2 restart

Для генерации конфигурационных файлов воспользуемся скриптом ../redis-3.0.3/utils/install_server.sh из архива с исходниками. Запускаем скрипт, вводим порт (7000-7005), на котором будет запущен Redis, остальные параметры оставляем по умолчанию.

./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 7000
Please select the redis config file name [/etc/redis/7000.conf]                         
Selected default - /etc/redis/7000.conf
Please select the redis log file name [/var/log/redis_7000.log] 
Selected default - /var/log/redis_7000.log
Please select the data directory for this instance [/var/lib/redis/7000] 
Selected default - /var/lib/redis/7000
Please select the redis executable path [/usr/bin/redis-server] 
Selected config:
Port           : 7000
Config file    : /etc/redis/7000.conf
Log file       : /var/log/redis_7000.log
Data dir       : /var/lib/redis/7000
Executable     : /usr/bin/redis-server
Cli Executable : /usr/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.

Примечание. Этот скрипт не только создает конфиги, но и генерирует init-скрипты (вида /etc/init.d/redis_<номер_порта>) для запуска/остановки процессов Redis.

Для создания Redis Cluster нам все же потребуется немного подправить сгенерированные конфиги. Для этого:

  • останавливаем все запущенные процессы Redis:
/etc/init.d/redis_<номер_порта> stop
  • переходим в каталог /etc/redis/:
cd /etc/redis/
  • в сгенерированных конфигах изменяем значения параметров на следующие:
appendonly yes
...
cluster-enabled yes
...
cluster-config-file nodes.conf
...
cluster-node-timeout 5000

Примечание. С помощью параметра bind можно указать IP-адрес, на котором Redis будет ожидать соединения. Начиная с версии 2.8 есть возможность указывать несколько IP-адресов через пробел.

  • запускаем процессы Redis:
/etc/init.d/redis_<номер_порта> start

Убедиться, что все процессы Redis запущены, можно командой:

ps ax | grep redis

Приступаем к созданию кластера — воспользуемся скриптом ../redis-3.0.3/src/redis-trib.rb из архива с исходниками.

  • создание Redis Cluster из отдельных инстансов:
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

Скрипт redis-trib предложит конфигурацию кластера и попросит с ней согласиться (ввести yes):

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 27474fd9d23ed041242d9fd6a4b39e261a277f85 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 45a4d11345a2389f853d0c052b131d8973012b13 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 4e658e187c05ce6fd45b307aee45a83d2515f6d5 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 37a55337a516424393207f8c94bc89af63f3e3f5 127.0.0.1:7003
   replicates 27474fd9d23ed041242d9fd6a4b39e261a277f85
S: af22eaa5f3f8fb2742d3d9dc643a31810d54ba83 127.0.0.1:7004
   replicates 45a4d11345a2389f853d0c052b131d8973012b13
S: f415cfc8b90861f5e0ccb7f2a15dccd525d1aa98 127.0.0.1:7005
   replicates 4e658e187c05ce6fd45b307aee45a83d2515f6d5
Can I set the above configuration? (type 'yes' to accept):

После подтверждения конфигурации Redis Cluster будет настроен, ноды(инстансы) будут объединены и начнут общаться друг с другом:

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 27474fd9d23ed041242d9fd6a4b39e261a277f85 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 45a4d11345a2389f853d0c052b131d8973012b13 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 4e658e187c05ce6fd45b307aee45a83d2515f6d5 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: 37a55337a516424393207f8c94bc89af63f3e3f5 127.0.0.1:7003
   slots: (0 slots) master
   replicates 27474fd9d23ed041242d9fd6a4b39e261a277f85
M: af22eaa5f3f8fb2742d3d9dc643a31810d54ba83 127.0.0.1:7004
   slots: (0 slots) master
   replicates 45a4d11345a2389f853d0c052b131d8973012b13
M: f415cfc8b90861f5e0ccb7f2a15dccd525d1aa98 127.0.0.1:7005
   slots: (0 slots) master
   replicates 4e658e187c05ce6fd45b307aee45a83d2515f6d5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Redis создает 16384 слота и равномерно их распределяет по нодам-мастерам. Проверить распределение можно командой:

redis-cli -p 7000 cluster nodes | grep master

Проверить работу созданного кластера можно с помощью redis-cli:

redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"

Для добавления новой ноды в Redis Cluster выполняем следующие шаги:

  • генерируем конфиг с помощью скрипта ../redis-3.0.3/utils/install_server.sh из архива с исходниками;
  • вносим необходимые правки в сгенерированный конфиг, запускаем новый процесс Redis;
  • используем redis-trib со следующими параметрами:
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

Примечание. Параметр 127.0.0.1:7006 — это новая созданная нода, параметр 127.0.0.1:7000 — уже созданный ранее кластер.

В примере выше новая нода будет добавлена в кластер в роли мастера. Для того, чтобы добавить в кластер ноду в роли слейва, необходимо указать дополнительный ключ --slave, например:

./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

В этом случае новая нода будет добавлена в кластер как слейв к случайно выбранному мастеру. Добавить ноду в роли слейва к конкретному мастеру можно указав --master-id мастера:

./redis-trib.rb add-node --slave --master-id 27474fd9d23ed041242d9fd6a4b39e261a277f85 127.0.0.1:7006 127.0.0.1:7000

Для удаления ноды из Redis Cluster воспользуемся следующей командой:

./redis-trib del-node 127.0.0.1:7000 f415cfc8b90861f5e0ccb7f2a15dccd525d1aa98

Примечание. Параметр 127.0.0.1:7000 — созданный кластер, f415cfc8b90861f5e0ccb7f2a15dccd525d1aa98 — id ноды для удаления

На этом установка и настройка Redis Cluster в Debian Wheezy закончена, в следующей статье рассмотрим миграцию слотов между нодами и решардинг.

Добавить комментарий

  1. Вроде неплохая стаття, спасибо.

    А в случае готовых собранных deb-пакетов насколько аналогичная процедура?

    Ну и использование redis-trib — это официальная рекомендация редиса?