Как установить и настроить кластер Redis в Ubuntu 16.04
Если у вас возникает сложность с самостоятельной установкой и настройкой Redis вы можете воспользоваться готовым решением: VPS с установленным Redis
Кластеры Redis стали популярным инструментом для кэшей, очередей и многого другого из-за его способности к масштабированию и скорости. Это руководство направлено на создание кластера с использованием трех линод для демонстрации шардинга. Затем вы будете продвигать раба на хозяина - страховку, на случай неудачи.
Redis как хранилище в памяти позволяет выполнять очень быстрые операции, такие как подсчет, кэширование, создание очередей и многое другое. Настройка кластера значительно повышает надежность Redis за счет уменьшения точки сбоев.
Перед началом работы рекомендуем ознакомиться со следующим:
Установка Redis на каждом VPS
В зависимости от вашей версии Linux, Redis может быть установлен через менеджер пакетов. Только Redis 3.0 и выше поддерживает кластеризацию. Шаги ниже для установки последней стабильной ветки Redis.- Установите зависимости:
sudo apt-get update && sudo apt-get upgrade sudo apt install make gcc libc6-dev tcl
ЗаметкаВ качестве альтернативы, вы можете использовать
build-essential
для загрузки зависимостей для Redis. - Из документации скачайте текущую стабильную ветку, затем извлеките:
wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable sudo make install
- Убедитесь, что установка прошла успешно, запустив:
Если установка прошла успешно, консоль выведет:make test
\ o / Все тесты пройдены без ошибок!
- Повторите установку для каждого сервера, который будет частью кластера.
Настройка Master и ведомые узлы
Это руководство вручную соединяет каждого ведущего и подчиненного устройства через три Линода. Рассмотрите возможность использования tmux для управления несколькими терминальными окнами.Хотя в официальной документации рекомендуется создавать шесть узлов, в этом руководстве будет использоваться минимум три узла со следующей топологией:

