• Русский
  • Переключение при сбое

    Когда исходный экземпляр Redis выходит из строя, необходимо сначала выполнить аварийное переключение для кластера аварийного восстановления, а затем переключить адрес доступа клиента на новый экземпляр аварийного восстановления.

    Переключение кластера аварийного восстановления

    В кластере аварийного восстановления при сбое исходного экземпляра необходимо разорвать канал синхронизации с неработающим исходным экземпляром, а целевой экземпляр повысить до исходного; это необходимо для обеспечения возможности записи данных клиентом и предотвращения загрязнения целевого экземпляра «грязными» данными с неработающего исходного экземпляра.

    Описание времени переключения при сбое

    При возникновении сбоя на исходном экземпляре кластера аварийного восстановления, сервис Alauda Cache Service for Redis OSS на целевой стороне обнаружит разрыв канала аварийного восстановления с исходным экземпляром. В этот момент статус ресурса ActiveRedisConnection станет аномальным, а в веб-консоли целевого экземпляра появится уведомление о возможности выполнения переключения аварийного восстановления.

    Описание риска переключения аварийного восстановления
    Следует отметить, что это аномальное уведомление является лишь интерактивным предупреждением и не должно использоваться в качестве единственного основания для принятия решения о выполнении переключения аварийного восстановления клиентом.

    Переключение аварийного восстановления

    CLI
    Веб-консоль

    Просмотр статуса подключения

    # Просмотр нормального статуса
    $ kubectl -n default get activeredisconnections
    NAME           INSTANCE   STATUS    MESSAGE   AGE
    c6-dest-conn   c6-dest    Healthy             35s
    
    # Просмотр аномального статуса
    $ kubectl -n default get activeredisconnections
    NAME           INSTANCE   STATUS   MESSAGE                                                                                          AGE
    c6-dest-conn   c6-dest    Failed   shard 0 status is Disconnected; shard 1 status is Disconnected; shard 2 status is Disconnected   86s

    Если STATUS равен Failed, это означает, что соединение между экземпляром c6-dest и вышестоящим источником нарушено. Для понимания конкретной ситуации можно просмотреть детали в формате yaml:

    $ kubectl -n default get activeredisconnections c6-dest-conn -o yaml
    apiVersion: redis.middleware.alauda.io/v1alpha1
    kind: ActiveRedisConnection
    metadata:
      annotations:
        cpaas.io/creator: admin
        cpaas.io/updated-at: "2025-08-27T08:42:16Z"
      creationTimestamp: "2025-08-27T08:42:16Z"
      generation: 1
      labels:
        cpaas.io/activeredis: c6-dest-activeredis
        cpaas.io/activeredis-instance: c6-dest
      name: c6-dest-conn
      namespace: default
      ownerReferences:
      - apiVersion: redis.middleware.alauda.io/v1alpha1
        blockOwnerDeletion: true
        controller: true
        kind: ActiveRedis
        name: c6-dest-activeredis
        uid: ed1010f8-a70d-42ef-be19-0450478df137
      resourceVersion: "19592690"
      uid: 301f77be-ff52-4e50-98d0-d85a38e2415a
    spec:
      addresses:
      - 192.168.1.11:30011
      instance: c6-dest
      pause: true
      secretName: c6-dest-conn-password
    status:
      instance: c6-dest
      message: shard 0 status is Disconnected; shard 1 status is Disconnected; shard 2
        status is Disconnected
      shards:
      - index: 0
        offset: "0"
        opId: "0"
        status: Disconnected
        syncStatus: PartialSync
      - index: 1
        offset: "0"
        opId: "0"
        status: Disconnected
        syncStatus: PartialSync
      - index: 2
        offset: "0"
        opId: "0"
        status: Disconnected
        syncStatus: PartialSync
      status: Failed
      upstreamPeer:
        service_id: 0
        service_metadata:
          instance: default/c6

    Отключение от исходного экземпляра

    После ручного подтверждения, что исходный экземпляр действительно неисправен, необходимо отключить целевой экземпляр от канала аварийного восстановления исходного экземпляра, чтобы предотвратить попадание «грязных» данных.

    $ kubectl -n default delete activeredisconnections c6-dest-conn

    После удаления соответствующего ресурса ActiveRedisConnection экземпляр Redis становится независимым исходным экземпляром, и адрес доступа клиента можно безопасно переключить на этот экземпляр для чтения и записи.

    Использование неработающего исходного экземпляра в качестве целевого экземпляра нового источника

    После восстановления неработающего исходного экземпляра его можно повторно добавить в кластер аварийного восстановления в качестве целевого экземпляра нового источника. Для способа выполнения операции обратитесь к разделу Setup Disaster Recovery.

    Переключение аварийного восстановления на стороне клиента

    Перед подключением к кластеру аварийного восстановления клиент должен поддерживать переключение адреса доступа Redis на новый исходный экземпляр (повышенный целевой) после обнаружения сбоя исходного экземпляра. Обычно существуют следующие методы переключения:

    АрхитектураМеханизмПреимуществаНедостаткиВлияние на RTO/RPOСложность реализацииИдеальный сценарий использования
    Переключение DNSОбновление записей DNS для указания нового IPПростая концепция, независимость от платформыДлительное и неконтролируемое время восстановления (зависит от TTL), неэффективно для внутреннего трафика K8sRTO: минуты
    RPO: может быть высоким
    НизкаяПриложения с низкими требованиями к RTO или как ручное резервное решение.
    ПроксиКлиент подключается к прокси, который маршрутизирует к мастеру через проверки состоянияБыстрое переключение (время восстановления в секундах), прозрачно для клиента, простое восстановление после сбоевУвеличение сетевых переходов и нагрузки на эксплуатацию, прокси должен быть высокодоступнымRTO: секунды
    RPO: низкое
    СредняяРекомендуемое решение: требуется быстрое и прозрачное переключение, а также возможность эксплуатации высокодоступного кластера прокси.
    Service Mesh (Istio)Sidecar-прокси перехватывает трафик и выполняет локальное приоритетное и межкластерное переключение на основе политикМощный функционал, прозрачность для приложений, простое восстановление после сбоевОчень высокая сложность эксплуатации, тяжелый технологический стекRTO: секунды
    RPO: низкое
    ВысокаяКрупные и сложные системы, полностью использующие service mesh для управления микросервисами.
    Клиентская библиотекаБиблиотека содержит встроенную логику и самостоятельно принимает решение о переключении на целевой кластерОтсутствие промежуточного слоя, возможно более низкая задержкаОчень высокий риск: решения о переключении ненадежны, восстановление после сбоев сложное (часто требует перезапуска приложения), экосистемная поддержка непоследовательнаRTO: непредсказуемое
    RPO: высокий риск
    СредняяНе рекомендуется для автоматического аварийного восстановления на уровне продакшена.

    Нельзя судить о необходимости аварийного переключения клиента только по бинарному решению; переключение — это многомерный процесс принятия решений с высокой степенью уверенности. Его необходимо осуществлять с учетом нескольких аспектов обнаружения сбоев, включая, но не ограничиваясь: доступностью экземпляра, наличием высокой доступности экземпляра, возможностью продолжения обслуживания кластера k8s, проверкой доступности дата-центра.

    Обычно для безопасного выполнения переключения аварийного восстановления клиентом должно выполняться следующее выражение:

    (Ручной запуск переключения)
    ИЛИ
    (
      (Проверка статуса исходного экземпляра неудачна и продолжается неудача N раз)
      И
      (
        (Экземпляр больше не обладает высокой доступностью)
        ИЛИ
        (Проверка доступности дата-центра неудачна и продолжается неудача N раз)
      )
      И
      (Проверка доступности целевого экземпляра успешна)
    )
    Описание поддержки

    В настоящее время Alauda Cache Service for Redis OSS не предоставляет поддержку переключения аварийного восстановления на стороне клиента. Клиенты должны реализовать подходящий метод переключения в соответствии со своей инфраструктурой.