Crie um proxy de serviço de cluster Redis em contêiner

0a18da9b4a39016aedf6218c7aeef034.gif

Redis & Amazon ElastiCache for Redis & Amazon MemoryDB of Redis 简介

Redis é um sistema de armazenamento de valor-chave e um banco de dados não relacional de plataforma cruzada. Redis é um dos bancos de dados NoSQL mais populares atualmente. É um código aberto, escrito em linguagem ANSI C, está em conformidade com o protocolo BSD, suporta a rede, pode ser baseado em memória, distribuído, banco de dados de armazenamento de par chave-valor persistente opcional (Chave-Valor) e fornece APIs em vários idiomas. Redis é frequentemente chamado de servidor de estrutura de dados porque o valor (Value) pode ser uma string (String), hash (Hash), lista (List), conjunto (Sets) e conjunto ordenado (Sorted Sets) e outros tipos.

O Amazon ElastiCache for Redis é um armazenamento de dados na memória ultrarrápido que oferece latência abaixo de um milissegundo para oferecer suporte a aplicativos em escala de Internet em tempo real. O ElastiCache for Redis foi criado em Redis de código aberto, é compatível com a API Redis, funciona com clientes Redis e usa o formato de dados Redis aberto para armazenar dados. O Amazon ElastiCache é um serviço totalmente gerenciado. Você não precisa executar tarefas administrativas, como provisionamento de hardware, aplicação de patches de software, instalação, configuração, monitoramento, failover e backups. O ElastiCache monitora continuamente seu cluster para manter seu Redis funcionando, liberando você para se concentrar no desenvolvimento de aplicativos de maior valor. Oferece suporte aos modos cluster e não cluster Redis e pode fornecer alta disponibilidade com suporte a failover automático.

O MemoryDB do Redis é um serviço de banco de dados persistente na memória que fornece desempenho extremamente rápido. Ele foi desenvolvido especificamente para aplicativos modernos com arquitetura de microsserviços. O MemoryDB é compatível com Redis, permitindo que você crie rapidamente aplicativos usando as mesmas estruturas de dados, APIs e comandos flexíveis e amigáveis ​​do Redis que eles já usam hoje. Com o Memory DB, todos os seus dados são armazenados na memória, o que permite que você obtenha latências de leitura de microssegundos e de gravação de milissegundos de um dígito e alto rendimento. O MemoryDB também usa logs de transação multi-AZ para persistir dados em várias zonas de disponibilidade (AZs) para failover rápido, recuperação de banco de dados e reinicializações de nó. Com desempenho na memória e persistência multi-AZ, o Memory DB pode ser usado como um banco de dados primário de alto desempenho para aplicativos de microsserviços, eliminando a necessidade de gerenciar cache e bancos de dados persistentes separadamente.

Por que o cluster Redis precisa de proxy

No ambiente de produção, muitos clientes escolhem o método de implantação Redis Cluster em termos de capacidade, desempenho e flexibilidade de escalabilidade. Mas o Redis Cluster também traz custos adicionais de desenvolvimento e uso. Para simplificar o desenvolvimento e o uso, em muitos cenários, precisamos construir um proxy para Redis Cluster. As principais vantagens do Proxy são as seguintes:

  1. Conveniência de linguagem: Atualmente, apenas jedis funciona bem com o modo Redis Cluster. Para realizar um desenvolvimento estável no Redis Cluster, os programadores precisam escolher a linguagem java; mas no caso de usar proxy, existem muitos idiomas que funcionam bem com o modo de cliente único Redis. Os programadores podem escolher os idiomas de acordo com suas próprias preferências.

  2. Facilidade de desenvolvimento: para clientes com um grande número de usuários, especialmente aqueles direcionados ao mercado chinês, para lidar com um grande número de visitas, a escala do Redis Cluster costuma ser relativamente grande. Um cluster Redis grande traz custos adicionais de desenvolvimento/operação e manutenção. Para simplificar o trabalho de desenvolvimento, muitas vezes é necessário encontrar um middleware entre o cluster e o cliente, e o Redis Proxy é o middleware para o cluster Redis.

  3. Conexão flexível: de acordo com a alteração do volume de acesso, o número de nós do Redis Cluster aumentará e diminuirá. Usando proxy, o cliente pode ser transparente para mudanças no número de nós.

  4. Acesso entre slots: o modo Redis Cluster não suporta acesso entre slots. Ao executar operações de dados com vários slots, geralmente é necessário concluir a divisão de acesso no lado do cliente, dividindo um acesso geral aos dados em várias operações de acesso a dados de um único slot; o Redis Proxy oferece suporte a algumas operações de acesso entre slots, como MSET/MGET/DEL, o que reduz o trabalho de desenvolvimento de acesso a dados.

