Установка и настройка Redis Cluster в Debian Wheezy
Aug 31, 2015 14:51 · 1031 words · 5 minute read
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 закончена, в следующей статье рассмотрим миграцию слотов между нодами и решардинг.