Как установить и настроить кластер Redis в Ubuntu 16.04

Кластеры Redis стали популярным инструментом для кэшей, очередей и многого другого из-за его способности к масштабированию и скорости. Это руководство направлено на создание кластера с использованием трех линод для демонстрации шардинга. Затем вы будете продвигать раба на хозяина - страховку, на случай неудачи.
Redis как хранилище в памяти позволяет выполнять очень быстрые операции, такие как подсчет, кэширование, создание очередей и многое другое. Настройка кластера значительно повышает надежность Redis за счет уменьшения точки сбоев.
Перед началом работы рекомендуем ознакомиться со следующим:

Установка Redis на каждом VPS

В зависимости от вашей версии Linux, Redis может быть установлен через менеджер пакетов. Только Redis 3.0 и выше поддерживает кластеризацию. Шаги ниже для установки последней стабильной ветки Redis.
  1. Установите зависимости:

    sudo apt-get update && sudo apt-get upgrade
    sudo apt install make gcc libc6-dev tcl
    
    ЗаметкаВ качестве альтернативы, вы можете использовать build-essentialдля загрузки зависимостей для Redis.
  2. Из документации скачайте текущую стабильную ветку, затем извлеките:

    wget http://download.redis.io/redis-stable.tar.gz
    tar xvzf redis-stable.tar.gz
    cd redis-stable
    sudo make install
    
  3. Убедитесь, что установка прошла успешно, запустив:

    make test
    
    Если установка прошла успешно, консоль выведет:
    \ o / Все тесты пройдены без ошибок!
  4. Повторите установку для каждого сервера, который будет частью кластера.

Настройка Master и ведомые узлы 

Это руководство вручную соединяет каждого ведущего и подчиненного устройства через три Линода. Рассмотрите возможность использования tmux для управления несколькими терминальными окнами.
Хотя в официальной документации рекомендуется создавать шесть узлов, в этом руководстве будет использоваться минимум три узла со следующей топологией:
Рисунок, демонстрирующий ведущий-ведомый на трех серверах
В этой настройке используются три линода с двумя экземплярами сервера Redis для каждого линода. Вы должны убедиться, что каждый хост независим, а затем рассмотреть возможность использования дополнительных узлов, если необходимо поддерживать требования к времени безотказной работы.
  1. SSH на сервер 1 . Перейдите, чтобы redis-stable/затем скопировать redis.conf. Файлы конфигурации в этом руководстве названы в соответствии с рисунком выше:

    cp redis.conf c_slave.conf
    mv redis.conf a_master.conf
    
  2. В 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 настроены правильно.
  3. В 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
  4. Повторите этот процесс для двух оставшихся линодов, указав номера портов для всех пар «ведущий-ведомый».
    серверМастеррабыня
    163796381
    263806379
    363816380

Соедините Master и Slave

Репликация master / slave может быть достигнута на трех узлах путем запуска двух экземпляров сервера Redis на каждом узле.
  1. SSH на сервер 1 и запустите два экземпляра Redis.

    redis-server redis-stable/a_master.conf
    redis-server redis-stable/c_slave.conf
    
  2. Замените 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/который может помочь в создании и управлении кластером.
  1. Если Ruby еще не установлен, его можно найти в вашем менеджере пакетов:

    sudo apt install ruby
    
  2. Установите драгоценный камень Redis:

    gem install redis
    
  3. Перейдите в исходный каталог, чтобы запустить скрипт.

    redis-stable/src/redis-trib.rb create ip.of.server1:6379 ip.of.server2:6380 ip.of.server3:6381
    
  4. Примите конфигурацию с тремя мастерами. Успешная настройка кластера вернет следующее сообщение:

    >>>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.
    
  5. Просмотреть все текущие узлы, подключенные к кластеру с помощью 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инструмент также можно использовать для добавления новых узлов в кластер. Используя остальные три узла, вы можете вручную добавить их к выбранному мастеру.
  1. Подключите ведомого к данному мастеру, используя 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.
    
  2. Повторите эти действия для оставшихся двух узлов.

    ./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.
  1. Повторите установку Redis на локальном компьютере, если это необходимо. Убедитесь, что настройки брандмауэра позволяют устанавливать связь с главными узлами.

    redis-cli -c -h ip.of.server1 -p 6379
    
  2. Используйте 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
    
  3. Чтобы проверить репликацию 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
    
  4. Чтобы продемонстрировать шардинг, вы можете установить несколько примеров пар ключ-значение. Установка ключа перенаправит значение в хэш-слот среди трех главных узлов.

    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>
    

Повысить раба до мастера

Исходя из текущей топологии, кластер останется подключенным, если один из линод выйдет из строя. В этот момент вы можете ожидать, что ведомое устройство перейдет в мастер с реплицированными данными.
Рисунок, демонстрирующий отказ server3
  1. Добавьте пару ключ-значение.

    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 .
  2. Если сервер событий 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. Ключ, который ранее находился в слоте хэша на сервере 3 , пара ключ-значение теперь хранится на сервере 1 .

    ip.of.server1:6379> GET foo
    -> Redirected to slot [12182] located at ip.of.server1:6381
    "bar"
    
Не забудьте убедиться, что настройки брандмауэра соответствуют всем экземплярам Redis . Имеются дополнительные функции, такие как добавление дополнительных узлов, создание нескольких ведомых устройств или перераспределение ресурсов, которые выходят за рамки этого документа. Для получения дополнительных указаний обратитесь к официальной документации Redis, чтобы узнать, как реализовать эти функции.

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

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0