Compartilhamento de tecnologia

[k8s instalação redis] versão autônoma de instalação k8s do redis para alcançar alto desempenho e alta disponibilidade

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Introdução

Este artigo será baseado na construção de uma instância redis de modo [pseudo] autônomo no ambiente k8s. Como o desempenho de IO do armazenamento compartilhado é relativamente baixo, o armazenamento compartilhado é usado para backup de dados e os dados do Redis são armazenados na forma de hostpath. Isso ajuda a melhorar o desempenho de IO do Redis. Este artigo explicará como usar dois contêineres. a forma mestre-escravo de redis para implementar um redis autônomo e altamente disponível.

1. Condições e descrição do ambiente:

K8s versão k8s-1.29.4, o ambiente é construído em uma sala de informática de telecomunicações, com um total de seis nós. Cada nó possui um disco SSD que não é do sistema montado no caminho /data/. Há armazenamento compartilhado NAS, que usa Alibaba Cloud NAS e usa uma linha dedicada com largura de banda de linha dedicada de 500 MB.

2. Descrição dos requisitos:

  • Crie uma instância redis: independente ou mestre-escravo.
  • Alta disponibilidade: Mesmo que um nó k8s morra, o uso não será afetado por muito tempo.
  • Alto desempenho: é necessário alto iO ou armazenamento distribuído ceph, e a leitura e gravação de iO terão um grande desconto.
  • Segurança de dados: após ocorrer uma troca, os dados devem estar tão completos quanto possível
  • Instalação simples, fácil gerenciamento e manutenção

3. Princípios e instruções de implementação

1. Configure o redis no modo mestre-escravo. A leitura e gravação de dados do redis mestre cai no disco SSD local e os dados do redis escravo caem no armazenamento NAS compartilhado externo.
2. Em seguida, crie uma configuração statefulset, coloque dois contêineres, um contêiner como o redis principal, monte-o no hostpath, crie um diretório com o nome do host e armazene o arquivo rdb. Outro contêiner serve como redis escravo, e o caminho nas é montado para criar um diretório com o nome do host e armazenar o arquivo rdb.
3. Ajuste o parâmetro de persistência de dados salvo do redis e ajuste o tempo de download de dados para um parâmetro menor para garantir que os dados atualizados sejam armazenados no arquivo rdb o mais rápido possível.
4. Sempre que o pod for agendado ou reiniciado, copie o arquivo rdb armazenado no nas para o caminho do host e inicie o redis.

Nota: Isso é feito para permitir que o redis mestre obtenha processamento de dados de negócios de alto desempenho, e o redis escravo é responsável pela persistência dos dados. Pode haver os seguintes problemas: 1. Quando o IO de leitura e gravação de dados do mestre é muito alto. , o redis escravo monta nas. O tempo de download de dados será maior.

4. Etapas detalhadas

4.1. Criar arquivo de configuração configmap

A configuração contém três arquivos: o arquivo de configuração redis mestre, o arquivo de configuração redis escravo e um script simples que executa diferentes operações com base na função de execução.
redis-master:conf é o arquivo de configuração principal do redis. A memória está configurada para 256M, a porta de configuração é 6379, a senha de configuração é redis#123 e o caminho de armazenamento é/data/redis.
redis.conf: No arquivo de configuração redis, configure a memória para 256M, configure a porta para 6380, configure a senha: redis#123, o caminho de armazenamento é /data/redis-2 e configure os dados a serem sincronizados a partir do porta 6379 e ajuste o tempo de armazenamento para Se houver 10 alterações de dados em 60 segundos, o armazenamento será realizado.
run.sh: A função principal é determinar a função e criar um diretório com base no nome do host e, em seguida, conectar-se suavemente ao diretório de armazenamento. Esta etapa serve principalmente para armazenar os dados redis de cada serviço em seu próprio diretório. Ao criar um novo redis, isso não causará conflitos de diretório no nó.

apiVersion: v1
kind: ConfigMap
metadata:
  name: defaultapp-redis-standalone-config
  namespace: default
  labels:
    appname: default-app
    app: defaultapp-redis-standalone-config
data:
  redis-master.conf: |
    port 6379
    maxmemory 256mb
    requirepass redis#123
    dir /data/redis
  redis.conf: |
    port 6380
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 5 60 10
    dir /data/redis-2
    replicaof 127.0.0.1 6379
    masterauth redis#123
  run.sh: |
    #!/bin/sh
    role=$1
    hname=$(hostname)
    if [ $role == "master" ];then
        echo "run redis master"
        ls /etc/redis/ -l
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        if [ -f /home/redis-2/$hname/dump.rdb ];then
                cp -vf /home/redis-2/$hname/dump.rdb /data/redis/
        else
                echo "[info] no bak dump.rdb"
        fi
        redis-server /etc/redis/redis-master.conf
    else
        echo "run redis slave"
        ls /etc/redis/ -l
        [ -d /home/redis-2/$hname ] || mkdir -p /home/redis-2/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis-2/$hname /data/redis-2
        redis-server /etc/redis/redis.conf
    fi