Подробное и практическое описание Redis Cluster (продолжение)

Node.js Redis задняя часть сервер

Предыдущий отзыв

предыдущий постРеализация распределенной блокировки на основе RedisНаписал распределенную блокировку на основе реализации Redis. В распределенной среде одноточечный redis не будет использоваться для достижения высокой доступности и устойчивости к сбоям, по крайней мере, это redis master-slave. Для однопоточной работы redis слишком расточительно запускать только один экземпляр redis на физической машине, а одна машина redis, очевидно, таит в себе скрытую опасность единой точки отказа. Ресурсы памяти часто ограничены, и постоянно расширять память по вертикали нецелесообразно, поэтому горизонтально масштабируемое расширение требует взаимодействия нескольких хостов для предоставления услуг, то есть нескольких экземпляров Redis в распределенной среде.

в предыдущих статьяхУглубленное изучение и практика Redis ClusterЯ представил соответствующий контент Redis Cluster, Я нашел время, чтобы прочитать соответствующие документы и реализацию кластера Redis на официальном сайте Redis. Эта статья является продолжением той статьи, потому что автор недавно исследовал схему переключения master-slave redis на кластер redis, и расскажет о нескольких вариантах для кластера redis и практике работы кластера redis.

Вот несколько реализаций кластера Redis:

  • Также поддерживается разбиение клиентов, таких как Redis Java client jedis, с использованием согласованного хеширования.
  • Шардинг на основе прокси, такой как codis и Twemproxy
  • запрос маршрутизации, redis-кластер

Ниже мы представим эти решения по отдельности.

сегментация клиента

Redis Sharding — это метод кластеризации нескольких экземпляров Redis, широко используемый в отрасли до появления Redis Cluster. Основная идея заключается в использовании хеш-алгоритма для хэширования ключа данных Redis, и с помощью хеш-функции определенный ключ будет сопоставлен с конкретным узлом Redis. Java-клиент Redis управляет jedis и поддерживает функцию Redis Sharding, а именно ShardedJedis и ShardedJedisPool в сочетании с пулом кеша.

Sharding
Sharding

Redis Sentinel предоставляет функции мониторинга Redis и аварийного переключения в активном/резервном режиме для обеспечения высокой доступности системы. Когда основной Redis выходит из строя, резервный Redis вступает во владение и становится основным Redis для продолжения предоставления услуг. Мастер и резервная копия вместе образуют узел Redis, который обеспечивает высокую доступность узла за счет автоматического аварийного переключения.

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

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

Шардинг на основе прокси

Клиент отправляет запрос прокси-компоненту, прокси-сервер анализирует данные клиента, перенаправляет запрос нужному узлу и, наконец, возвращает результат клиенту.

Характеристики этого режима следующие:

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

Простая структурная схема выглядит следующим образом:

proxy
proxy

Основные компоненты: Twemproxy и Codis.

Twemproxy

Twemproxy, также называемый nutcraker, представляет собой программу прокси-сервера Redis и Memcache с открытым исходным кодом от Twitter. Как эффективный кеш-сервер, Redis имеет большую прикладную ценность. Однако, когда объем пользовательских данных увеличивается, необходимо запускать несколько экземпляров Redis.В настоящее время существует острая необходимость в инструменте для унифицированного управления несколькими экземплярами Redis, чтобы избежать неудобств и обслуживания, вызванных управлением всеми подключениями. на каждого клиента.Twemproxy родился для этой цели.

Twemproxy имеет следующие особенности:

  • быстрый
  • легкий
  • поддерживать постоянное соединение с сервером
  • Поддерживает автоматическое удаление отказавших узлов; вы можете установить время для повторного подключения узла, и вы можете установить, сколько раз нужно подключиться, чтобы удалить узел
  • Поддержка настройки HashTag; с помощью HashTag вы можете установить тот же тип ключа для сопоставления с одним и тем же экземпляром.
  • Сократите количество прямых соединений с Redis, поддерживайте длинные соединения с Redis и устанавливайте количество соединений между агентом и каждым Redis в фоновом режиме.
  • Благодаря собственному согласованному алгоритму хэширования он может автоматически разбивать данные на несколько экземпляров Redis в серверной части, поддерживает различные алгоритмы хеширования и может устанавливать вес экземпляров серверной части.В настоящее время Redis поддерживает следующие алгоритмы хеширования: one_at_a_time, md5 , crc16, crc32, fnv1_64, fnv1a_64, fnv1_32, fnv1a_32, hsieh, бормотание, дженкинс.
  • Поддержка запросов на конвейерную обработку redis, объединение нескольких запросов на подключение для формирования единых запросов на конвейерную обработку Reids для Redis.
  • Поддержка мониторинга состояния; можно установить IP-адрес и порт для мониторинга состояния, доступ к IP-адресу и порту можно получить в виде строки информации о состоянии в формате json; можно установить интервал обновления информации для мониторинга.

