Восстановление сервисов платформы

В данном разделе описаны шаги для восстановления сервисов платформы MiniO, NATS и Dkron.

Все работы по восстановлению производятся с учетом, что настроены соответствующие секреты и задачи (job) резервного копирования. Подробности приведены в разделе Резервное копирование сервисов платформы.

Восстановление MiniO

Чтобы восстановить MiniO:

  1. Подключитесь к кластеру Kubernetes.

  2. Задайте необходимые переменные, выполнив команду:

    export NAMESPACE="<namespace>"
    export IMAGE="harbor.rvision.pro/tools/backup-wrapper:v1.0.0"

    Здесь:

    • <namespace> — название пространства имен, в котором установлена система.

  3. Запустите под для восстановления MiniO, выполнив команду:

    kubectl run restore-minio -n "$NAMESPACE" --rm -it \
      --image="$IMAGE" --restart=Never \
      --overrides='{
        "spec": {
          "containers": [{
            "name": "restore",
            "image": "'"$IMAGE"'",
            "command": ["/bin/ash"],
            "stdin": true, "tty": true,
            "envFrom": [{"secretRef": {"name": "backup-minio"}}]
          }]
        }
      }'
  4. Подключитесь к созданному поду, выполнив команду:

    kubectl exec -it restore-minio -n "$NAMESPACE" -- /bin/sh
  5. Настройте сокращенные имена подключения к S3-совместимому хранилищу (aliases), выполнив команду:

    mc alias set source "$SOURCE_ENDPOINT" "$SOURCE_ACCESS_KEY" "$SOURCE_SECRET_KEY"
    mc alias set target "$S3_ENDPOINT" "$S3_ACCESS_KEY" "$S3_SECRET_KEY"
  6. Проверьте список доступных резервных копий MiniO, выполнив команду

    mc ls "target/${S3_BUCKET}/backups/minio/"

    Также вы можете посмотреть объем памяти, который занимают резервные копии MiniO. Для этого выполните команду:

    mc du "target/${S3_BUCKET}/backups/minio/"
  7. Выполните следующий скрипт восстановления в командной строке:

    IFS=,
    for bucket in $BUCKETS; do
      echo "Восстановление: $bucket"
      mc mb --ignore-existing "source/${bucket}"
      mc mirror --preserve --overwrite \
        "target/${S3_BUCKET}/backups/minio/${bucket}" \
        "source/${bucket}"
    done
  8. Дождитесь успешного восстановления каждого контейнера (bucket) MiniO.

Восстановление NATS

Чтобы восстановить NATS:

  1. Подключитесь к кластеру Kubernetes.

  2. Задайте необходимые переменные, выполнив команду:

    export NAMESPACE="<namespace>"
    export IMAGE="harbor.rvision.pro/tools/backup-wrapper:v1.0.0"

    Здесь:

    • <namespace> — название пространства имен, в котором установлена система.

  3. Запустите под для восстановления NATS, выполнив команду:

    kubectl run restore-nats -n "$NAMESPACE" --rm -it \
      --image="$IMAGE" --restart=Never \
      --overrides='{
        "spec": {
          "containers": [{
            "name": "restore",
            "image": "'"$IMAGE"'",
            "command": ["/bin/ash"],
            "stdin": true, "tty": true,
            "envFrom": [{"secretRef": {"name": "backup-nats"}}]
          }]
        }
      }'
  4. Подключитесь к созданному поду, выполнив команду:

    kubectl exec -it restore-nats -n "$NAMESPACE" -- /bin/sh
  5. Настройте сокращенное имя подключения к S3-совместимому хранилищу (alias), выполнив команду:

    mc alias set target "$S3_ENDPOINT" "$S3_ACCESS_KEY" "$S3_SECRET_KEY"
  6. Проверьте список доступных резервных копий NATS, выполнив команду:

    mc ls "target/${S3_BUCKET}/backups/nats/"
  7. Скопируйте необходимую резервную копию в локальную директорию /tmp/, выполнив команду:

    mc cp "target/${S3_BUCKET}/backups/nats/<backup_name>" /tmp/

    Здесь:

    • <backup_name> — название файла резервной копии, например, nats-backup.tar.

  8. Создайте директорию для восстановления и распакуйте данные резервной копии, выполнив команды:

    mkdir -p /tmp/nats-restore
    tar -xf /tmp/nats-backup.tar -C /tmp/nats-restore
  9. Настройте переменные подключения к NATS, выполнив команду:

    NATS_OPTS="--server=${NATS_URL}"
    case "${NATS_AUTH_MODE:-none}" in
      token)    NATS_OPTS="$NATS_OPTS --token=${NATS_TOKEN}" ;;
      userpass) NATS_OPTS="$NATS_OPTS --user=${NATS_USER} --password=${NATS_PASSWORD}" ;;
      creds)    NATS_OPTS="$NATS_OPTS --creds=/etc/nats/nats.creds" ;;
      nkey)     NATS_OPTS="$NATS_OPTS --nkey=/etc/nats/nats.nkey" ;;
    esac
  10. Проверьте подключение к NATS, выполнив команду:

    nats $NATS_OPTS account info
  11. Создайте резервную копию нынешнего состояния NATS, выполнив команды:

    mkdir -p /tmp/pre-restore
    for s in $(nats $NATS_OPTS stream ls --json -a 2>/dev/null \
      | tr -d '[]",' | sed '/^$/d; s/^[[:space:]]*//' ); do
      nats $NATS_OPTS stream backup "$s" "/tmp/pre-restore/$s" --no-progress 2>/dev/null || true
    done
  12. Восстановите каждый стрим NATS, выполнив скрипт в командной строке:

    BACKUP_DIR=$(find /tmp/nats-restore -mindepth 1 -maxdepth 1 -type d | head -1)
    for stream_dir in "$BACKUP_DIR"/*/; do
      stream_name="${stream_dir%/}"
      stream_name="${stream_name##*/}"
      # В восстановлении участвуют только каталоги. JSON-метаданные пропускаются.
      [ ! -d "$stream_dir" ] && continue
    
      echo "Восстановление: $stream_name"
      nats $NATS_OPTS stream rm "$stream_name" --force 2>/dev/null || true
      # Имя стрима берётся из метаданных внутри резервной копии.
      nats $NATS_OPTS stream restore "${stream_dir%/}"
    done
  13. Проверьте, что все стримы NATS восстановились корректно, с помощью команды:

    nats $NATS_OPTS stream ls

