Возможно ли, чтобы только главные экземпляры Redis обрабатывали все операции чтения и записи, а подчиненные устройства использовались только для аварийного переключения?

Моя рабочая система состоит из веб-приложений Spring, использует Redis в качестве счетчика транзакций и условно блокирует запросы транзакций.

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

  1. Проверьте, существуют ли данные. (ХГЕТ)
  2. Если это не так, сохраняет новый со счетом 0 и устанавливает время истечения срока действия. (HSET, ИСКЛЮЧИТЬСЯ)
  3. Увеличивает значение счетчика. (INCRBY)
  4. Если увеличенное значение счетчика достигает определенного настроенного предела, транзакция становится «заблокированной» (HSET).

Предельное значение является бизнес-политикой моей компании.

Такие операции чтения и записи запрашиваются одна за другой, немедленно. В настоящее время я использую один экземпляр Redis на одной машине. (только мастер, без репликации). Я хочу получить Redis HA, поэтому мне нужны подчиненные экземпляры, но в то же время я хочу, чтобы все операции чтения и записи в Redis выполнялись только для главных экземпляров из-за задержки репликации подчиненных данных.

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

Заранее спасибо.


person ParkCheolu    schedule 31.08.2020    source источник


Ответы (2)


Вам нужен Redis Sentinel.

С Redis Sentinel вы можете получить главный адрес от sentinel и читать/записывать с мастером. Если мастер не работает, Redis Sentinel выполнит отработку отказа и выберет нового мастера. Затем вы можете получить адрес нового мастера от sentinel.

person for_stack    schedule 01.09.2020
comment
При использовании Sentinel мои клиентские приложения подключаются только к Sentinel?? Если это так, я думаю, что Sentinel перенаправляет запросы на чтение ведомым устройствам, чего я не хочу. Разве это не правильно? - person ParkCheolu; 01.09.2020
comment
НЕТ, ваш клиент подключается к Sentinel и просит Sentinel вернуть адрес мастера. Затем вы можете подключиться к мастеру и читать/писать с мастером. - person for_stack; 01.09.2020

Поскольку вы собираетесь использовать драйвер кластера Lettuce для Redis, вы должны установить для предпочтения чтения значение Master, и все должно работать нормально, пример кода может выглядеть так.

    LettuceClientConfiguration lettuceClientConfiguration =
        LettuceClientConfiguration.builder().readFrom(ReadFrom.MASTER).build();

    RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
    List<RedisNode> redisNodes = new ArrayList<>();
    redisNodes.add(new RedisNode("127.0.0.1", 9000));
    redisNodes.add(new RedisNode("127.0.0.1", 9001));
    redisNodes.add(new RedisNode("127.0.0.1", 9002));
    redisNodes.add(new RedisNode("127.0.0.1", 9003));
    redisNodes.add(new RedisNode("127.0.0.1", 9004));
    redisNodes.add(new RedisNode("127.0.0.1", 9005));
    redisClusterConfiguration.setClusterNodes(redisNodes);
    LettuceConnectionFactory lettuceConnectionFactory =
        new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);
    lettuceConnectionFactory.afterPropertiesSet();

См. в действии на странице Конфигурация кластера Redis

person sonus21    schedule 31.08.2020