В этой настройке используются три линода с двумя экземплярами сервера Redis для каждого линода. Вы должны убедиться, что каждый хост независим, а затем рассмотреть возможность использования дополнительных узлов, если необходимо поддерживать требования к времени безотказной работы.
- SSH на сервер 1 . Перейдите, чтобы
redis-stable/
затем скопироватьredis.conf
. Файлы конфигурации в этом руководстве названы в соответствии с рисунком выше:cp redis.conf c_slave.conf mv redis.conf a_master.conf
- В
a_master.conf
, прокомментируйтеbind
директиву и включите режим кластера. Порты в этом примере будут в диапазоне от 6379 до 6381.- /redis-stable/a_master.conf
1 2 3 4 5 6 7
# bind 127.0.0.1 protected-mode no port 6379 pidfile /var/run/redis_6379.pid cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000
предосторожностьУзлу в кластере Redis требуется определенный порт и порт выше 10000. В этом случае оба порта TCP 6379 и 16379 должны быть открыты. Убедитесь, что iptables или ufw настроены правильно.
- В
c_slave.conf
конфигурации будет аналогичным, за исключением обновления номера порта.redis-trib.rb
будет использоваться позже, чтобы сконфигурировать это в ведомое устройство для соответствующего мастера, а не вslaveof
директиву.- /redis-stable/c_slave.conf
1 2 3 4 5 6 7
# bind 127.00.1 protected-mode no port 6381 pidfile /var/run/redis_6381.pid cluster-enabled yes cluster-config-file nodes-6381.conf cluster-node-timeout 15000
- Повторите этот процесс для двух оставшихся линодов, указав номера портов для всех пар «ведущий-ведомый».
сервер Мастер рабыня 1 6379 6381 2 6380 6379 3 6381 6380
Соедините Master и Slave
Репликация master / slave может быть достигнута на трех узлах путем запуска двух экземпляров сервера Redis на каждом узле.- SSH на сервер 1 и запустите два экземпляра Redis.
redis-server redis-stable/a_master.conf redis-server redis-stable/c_slave.conf
- Замените
a_master.conf
иc_slave.conf
соответствующим файлом конфигурации для оставшихся двух серверов. Все мастер-узлы должны запускаться в режиме кластера.- Сервер 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
_._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.1 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in cluster mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 10352 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'
Создать кластер, используя встроенный скрипт Ruby Постоянная ссылка
На этом этапе каждый Linode содержит два независимых мастер-узла. Установка Redis поставляется со скриптом Ruby,~/redis-stable/src/
который может помочь в создании и управлении кластером.- Если Ruby еще не установлен, его можно найти в вашем менеджере пакетов:
sudo apt install ruby
- Установите драгоценный камень Redis:
gem install redis
- Перейдите в исходный каталог, чтобы запустить скрипт.
redis-stable/src/redis-trib.rb create ip.of.server1:6379 ip.of.server2:6380 ip.of.server3:6381
- Примите конфигурацию с тремя мастерами. Успешная настройка кластера вернет следующее сообщение:
>>>Creating cluster >>>Performing hash slots allocation on 3 nodes... Can I set the above configuration? (type 'yes' to accept): yes >>> 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. [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
- Просмотреть все текущие узлы, подключенные к кластеру с помощью
redis-cli
инструмента. В-c
флаг определяет подключение к кластеру.
Это вернет список узлов в данный момент в кластере, идентифицированных по их идентификатору и ведомым устройствам - если таковые имеются. Чтобы покинуть интерфейс, нажмитеredis-cli -c -h ip.of.server1 -p 6379 ip.of.server1>CLUSTER NODES
exit
.ip.of.server1>exit
ЗаметкаКлючевые слова Redis не чувствительны к регистру. Тем не менее, для ясности они написаны как все столицы в этом руководстве.
Добавить рабов
Этотredis-trib
инструмент также можно использовать для добавления новых узлов в кластер. Используя остальные три узла, вы можете вручную добавить их к выбранному мастеру.- Подключите ведомого к данному мастеру, используя
add-note
и указанныйmaster_id
.
Полученный результат должен быть:./redis-trib.rb add-node --slave --master-id [master_id_c] ip.of.server1:6381 ip.of.server3:6381
>>> Adding node ip.of.server1:6381 to cluster ip.of.server3:6381 >>> Performing Cluster Check (using node ip.of.server3:6381) M: [master_id_c] ip.of.server3:6381 slots:10923-16383 (5461 slots) master 0 additional replica(s) M: [master_id_a] ip.of.server1:6379 slots:0-5460 (5461 slots) master 0 additional replica(s) M: [master_id_b] ip.of.server2:6380 slots:5461-10922 (5462 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node ip.of.server1:6381 to make it join the cluster. Waiting for the cluster to join... >>> Configure node as replica of ip.of.server3:6381.
- Повторите эти действия для оставшихся двух узлов.
./redis-trib.rb add-node --slave --master-id [master_id_a] ip.of.server2:6379 ip.of.server1:6379 ./redis-trib.rb add-node --slave --master-id [master_id_b] ip.of.server3:6380 ip.of.server2:6380
Добавить пар ключ-значение и сегментирование
Интерфейс командной строки предлагает способSET
и GET
ключи, в дополнение к возвращению информации о кластере. На локальном компьютере вы можете подключиться к любому из главных узлов и изучить некоторые свойства кластера Redis.- Повторите установку Redis на локальном компьютере, если это необходимо. Убедитесь, что настройки брандмауэра позволяют устанавливать связь с главными узлами.
redis-cli -c -h ip.of.server1 -p 6379
- Используйте
CLUSTER INFO
команду, чтобы просмотреть информацию о состоянии кластера, такую как размер, слоты хеша и сбои, если таковые имеются.ip.of.server1:6379>CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:8375 cluster_stats_messages_pong_sent:9028 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:17404 cluster_stats_messages_ping_received:9022 cluster_stats_messages_pong_received:8376 cluster_stats_messages_meet_received:6 cluster_stats_messages_received:17404
- Чтобы проверить репликацию master / slave,
INFO replication
возвращает информацию о slave.ip.of.server1:6379>INFO replication role:master connected_slaves:1 slave0:ip=ip.of.server1,port=6381,state=online,offset=213355,lag=1 master_replid:cd2e27cba094f2e7ed38b0313dcd6a979ab29b7a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:213355 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:197313 repl_backlog_histlen:16043
- Чтобы продемонстрировать шардинг, вы можете установить несколько примеров пар ключ-значение. Установка ключа перенаправит значение в хэш-слот среди трех главных узлов.
ip.of.server1:6379> SET John Adams -> Redirected to slot [6852] located at ip.of.server2:6380 OK ip.of.server2:6380> SET James Madison -> Redirected to slot [2237] located at ip.of.server1:6379 OK ip.of.server1:6379> SET Andrew Jackson -> Redirected to slot [15768] located at ip.of.server3:6381 OK ip.of.server3:6381> GET John -> Redirected to slot [6852] located at ip.of.server2:6380 "Adams" ip.of.server2:6380>
Повысить раба до мастера
Исходя из текущей топологии, кластер останется подключенным, если один из линод выйдет из строя. В этот момент вы можете ожидать, что ведомое устройство перейдет в мастер с реплицированными данными.
- Добавьте пару ключ-значение.
Ключip.of.server1:6379> SET foo bar -> Redirected to slot [12182] located at ip.of.server3:6381 OK ip.of.server3:6381> GET foo "bar"
foo
добавляется к ведущему устройству на сервере 3 и реплицируется на ведомое устройство на сервере 1 . - Если сервер событий 3 не работает, ведомое устройство на сервере 1 станет ведущим, а кластер останется подключенным.
ip.of.server1:6379> CLUSTER NODES [slave_id_b] ip.of.server3:6380@16380 slave,fail [master_id_b] 1502722149010 1502722147000 6 connected [slave_id_a] ip.of.server2:6379@16379 slave [master_id_a] 0 1502722242000 5 connected [slave_id_c_promoted] ip.of.server1:6381@16381 master - 0 1502722241651 7 connected 10923-16383 [master_id_b] ip.of.server2:6380@16380 master - 0 1502722242654 2 connected 5461-10922 [master_id_c] ip.of.server3:6381@16381 master,fail - 1502722149010 1502722145402 3 connected [master_id_a] ip.of.server1:6379@16379 myself,master - 0 1502722241000 1 connected 0-5460
- Ключ, который ранее находился в слоте хэша на сервере 3 , пара ключ-значение теперь хранится на сервере 1 .
ip.of.server1:6379> GET foo -> Redirected to slot [12182] located at ip.of.server1:6381 "bar"
Комментариев 0