Официальный сайт TwemProxy представляет вышеуказанные функции. Использование TwemProxy может получить доступ к TwemProxy как к клиенту Redis. Однако Twitter уже давно отказался от обновления TwemProxy. Самая большая проблема Twemproxy заключается в том, что он не может плавно масштабироваться вверх/вниз. Еще одна болевая точка Twemproxy в том, что он не удобен в эксплуатации и обслуживании, и у него даже нет панели управления.

Codis

Codis — это кластерное решение Redis с открытым исходным кодом Wandoujia. Это распределенное решение Redis. Для приложений верхнего уровня нет существенной разницы между подключением к Codis Proxy и подключением к собственному серверу Redis. Можно использовать приложение верхнего уровня. как одномашинный Redis.Нижний уровень Codis будет обрабатывать переадресацию запросов, непрерывную миграцию данных и т. д. Все следующие вещи прозрачны для фронт-клиента, и можно просто считать, что обратное соединение является Сервис Redis с бесконечной памятью.

Текущая последняя версия Codis — codis-3.2, а codis-server основан на redis-3.2.8. Он состоит из следующих компонентов:

Codis
Кодис Архитектура

  • Codis Server: разработан на основе ветки redis-3.2.8. Добавлены дополнительные структуры данных для поддержки операций, связанных со слотами, и инструкций по переносу данных.
  • Codis Proxy: прокси-служба Redis, подключенная клиентом и реализующая протокол Redis. Ведет себя так же, как родной Redis (например, Twemproxy), за исключением того, что некоторые команды не поддерживаются (неподдерживаемый список команд).
  • Codis Dashboard: инструмент управления кластером, поддерживающий добавление, удаление и миграцию данных codis-proxy и codis-server. При изменении состояния кластера codis-dashboard поддерживает согласованность состояния всех codis-proxy в кластере. Для одного и того же бизнес-кластера одновременно может быть только 0 или 1 панель codis-dashboard; все изменения в кластере должны выполняться через codis-dashboard.
  • Codis Admin: инструмент командной строки для управления кластером. Может использоваться для управления codis-proxy, состоянием codis-dashboard и доступом к внешнему хранилищу.
  • Codis FE: интерфейс управления кластером. Несколько экземпляров кластера могут совместно использовать одну и ту же интерфейсную страницу отображения; Внутренний список codis-dashboard управляется через файл конфигурации, и файл конфигурации может обновляться автоматически.
  • Хранилище: предоставляет внешнее хранилище для состояния кластера. Предоставляет концепцию пространства имен, и разные кластеры будут организованы в соответствии с разными именами продуктов; в настоящее время предоставляются только три реализации Zookeeper, Etcd и Fs, но предоставляется абстрактный интерфейс для самостоятельного расширения.

Что касается конкретной установки и использования, смотрите официальный сайтCodisLabs, здесь не рассматривается.

Особенности Кодиса:

  • Codis поддерживает больше команд и в основном поддерживает команды Redis.
  • Стоимость миграции невелика, и переход на codis не вызывает особых проблем.Пока используемая команда redis находится в пределах диапазона, поддерживаемого codis, вы можете получить к ней доступ, изменив конфигурацию.
  • Инструменты эксплуатации и обслуживания, предоставляемые Codis, более удобны и предоставляют графический веб-интерфейс для управления кластером.
  • Поддержка многоядерного процессора, twemproxy может быть только одноядерным
  • Поддержка группового разделения, вы можете установить одного главного и несколько ведомых в группе, контролировать мастер и ведомый Redis через часовой, когда ведущий выходит из строя, ведомый автоматически переключается на ведущего

запрос маршрутизации

Redis Cluster — это технология сегментирования серверов, официально предоставляемая начиная с версии 3.0. Redis Cluster не использует консистентный хеш, а использует концепцию слота (slot), который разбит всего на 16384 слота. Отправьте запрос на любой узел, и узел, получивший запрос, отправит запрос на правильный узел для выполнения. Когда ключ, управляемый клиентом, не назначен узлу, это похоже на работу с одним экземпляром Redis.Когда ключ, управляемый клиентом, не назначен узлу, Redis вернет команду перенаправления, чтобы указать на правильный узел. , что немного похоже на перенаправление 302 страницы браузера.

В кластере Redis необходимо следить за тем, чтобы ноды, соответствующие слотам 16384, работали нормально, при отказе ноды выйдут из строя и слоты, за которые она отвечает, и весь кластер работать не будет. Чтобы повысить доступность кластера, официально рекомендуемым решением является настройка узла в виде структуры master-slave, то есть ведущий главный узел и n подчиненных узлов. В это время, если главный узел выйдет из строя, Redis Cluster выберет один из подчиненных узлов, чтобы стать главным узлом в соответствии с алгоритмом выбора, и весь кластер продолжит предоставлять внешние услуги.

Cluster
Redis Cluster

Функции:

  • Нецентрализованная архитектура, поддержка динамического расширения, прозрачность для бизнеса
  • С мониторингом Sentinel и возможностями автоматического аварийного переключения
  • Клиенту не нужно подключаться ко всем узлам в кластере, достаточно подключиться к любому доступному узлу в кластере.
  • Высокая производительность, клиент напрямую подключается к сервису Redis, что исключает потерю прокси-сервера.

