Mon système de travail se compose d'applications Web Spring et utilise Redis comme compteur de transactions et bloque conditionnellement les demandes de transaction.

La transaction est la suivante:

  1. Vérifiez si des données existent ou non. (HGET)
  2. Si ce n'est pas le cas, enregistre un nouveau avec le nombre 0 et définit le délai d'expiration. (HSET, EXPIRE)
  3. Augmente une valeur de comptage. (INCRBY)
  4. Si la valeur de comptage accrue atteint une limite configurée spécifique, il définit la transaction sur `` bloquée '' (HSET)

La valeur limite est la politique commerciale de mon entreprise.

Ces opérations de lecture et d'écriture sont demandées l'une après l'autre, immédiatement. Actuellement, j'utilise une instance Redis sur une machine. (seulement maître, pas de réplications.) Je veux obtenir Redis HA, donc j'ai besoin d'insntaces esclaves mais en même temps, je veux avoir toutes les lectures et écritures sur Redis uniquement pour les inserts maîtres en raison de la latence de la relication des données esclaves.

Après quelques recherches, j'ai trouvé que c'était une bonne idée d'avoir un serveur proxy pour utiliser Redis HA. Cependant, avec le proxy, il semble impossible d'utiliser uniquement les instances maîtres pour recevoir les requêtes et les esclaves uniquement pour le basculement. Est-il possible??

Merci d'avance.

0
ParkCheolu 31 août 2020 à 16:26

2 réponses

Meilleure réponse

Vous avez besoin de Redis Sentinel.

Avec Redis Sentinel, vous pouvez obtenir l'adresse principale de sentinel et lire / écrire avec master. Si le maître est arrêté, Redis Sentinel effectuera le basculement et élira un nouveau maître. Ensuite, vous pouvez obtenir l'adresse du nouveau maître de sentinel.

1
for_stack 1 sept. 2020 à 01:30

Comme vous allez utiliser le pilote de cluster Lettuce pour Redis, vous devez définir la préférence de lecture sur Master et les choses devraient fonctionner correctement, un exemple de code pourrait ressembler à ceci.

    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();

Voir en action à Configuration du cluster Redis

0
sonus21 31 août 2020 à 17:14