De acordo com esta série de necessidades reais, uma variedade de produtos de proxy, como Redis-Cluster-Proxy, Overlord Proxy, Envoy Proxy, etc. Entre eles, o Redis-Cluster-Proxy e o Overlord Proxy são baseados principalmente na implantação de host, enquanto o Envoy Proxy pode ser implantado em host e conteinerização, especialmente a implantação conteinerizada, que é mais amigável para clientes cujos aplicativos foram conteinerizados.

Introdução ao Envoy Proxy

O Envoy é um proxy de serviço de código aberto projetado para aplicativos nativos da nuvem. Originalmente construído pela Lyft, o Envoy é um proxy distribuído C++ de alto desempenho projetado para serviços e aplicativos individuais, bem como um barramento de comunicação e "plano de dados comum" projetado para arquiteturas de "malha de serviço" de microsserviços em grande escala.

Principais características:

  1. Arquitetura fora do processo: o Envoy é um servidor autônomo de alto desempenho com um pequeno consumo de memória. Ele pode ser executado com qualquer linguagem ou estrutura de aplicativo.

  2. Suporte a HTTP/2 e gRPC: o Envoy tem um bom suporte para conexões HTTP/2 e gRPC. É um proxy HTTP/1.1 para HTTP/2 transparente.

  3. Balanceamento de carga avançado: o Envoy oferece suporte a recursos avançados de balanceamento de carga, incluindo novas tentativas automáticas, interrupção de circuito, limitação de taxa global, sombreamento de solicitação, balanceamento de carga regional-local e muito mais.

  4. API para gerenciamento de configuração: o Envoy fornece uma API poderosa para gerenciar sua configuração dinamicamente.

  5. Observabilidade: observabilidade aprofundada do tráfego da camada 7, suporte nativo para rastreamento distribuído e observabilidade em nível de fio de bancos de dados como MongoDB e DynamoDB.

O Envoy Proxy tem muitos cenários de aplicação. Este artigo usa o Envoy Proxy para realizar o proxy de conexão com o Redis Cluster.

Implantar proxy Envoy

1) Crie uma imagem do Envoy Proxy e carregue-a no ECR

a. Edite envoy.yaml, incluindo: porta de serviço, string de conexão. Neste documento, a porta do serviço Proxy é 7480 e a string de conexão é o endereço e a porta do cluster Redis.

envoy.yaml:
static_resources:
  listeners:
  - name: redis_listener
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 7480
    filter_chains:
    - filters:
      - name: envoy.filters.network.redis_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.redis_proxy.v3.RedisProxy
          stat_prefix: egress_redis
          settings:
            op_timeout: 5s
          prefix_routes:
            catch_all_route:
              cluster: redis_cluster
  clusters:
  - name: redis_cluster
    cluster_type:
      name: envoy.clusters.redis
      typed_config:
        "@type": type.googleapis.com/google.protobuf.Struct
        value:
          cluster_refresh_rate: 10s
          cluster_refresh_timeout: 4s
    connect_timeout: 4s
    dns_lookup_family: V4_ONLY
    lb_policy: CLUSTER_PROVIDED
    load_assignment:
      cluster_name: redis_cluster
      endpoints:
        lb_endpoints:
          endpoint:
            address:
              socket_address: { address: envoy-k8s1.xxxxxx.clustercfg.memorydb.us-west-2.amazonaws.com, port_value: 6379 }
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

Deslize para a esquerda para ver mais

b. Gerar imagem proxy de acordo com DockerFile e carregá-la no ECR

Dockerfile:
FROM envoyproxy/envoy-dev:latest


COPY ./envoy.yaml /etc/envoy.yaml
RUN chmod go+r /etc/envoy.yaml
#CMD ["/usr/local/bin/envoy", "-c", "/etc/envoy.yaml", "--service-cluster", "proxy"]


# Enable logging at debug level
CMD ["/usr/local/bin/envoy", "-c", "/etc/envoy.yaml", "--service-cluster", "proxy", "--log-path", "/tmp/envoy_log.txt", "--log-level", "debug"]

Deslize para a esquerda para ver mais

2) Implante o Envoy Proxy no EKS e exponha os serviços.

Neste documento, implantaremos 2 Envoy Proxy PODs e definiremos determinados limites de CPU/memória. A imagem do contêiner é a imagem proxy carregada no ECR na etapa anterior.