Недостатком является то, что эксплуатация и обслуживание также очень сложны, миграция данных требует ручного вмешательства, можно использовать только БД №0, не поддерживаются пакетные операции, распределённая логика и привязка модулей хранения и т.д.

Выбор, наконец, определяет кластер Redis. Основные причины — высокая производительность и децентрализованная поддержка масштабирования. В настоящее время в отрасли нет зрелого решения для миграции данных Кластер Redis официально предоставляется Redis, и мы ожидаем, что официальный Redis будет поддерживать его в будущем.

Установить

Официальный рекомендательный кластер требует не менее шести узлов, то есть трех ведущих и трех подчиненных. Файлы конфигурации шести узлов в основном одинаковы, нужно изменить только номер порта.

port 7000
cluster-enabled yes  #开启集群模式
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

После запуска вы можете увидеть следующий журнал.

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

Поскольку nodes.conf не существует, каждый экземпляр будет присваивать себе идентификатор при запуске. Этот идентификатор будет использоваться постоянно, чтобы иметь уникальное имя в среде кластера. Каждый экземпляр содержит идентификатор, используемый другими узлами, а не IP и порт. IP и порт могут измениться, но уникальный идентификатор узла не изменится, пока узел не умрет.

Теперь мы запустили шесть экземпляров Redis и должны создать кластер, записав некоторую значимую информацию о конфигурации в каждый узел. Инструмент командной строки redis-cluster использует программы Ruby для выполнения некоторых специальных команд в экземпляре, и с его помощью легко создавать новые кластеры, проверять или повторно разбивать существующие кластеры и т. д.

./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

--replicas 1Параметр должен привести каждого мастера к ведомому.

Настройка джедискластерконфиг

@Configuration
public class JedisClusterConfig {
    private static Logger logger = LoggerFactory.getLogger(JedisClusterConfig.class);

    @Value("${redis.cluster.nodes}")
    private String clusterNodes;

    @Value("${redis.cluster.timeout}")
    private int timeout;

    @Value("${redis.cluster.max-redirects}")
    private int redirects;
    
    @Autowired
    private JedisPoolConfig jedisPoolConfig;

    @Bean
    public RedisClusterConfiguration getClusterConfiguration() {
        Map<String, Object> source = new HashMap();

        source.put("spring.redis.cluster.nodes", clusterNodes);
        logger.info("clusterNodes: {}", clusterNodes);
        source.put("spring.redis.cluster.max-redirects", redirects);
        return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
    }

    @Bean
    public JedisConnectionFactory getConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(getClusterConfiguration());
        jedisConnectionFactory.setTimeout(timeout);
        return jedisConnectionFactory;
    }

    @Bean
    public JedisClusterConnection getJedisClusterConnection() {
        return (JedisClusterConnection) getConnectionFactory().getConnection();
    }

    @Bean
    public RedisTemplate getRedisTemplate() {
        RedisTemplate clusterTemplate = new RedisTemplate();
        clusterTemplate.setConnectionFactory(getConnectionFactory());
        clusterTemplate.setKeySerializer(new StringRedisSerializer());
        clusterTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        return clusterTemplate;

    }

}

Пароли можно настроить.Кластер не очень дружит с поддержкой паролей.Если для кластера установлен пароль, необходимо установить и requirepass, и masterauth.В противном случае возникнут проблемы с авторизацией при переключении master-slave.

Настроить кластер Redis

redis:
  cluster:
    enabled: true
    timeout: 2000
    max-redirects: 8
    nodes: 127.0.0.1:7000,127.0.0.1:7001

В основном настройте узел, время ожидания и т. д. кластера Redis.

Использование шаблона Redis

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisConfigTest {
    @Autowired
    RedisTemplate redisTemplate;
    
    @Test
    public void clusterTest() {
      redisTemplate.opsForValue().set("foo", "bar");
      System.out.println(redisTemplate.opsForValue().get("foo"));
    }
}

Использование очень простое.Вы можете управлять им, внедрив RedisTemplate.RedisTemplate богат на использование и может проконсультироваться самостоятельно.

Суммировать

В этой статье в основном рассказывается о выборе кластера Redis, существует три основных типа: сегментация клиента, сегментация на основе прокси и запрос маршрутизации. Для первых двух методов кратко ознакомьтесь с ними соответственно и, наконец, выберите кластерное решение Redis, официально предоставленное Redis and Practice. Хотя официальная версия давно не запускалась, и случаев успешной практики не так много, в целом вся конструкция redis cluster относительно проста, и большинство операций можно выполнять по одноточечному процессу работы . Используемый автором клиент jedis поддерживает JedisCluster, он также относительно хорош и очень удобен в использовании. На самом деле, есть еще и данные измерения давления, которые будут добавлены позже.

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号

Ссылаться на

  1. Как должно быть реализовано кластерное решение Redis?
  2. cluster-tutorial
  3. twemproxy
  4. CodisLabs