Предыдущий отзыв
предыдущий постРеализация распределенной блокировки на основе 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 в сочетании с пулом кеша.
Redis Sentinel предоставляет функции мониторинга Redis и аварийного переключения в активном/резервном режиме для обеспечения высокой доступности системы. Когда основной Redis выходит из строя, резервный Redis вступает во владение и становится основным Redis для продолжения предоставления услуг. Мастер и резервная копия вместе образуют узел Redis, который обеспечивает высокую доступность узла за счет автоматического аварийного переключения.
Преимущество технологии сегментирования на стороне клиента заключается в том, что она очень проста. Экземпляры Redis на стороне сервера независимы и не связаны друг с другом. Каждый экземпляр Redis работает как один сервер, который очень легко линейно расширить, а систему очень гибкий.
Недостатки сегментирования на стороне клиента также очевидны. Поскольку обработка сегментирования выполняется на стороне клиента, при дальнейшем расширении масштаба возникают проблемы с эксплуатацией и обслуживанием. Разделение на стороне клиента не поддерживает динамическое добавление или удаление узлов. При изменении топологии группы экземпляров Redis на сервере каждый клиент необходимо обновить и настроить. Соединения не могут использоваться совместно. Когда масштаб приложения увеличивается, трата ресурсов ограничивает оптимизацию.
Шардинг на основе прокси
Клиент отправляет запрос прокси-компоненту, прокси-сервер анализирует данные клиента, перенаправляет запрос нужному узлу и, наконец, возвращает результат клиенту.
Характеристики этого режима следующие:
- Прозрачный доступ, бизнес-программы не должны заботиться о внутреннем экземпляре Redis, а стоимость переключения невелика.
- Логика прокси и логика хранилища изолированы.
- Прокси-уровень имеет еще одну пересылку, и производительность снижается.
Простая структурная схема выглядит следующим образом:
Основные компоненты: 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 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 выберет один из подчиненных узлов, чтобы стать главным узлом в соответствии с алгоритмом выбора, и весь кластер продолжит предоставлять внешние услуги.
Функции:
- Нецентрализованная архитектура, поддержка динамического расширения, прозрачность для бизнеса
- С мониторингом 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, он также относительно хорош и очень удобен в использовании. На самом деле, есть еще и данные измерения давления, которые будут добавлены позже.