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:
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.
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.
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.
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:
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.
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.
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.
API para gerenciamento de configuração: o Envoy fornece uma API poderosa para gerenciar sua configuração dinamicamente.
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:
As operações MGET/MSET entre slots podem ser realizadas por meio do proxy envoy.
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:
Modo de conexão direta:
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
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.
Eu ouvi, clique nos 4 botões abaixo
Você não encontrará bugs!