Implementação de espelhamento de tráfego Redis

fundo

Reduzir custos e aumentar a eficiência em cenários Redis envolve a migração de algumas instâncias Redis para projetos de armazenamento em disco SSD (Alibaba Cloud Tair) que suportam o protocolo Redis, como o pika da comunidade, para reduzir custos de armazenamento. O processo de migração requer verificação de desempenho.Além da seleção básica e dos testes de estresse, a cobertura completa do desempenho das instruções deve ser realizada para cada cenário de negócios, a fim de garantir o desempenho da migração de negócios e a estabilidade da compatibilidade das instruções. A abordagem convencional é exigir que o desenvolvimento empresarial coopere no projecto para realizar tráfego duplo, ou tráfego em escala de cinzentos numa pequena área.

Independentemente do problema acima, mais mão de obra e tempo precisam ser investidos, o que reduz bastante o ROI em termos de redução de custos e melhoria da eficiência em si. Se for possível reproduzir diretamente todo o tráfego de leitura do Redis original para a instância SSD do Redis de destino, então a migração de todo o evento SRE pode ser 99% concluída e o tempo de migração da instância será bastante reduzido, então o surge a necessidade de espelhamento de tráfego do Redis.

Dicas: Nossa solução de migração de dados usa DTS do Alibaba Cloud. O DTS é implementado com base no princípio de replicação mestre-escravo Redis, para que o desempenho do tráfego de gravação possa ser verificado diretamente durante o processo de sincronização de dados.

Pesquisar

Naveguei no Google e no Github, mas não encontrei nada muito adequado, então finalmente decidi fazer minha própria pesquisa. Algumas informações relevantes encontradas são as seguintes:

  • Registro de auditoria SLS Redis do Alibaba Cloud

A instância Redis do Alibaba Cloud suporta o envio de logs de execução Redis para SLS (um produto de gravação e consulta de log) para gravação, mas registra apenas o tráfego de gravação, o que não atende aos requisitos de reprodução de tráfego de leitura do Redis.

Esta ferramenta foi descartada pelo projeto pika. Atualmente existem apenas documentos e não existe nenhum código relevante no armazém. No entanto, a implementação deste artigo também se baseia no mesmo princípio de implementação do pika.

O tráfego de espelhamento do Redis baseado no istio deve estar conectado ao istio. As limitações são muito grandes e a introdução de um novo componente istio requer muitos testes de estabilidade, portanto, essa rota é diretamente rejeitada.

concluir

Vá diretamente ao tópico e use o comando monitor do Redis para atender a esse requisito.

/**
 * @author kl (http://kailing.pub)
 * @since 2023/9/27
 */
public class RedisMonitorTest {

    static final JedisPool targetRedisPool = new JedisPool("127.0.0.1", 6398);
    static final JedisPool sourceRedisPool = new JedisPool("127.0.0.1", 6379);
    static final Set<String> redisReadCommands = new HashSet<>(Arrays.asList(
            "get", "strlen", "exists", "getbit", "getrange", "substr", "mget", "llen", "lindex",
            "lrange", "sismember", "scard", "srandmember", "sinter", "sunion", "sdiff", "smembers",
            "sscan", "zrange", "zrangebyscore", "zrevrangebyscore", "zrangebylex", "zrevrangebylex",
            "zcount", "zlexcount", "zrevrange", "zcard", "zscore", "zrank", "zrevrank", "zscan", "hget",
            "hmget", "hlen", "hstrlen", "hkeys", "hvals", "hgetall", "hexists", "hscan", "randomkey",
            "keys", "scan", "dbsize", "type", "sync", "psync", "ttl", "touch", "pttl", "dump", "object",
            "memory", "bitcount", "bitpos", "georadius_ro", "georadiusbymember_ro", "geohash",
            "geopos", "geodist", "pfcount", "xrange", "xrevrange", "xlen", "xread", "xpending",
            "xinfo", "lolwut"
    ));
    
    public static void main(String[] args) {
            try (Jedis jedis = sourceRedisPool.getResource()) {
                jedis.monitor(new JedisMonitor() {
                    @Override
                    public void onCommand(String command) {
                        sendCommand(command);
                    }
                });
            }
    }
    
    public static void sendCommand(String commandStr) {
        String[] parts = commandStr.split("\"");
        if (parts.length < 2) {
            return;
        }
        String cmd = parts[1];
        List<String> args = new ArrayList<>();
        for (int i = 3; i < parts.length; i += 2) {
            args.add(parts[i]);
        }
        if (redisReadCommands.contains(cmd.toLowerCase())) {
            ProtocolCommand command = () -> cmd.getBytes(StandardCharsets.UTF_8);

            try (Jedis jedis = targetRedisPool.getResource()) {
                try {
                    long startTime = System.currentTimeMillis();
                    jedis.sendCommand(command, args.toArray(new String[0]));
                    System.out.println(cmd + ":" + (System.currentTimeMillis() - startTime));
                } catch (Exception e) {
                    System.err.println(cmd + e.getMessage());
                }
            }
        }
    }
}

