高可用性を管理する

ドキュメントのバージョンを選択してください。

AlloyDB Omni クラスタの高可用性を管理して、自動フェイルオーバーと復元メカニズムにより、停止や障害に対する復元力を高めます。

高可用性の仕様を構成する

高可用性を構成するには、DBCluster 仕様で次の情報を入力します。

DBCluster:
  metadata:
    ...
  spec:
    ...
    readOnlyPort: READ_ONLY_PORT
    availability:
      numberOfStandbys: NUMBER_OF_STANDBYS
      enableStandbyAsReadReplica: true
      enableAutoFailover: true
      enableAutoHeal: true
      replayReplicationSlotsOnStandbys: true
      healthcheckPeriodSeconds: HEALTHCHECK_PERIOD
      autoFailoverTriggerThreshold: AUTOFAILOVER_TRIGGER_THRESHOLD
      autoHealTriggerThreshold: AUTOHEAL_TRIGGER_THRESHOLD

次の変数を置き換えます。

  • NUMBER_OF_STANDBYS: 設定するスタンバイ ノードの数。この値を 0 に設定すると、高可用性が無効になります。最大値は 5 です。必要なスタンバイ ノードの数がわからない場合は、高復元力のために 2 から始めます。

  • (省略可)READ_ONLY_PORT: スタンバイ読み取り専用エンドポイントに使用されるロードバランサまたは仮想 IP アドレスのポート。デフォルト値は 5433(プライマリ ポート + 1)です。

  • (省略可)HEALTHCHECK_PERIOD: 各ヘルスチェック間の待機時間(秒数)。デフォルト値は 30 です。最小値は 1 です。最大値は 86400(1 日)です。

  • (省略可)AUTOFAILOVER_TRIGGER_THRESHOLD: フェイルオーバーが発生するまでにヘルスチェックが失敗する回数。デフォルト値は 3 です。最小値は 0 ですが、値が 0 に設定されている場合、AlloyDB Omni はデフォルト値を使用します。

    ヘルスチェックが AUTOFAILOVER_TRIGGER_THRESHOLD 回失敗した場合、または HEALTHCHECK_PERIOD * AUTOFAILOVER_TRIGGER_THRESHOLD 秒間(デフォルトでは 90 秒間)失敗した場合、自動フェイルオーバーが発生します。

  • (省略可)AUTOHEAL_TRIGGER_THRESHOLD: 自動修復が開始されるまでにヘルスチェックが失敗する回数。デフォルト値は 5 です。最小値は 0 ですが、値が 0 に設定されている場合、AlloyDB Omni はデフォルト値を使用します。

    ヘルスチェックが AUTOHEAL_TRIGGER_THRESHOLD 回失敗するか、HEALTHCHECK_PERIOD * AUTOHEAL_TRIGGER_THRESHOLD 秒間失敗すると、自動復旧が行われます。

読み取り専用スタンバイ エンドポイントを確認する

enableStandbyAsReadReplica: true を設定すると、ロードバランサ(HAProxy と Keepalived の仮想 IP アドレス)は、プライマリの読み取り / 書き込みエンドポイントに加えて、専用の読み取り専用エンドポイントを自動的に公開します。

HAProxy は、アクティブ スタンバイ間で次のようにトラフィックをルーティングします。

  • GET /isstandby を使用して、すべてのスタンバイ ノードでヘルスチェックを実行します。
  • leastconn ロード バランシングを使用して、アクティブ スタンバイ間で読み取りクエリを分散します。
  • フェイルオーバー時に、新しいスタンバイ トポロジへのクライアント接続をドロップすることなく、ルーティングを自動的に更新します。

クラスタ エンドポイントを確認するには、次のいずれかのコマンドを実行します。

alloydbctl

alloydbctl get -d "DEPLOYMENT_SPEC" -t DBCluster -n DBCLUSTER_NAME

次の変数を置き換えます。

Ansible

  1. google.alloydbomni_orchestrator.status ロールの Ansible Playbook を作成します。たとえば、status.yaml は以下のようになります。

    - name: STATUS_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
      roles:
      - role: google.alloydbomni_orchestrator.status
    

    次の変数を置き換えます。

    • STATUS_PLAYBOOK_NAME: Ansible プレイブックの名前。例: My cluster status

    • ANSIBLE_USER: Ansible が AlloyDB Omni ノードにログインするために使用する OS ユーザー。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE: Ansible が SSH を使用して AlloyDB Omni ノードに接続するために使用する秘密鍵。

  2. ハンドブックを実行します。

    ansible-playbook status.yaml -i "DEPLOYMENT_SPEC" -e resource_type=DBCluster \
      -e resource_name=DBCLUSTER_NAME

    次の変数を置き換えます。

エンドポイントは status.primary.endpoints の下に報告されます。

    - Read-Write: VIRTUAL_IP:5432
    - Read-Only: VIRTUAL_IP:5433

DBCluster の仕様を適用する

構成した DBCluster 仕様を適用するには、次のいずれかのコマンドを実行します。

alloydbctl

alloydbctl apply -d "DEPLOYMENT_SPEC" -r "DBCLUSTER_SPECIFICATION"

次の変数を置き換えます。

Ansible

ansible-playbook DBCLUSTER_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="DBCLUSTER_SPECIFICATION"

次の変数を置き換えます。

スタンバイ インスタンスへのスイッチオーバー

スイッチオーバーは、高可用性設定のテストや、プライマリ レプリカとスタンバイ レプリカの切り替えが必要な計画メンテナンス アクティビティを行う必要がある場合に行うことができます。スイッチオーバーが発生すると、レプリケーションの方向とプライマリとスタンバイのロールが逆になります。