eks-redis-deployment-envoy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: "envoy-redis-proxy" 
  labels:
    ec: "redis-pod"
    app: envoy 
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      ec: "redis-pod" 
      app: envoy
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        ec: "redis-pod" 
        app: envoy 
    spec:
      containers:
      - image: "xxxxxxx.dkr.ecr.us-west-2.amazonaws.com/envoy:proxy-redis" 
        ports:
          - containerPort: 7480
        name: envoy 
        resources:
          limits:
            cpu: 200m
            memory: 400Mi
          requests:
            cpu: 100m
            memory: 200Mi
      restartPolicy: Always
      terminationGracePeriodSeconds: 30

Deslize para a esquerda para ver mais

Verifique o status do pod:

NAME                                READY   STATUS    RESTARTS   AGE
centos-pod-test                     1/1     Running   0          2m4s
envoy-blue-proxy-55c6fd6988-4rdbb   1/1     Running   0          2m8s
envoy-blue-proxy-55c6fd6988-bs99w   1/1     Running   0          2m8s

Deslize para a esquerda para ver mais

Verifique o estado do serviço:

NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
envoy-blue-proxy   ClusterIP   10.100.95.27   <none>        7480/TCP   2m13s
kubernetes         ClusterIP   10.100.0.1     <none>        443/TCP    36m

Deslize para a esquerda para ver mais

teste de funcionamento

Teste de conexão:

kubectl exec -it envoy-blue-centos -- /bin/bash
[root@centos-pod-test redis-stable]# redis-cli -h 10.100.95.27 -p 7480
10.100.95.27:7480> ping
PONG
10.100.95.27:7480> set a 1
OK
10.100.95.27:7480> exit
[root@centos-pod-test redis-stable]# exit
exit

Deslize para a esquerda para ver mais

Teste MGET/MSET entre slots:

f9a03f942126f23fc8560b217e37a1b2.jpeg

As operações MGET/MSET entre slots podem ser realizadas por meio do proxy envoy.

fbd42a53de1292d27383bafb9397644e.jpeg

Em comparação com o cluster redis conectado diretamente, a operação MGET/MSET entre slots falha.

Teste de performance

Usamos o redis-benchmark para comparar o modo Proxy e o modo de conexão direta e testar os cenários não pipeline e pipeline, respectivamente.

Modo proxy:

db80a04eaf227d957000db891c023e14.jpeg

Modo de conexão direta:

c9eaee727604f98ba548577f131a340b.jpeg

Análise do resultado:

1. Cenário sem pipeline

Existem três tipos de operações: SET, GET e MSET. O desempenho do modo proxy e do modo de conexão direta são basicamente os mesmos, e o proxy basicamente não apresenta perda de desempenho.

2. cenário de pipeline

Para operações SET e GET, o modo Proxy tem uma perda de desempenho de 0,5 ms em comparação com o modo de conexão direta.

O teste MSET no modo proxy tem um atraso alto. Além da perda de desempenho do próprio proxy, a distribuição de chaves no negócio real também deve ser considerada, e o teste do negócio real é realizado caso a caso.

Resumir

O proxy Envoy é implantado no cluster EKS de maneira conteinerizada, que possui alta flexibilidade de implantação, especialmente para clientes cujos aplicativos foram conteinerizados. Esse método de implantação é mais amigável; ao mesmo tempo, o uso das características do próprio K8s pode reduzir o trabalho de operação e manutenção do proxy Envoy. Em comparação com o método de implantação do host, a conveniência de operação e manutenção foi bastante aprimorada. Para o desempenho do proxy Envoy em negócios reais, é recomendável realizar testes suficientes em cenários reais para ajustar a configuração de recursos do próprio proxy para corresponder à carga de trabalho correspondente.

O autor deste artigo

42f3c94030d742c9530ffb86bbe95f4a.jpeg

Fu Xiaofei

Arquiteto de soluções sênior da Amazon Cloud Technology, responsável pela consultoria e design de arquitetura de soluções de computação em nuvem baseadas na Amazon. Com foco na indústria de jogos, ajudamos os clientes a usar a infraestrutura global e os fortes recursos técnicos da Amazon Cloud Technology para criar jogos explosivos e reduzir os custos operacionais dos jogos.

863c9a8b12417c47bb9bb1da44523f2d.gif

7a189a62b13d621e3ee3d22baece9070.gif

Eu ouvi, clique nos 4 botões abaixo

Você não encontrará bugs!

bf2f6199d3c05e902b15a8a3044fad6f.gif

Acho que você gosta

Origin blog.csdn.net/u012365585/article/details/131799416
Recomendado
Clasificación