O texto acima é um pseudocódigo que pode ser executado diretamente para encaminhar todo o tráfego de leitura de sourceRedis para targetRedis para execução.

Implementar análise

O cliente Java Redis jedis usado acima é desenvolvido. Primeiro, o comando monitor é chamado. Este comando é um comando de bloqueio e sempre assinará o registro de execução de comando do servidor Redis. O formato de registro é o seguinte:

1695869359.747056 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869359805247076" "LIMIT" "0" "1"
1695869359.748040 [0 127.0.0.1:64257] "EXISTS" "asynq:{sys}:paused"
1695869359.748259 [0 127.0.0.1:64257] "EXISTS" "asynq:{sync}:paused"
1695869359.748578 [0 127.0.0.1:64257] "EXISTS" "asynq:{default}:paused"
1695869359.748916 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869359869190783" "LIMIT" "0" "1"
1695869359.749154 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869359877625076" "LIMIT" "0" "1"
1695869359.749348 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869359878760313" "LIMIT" "0" "1"
1695869359.749530 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869359882064571" "LIMIT" "0" "1"
1695869359.779048 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869360024586886" "LIMIT" "0" "1"
1695869359.785898 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869360031603858" "LIMIT" "0" "1"
1695869359.786092 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869360031656719" "LIMIT" "0" "1"
1695869359.786923 [0 127.0.0.1:64257] "ZRANGEBYSCORE" "delayed_tasks" "0" "1695869360031666910" "LIMIT" "0" "1"

Portanto, só precisamos analisar as instruções e enviá-las para a instância de destino.

Há também uma questão envolvida aqui: como filtrar registros apenas com instruções de leitura?

Tentei perguntar ao chatGPT, mas não era nada confiável, ou faltava o comando de leitura ou outros comandos de gravação foram usados ​​para compor o número. Então não é confiável. Felizmente, o servidor Redis marca cada instrução para distinguir entre instruções de leitura e instruções de gravação.

Portanto, basta imprimir todas as instruções somente leitura no console e copiá-las para resolver o problema.

Precauções

O comando monitor Redis é um comando que prejudica o desempenho do Redis. O teste oficial reduzirá o desempenho de uma única instância do Redis em cerca de 50%. No meu teste real, quando a carga real do Redis não é alta, esse impacto é insignificante (especialmente com QPS alto). Use exemplos com cautela). Porque o QPS autônomo do Redis pode suportar 10W. Por exemplo, QPS 1W em tempo real on-line, ao usar o monitor, QPS e RT quase não sofrem alterações.

Além disso, deve-se ressaltar que rodar o monitor por muito tempo aumentará o consumo de memória do Redis, portanto, se você estiver fazendo verificação de desempenho, é melhor controlar o tempo e não rodar o tempo todo.

Conclusão

Neste blog, discutimos o método de implementação do espelhamento de tráfego Redis e sua importância na redução de custos e aumento de eficiência. Aprendemos que os métodos de verificação tradicionais exigem muito investimento de mão de obra e tempo ao migrar instâncias do Redis, o que reduz o ROI da redução de custos e melhoria da eficiência. Para resolver este problema, foi introduzido o requisito de espelhamento de tráfego Redis.

Ao reproduzir todo o tráfego de leitura do Redis original diretamente para a instância SSD do Redis de destino, podemos concluir com eficiência o processo de migração da instância, reduzir a carga de trabalho do SRE e reduzir significativamente o tempo de migração. Este método não só melhora a eficiência do processo de migração, mas também reduz custos e riscos, tornando o objectivo de redução de custos e melhoria da eficiência mais viável e alcançável. Ao adotar essa abordagem, podemos migrar instâncias do Redis com mais eficiência e manter o desempenho e a estabilidade dos negócios, ao mesmo tempo que reduzimos custos e melhoramos a eficiência.

Obrigado por ler! Se você tiver alguma dúvida ou ideia, fique à vontade para deixar um comentário.

O autor da estrutura de código aberto NanUI passou a vender aço e o projeto foi suspenso. A lista gratuita número um na App Store da Apple é o software pornográfico TypeScript. Ele acaba de se tornar popular, por que os grandes começam a abandoná-lo ? Lista TIOBE de outubro: Java tem o maior declínio, C # está se aproximando Java Rust 1.73.0 lançado Um homem foi encorajado por sua namorada AI a assassinar a Rainha da Inglaterra e foi condenado a nove anos de prisão Qt 6.6 lançado oficialmente Reuters: RISC-V a tecnologia se torna a chave para a guerra tecnológica sino-americana Novo campo de batalha RISC-V: não controlada por nenhuma empresa ou país, a Lenovo planeja lançar o Android PC
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/klblog/blog/10115744
Recomendado
Clasificación