切り替えでは、次のアクションが実行されます。

  1. AlloyDB Omni オーケストレーターがプライマリをオフラインにします。

  2. AlloyDB Omni オーケストレーターがスタンバイを新しいプライマリにプロモートします。

  3. AlloyDB Omni オーケストレーターがプライマリをスタンバイに変換します。

  4. AlloyDB Omni が新しく変換されたスタンバイを起動します。

切り替えを行う

スイッチオーバーを実行する手順は次のとおりです。

  1. プライマリ インスタンスとスタンバイ インスタンスが正常であることを確認します。

  2. 高可用性 status.phase が Ready であることを確認します。

    alloydbctl

    alloydbctl get -d "DEPLOYMENT_SPEC" -t DBCluster -n DBCLUSTER_SPECIFICATION -o yaml

    次の変数を置き換えます。

    Ansible

    ansible-playbook status.yaml -i DEPLOYMENT_SPEC -e resource_type=DBCluster \
      -e resource_name=DBCLUSTER_SPECIFICATION

    次の変数を置き換えます。

  3. 次の形式で Switchover 仕様を作成します。

    Switchover:
      metadata:
        name: SWITCHOVER_NAME
      spec:
        dbClusterRef: DBCLUSTER_NAME
        newPrimary: NEW_PRIMARY_NAME
    

    次の変数を置き換えます。

    • SWITCHOVER_NAME: この Switchover 仕様の名前。例: my-switchover-1。この名前は、スイッチオーバーが実行されるたびに一意である必要があります。

    • DBCLUSTER_NAME: クラスタを作成するで定義したデータベース クラスタの名前。

    • (省略可)NEW_PRIMARY_NAME: 新しいプライマリになるスタンバイ インスタンスです。インスタンス名をホストにマッピングするには、参照される DBCluster のステータスの instanceList フィールドをご覧ください。

  4. Ansible を使用している場合は、Switchover 仕様のプレイブックを作成します。

    - name: SWITCHOVER_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
      roles:
      - role: google.alloydbomni_orchestrator.switchover
    

    次の変数を置き換えます。

    • SWITCHOVER_PLAYBOOK_NAME: Ansible プレイブックの名前。例: My Switchover

    • ANSIBLE_USER: Ansible が AlloyDB Omni ノードにログインするために使用する OS ユーザー。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE: Ansible が SSH を使用して AlloyDB Omni ノードに接続するために使用する秘密鍵。

  5. Switchover 仕様を適用します。

    alloydbctl

    alloydbctl apply -d "DEPLOYMENT_SPEC" -r "SWITCHOVER_SPECIFICATION"

    次の変数を置き換えます。

    Ansible

    ansible-playbook SWITCHOVER_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="SWITCHOVER_SPECIFICATION"

    次の変数を置き換えます。

高可用性用のロードバランサ

ロードバランサ(HAProxy)は、ノードを Keepalived と仮想 IP とペア設定することで、高可用性を実現します。Keepalived は、Virtual Router Redundancy Protocol(VRRP)を使用してフローティング仮想 IP を制御します。データベース クライアント アプリケーションは、データベース ノードの IP アドレスではなく、この仮想 IP に接続します。

専用のロードバランサが使用されていない構成では、Keepalived はデータベース ノードに直接インストールされます。このシナリオでは、仮想 IP を現在のプライマリ ノードに動的に割り当てることで高可用性が実現され、プライマリが使用できなくなった場合でもシームレスなフェイルオーバーが保証されます。

安定した選出を確立するために、Keepalived はデータベース クラスタ ノードに VRRP 優先度を割り当てます。最初のロードバランサ ノードは、Keepalived の優先度が高いプライマリ ロール(110 など)を想定しています。後続のノードは、優先度の低いセカンダリとして機能します(例: 100)。

仮想 IP が健全なノードを指すように、Keepalived は 2 秒ごとに継続的なヘルスチェックを実行します。これにより、systemd HAProxy プロセスの状態が検証されます。プライマリの HAProxy サービスが失敗すると、Keepalived は仮想 IP を正常なセカンダリ ノードに移行します。

データベース ノードのメンバーシップが変更されると、HAProxy と Keepalived は新しいアクティブ データベース ノードを自動的に指します。基盤となるルーティング構成が、ライブ クライアント接続をドロップせずに更新されます。

ロードバランサを構成する

ロードバランサ ノードの仮想 IP を構成するには、DBCluster 仕様の primarySpec フィールドに次の dbLoadBalancerOptions フィールドを追加します。

DBCluster:
  spec:
    primarySpec:
      ...
      dbLoadBalancerOptions:
        onprem:
          loadBalancerIP: "VIRTUAL_IP"
          loadBalancerType: "internal"
          loadBalancerInterface: "VIRTUAL_IP_INTERFACE"

次の変数を置き換えます。

  • VIRTUAL_IP: フローティング仮想 IP に使用される静的 IP アドレス。データベース クライアント アプリケーションは、ここで定義された IP アドレスを使用します。Keepalived がグラティアス ARP を正常にブロードキャストできるようにするには、この IP アドレスが使用可能である必要があります。ループバックはできません。オンプレミスの場合は、プライマリ ノード インターフェースと同じサブネットに属している必要があります。

  • VIRTUAL_IP_INTERFACE: VIRTUAL_IP が構成されているネットワーク インターフェース。デフォルト値は eth0 です。