Восстановление Dkron

Чтобы восстановить Dkron:

  1. Подключитесь к кластеру Kubernetes.

  2. Задайте необходимые переменные, выполнив команду:

    export NAMESPACE="<namespace>"
    export IMAGE="harbor.rvision.pro/tools/backup-wrapper:v1.0.0"

    Здесь:

    • <namespace> — название пространства имен, в котором установлена система.

  3. Запустите под для восстановления NATS, выполнив команду:

    kubectl run restore-dkron -n "$NAMESPACE" --rm -it \
      --image="$IMAGE" --restart=Never \
      --overrides='{
        "spec": {
          "containers": [{
            "name": "restore",
            "image": "'"$IMAGE"'",
            "command": ["/bin/ash"],
            "stdin": true, "tty": true,
            "envFrom": [{"secretRef": {"name": "backup-dkron"}}]
          }]
        }
      }'
  4. Подключитесь к созданному поду, выполнив команду:

    kubectl exec -it restore-dkron -n "$NAMESPACE" -- /bin/sh
  5. Настройте имя подключения к S3-совместимому хранилищу (alias), выполнив команду:

    mc alias set target "$S3_ENDPOINT" "$S3_ACCESS_KEY" "$S3_SECRET_KEY"
  6. Проверьте список доступных резервных копий, выполнив команду:

    mc ls "target/${S3_BUCKET}/backups/dkron/"
  7. Скачайте необходимую резервную копию Dkron в локальную директорию /tmp/, выполнив команду:

    mc cp "target/${S3_BUCKET}/backups/dkron/jobs.json" /tmp/dkron-restore.json
  8. Проверьте содержимое резервной копии, выполнив команду:

    grep -c '"name"' /tmp/dkron-restore.json
  9. Разделите хост и порт из переменной DKRON_ENDPOINT, выполнив команду:

    DKRON_HOST="${DKRON_ENDPOINT%%:*}"
    DKRON_PORT="${DKRON_ENDPOINT##*:}"
    [ "$DKRON_PORT" = "$DKRON_HOST" ] && DKRON_PORT=8080
  10. Восстановите Dkron, выполнив скрипт в командной строке:

    tr -d '\n\r' < /tmp/dkron-restore.json \
      | sed 's/^\[{/{/; s/}\]$/}/' \
      | sed 's/},{/}\n{/g' \
      | while IFS= read -r job; do
        _name=$(echo "$job" | sed -n 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')
        _len=$(printf '%s' "$job" | wc -c)
        echo "Восстановление job: ${_name:-?}"
        {
          printf "POST /v1/jobs HTTP/1.1\r\n"
          printf "Host: %s\r\n" "$DKRON_HOST"
          printf "Content-Type: application/json\r\n"
          printf "Content-Length: %d\r\n" "$_len"
          printf "Connection: close\r\n"
          printf "\r\n"
          printf '%s' "$job"
        } | nc "$DKRON_HOST" "$DKRON_PORT"
        echo ""
    done
  11. Проверьте, что Dkron корректно восстановился, с помощью команды:

    wget -qO- "http://${DKRON_HOST}:${DKRON_PORT}/v1/jobs" | head -c 500

Была ли полезна эта страница?

Обратная связь