Skip to main content

クラスタの High Availability レプリケーションを設定する

GitHub Enterprise Server クラスタ全体のパッシブレプリカを別の場所に設定することで、クラスタを冗長ノードにフェイルオーバーできるようにします。

クラスタの High Availability レプリケーションについて

High Availability を実現するために、GitHub Enterprise Server のクラスタデプロイメントを設定できます。この場合、パッシブノードの同一のセットがアクティブクラスタ内のノードと同期されます。 ハードウェアまたはソフトウェアの障害がアクティブなクラスタのデータセンターに影響を与える場合は、手動でレプリカノードにフェイルオーバーし、ユーザリクエストの処理を続行して、停止の影響を最小限に抑えることができます。

High Availability モードでは、各アクティブノードは対応するパッシブノードと定期的に同期します。 パッシブノードはスタンバイで実行され、アプリケーションへのサービス提供や、ユーザ要求の処理は行われません。

GitHub Enterprise Server の包括的なシステム災害復旧計画の一部として High Availability を設定することをお勧めします。 また、定期的なバックアップを実行することをお勧めします。 詳細については、「アプライアンスでのバックアップの設定」を参照してください。

前提条件

ハードウェアとソフトウェア

アクティブなクラスタ内の既存のノードごとに、同一のハードウェアリソースを使用して2番目の仮想マシンをプロビジョニングする必要があります。 たとえば、クラスターに 11 個のノードがあり、各ノードに 12 個の vCPU、96 GB の RAM、および 750 GB の接続ストレージがある場合、それぞれが 12 個の vCPU、96 GB の RAM、および 750 GB の接続ストレージを備えた 11 個の新しい仮想マシンをプロビジョニングする必要があります。

新しい仮想マシンごとに、アクティブクラスタ内のノードで実行されているものと同じバージョンの GitHub Enterprise Server をインストールします。 ライセンスをアップロードしたり、追加の設定を実行したりする必要はありません。 詳細については、「GitHub Enterprise Server インスタンスをセットアップする」を参照してください。

: High Availability レプリケーションに使用する予定のノードは、スタンドアロンの GitHub Enterprise Server インスタンスである必要があります。 パッシブノードを2番目のクラスタとして初期化しないでください。

ネットワーク

プロビジョニングする新しいノードごとに静的 IP アドレスを割り当てる必要があります。また、接続を受け入れてクラスタのフロントエンド層のノードに転送するようにロードバランサを設定する必要があります。

アクティブクラスタを使用するネットワークとパッシブクラスタを使用するネットワークの間にファイアウォールを設定することはお勧めしません。 アクティブノードのあるネットワークとパッシブノードのあるネットワークの間の遅延は、70 ミリ秒未満である必要があります。 パッシブ クラスター内のノード間のネットワーク接続の詳細については、「クラスターのネットワーク構成」を参照してください。

クラスタの High Availability レプリカを作成する

アクティブノードをプライマリデータセンターに割り当てる

パッシブノードのセカンダリデータセンターを定義する前に、アクティブノードをプライマリデータセンターに割り当てていることを確認してください。

  1. クラスタ内のいずれかのノードにSSHで接続してください。 詳細については、「管理シェル (SSH) にアクセスする」を参照してください。

  2. /data/user/common/cluster.conf のクラスター設定ファイルをテキスト エディターで開いてください。 たとえばVimを利用できます。

    sudo vim /data/user/common/cluster.conf
    
  3. クラスタのプライマリデータセンターの名前に注意します。 クラスター構成ファイルの上部にある [cluster] セクションでは、キーと値のペア primary-datacenter を使用して、プライマリ データセンターの名前を定義します。 既定では、クラスターのプライマリ データセンターの名前は default です。

    [cluster]
      mysql-master = HOSTNAME
      redis-master = HOSTNAME
      primary-datacenter = default
    • 必要に応じて、primary-datacenter の値を編集して、プライマリ データセンター名をよりわかりやすい名前に変更します。
  4. クラスター構成ファイルでは、[cluster "HOSTNAME"] 見出しの下に各ノードが示されます。 各ノードの見出しの下に、新しいキー/値ペアのペアを追加して、ノードをデータセンターに割り当てます。 上記のステップ 3 と同じ値 primary-datacenter を使用します。 たとえば、既定の名前 (default) を使用する場合は、次のキーと値のペアを各ノードのセクションに追加します。

    datacenter = default
    

    完了すると、クラスタ設定ファイルの各ノードのセクションは次の例のようになります。 キー/値ペアの順序は問題になりません。

    [cluster "HOSTNAME"]
      datacenter = default
      hostname = HOSTNAME
      ipv4 = IP ADDRESS
      ...
    ...

    : ステップ 3 でプライマリ データセンター名を変更した場合は、各ノードのセクションでキーと値のペア consul-datacenter を見つけ、その値を名前変更したプライマリ データセンターに変更します。 たとえば、プライマリ データセンターに primary という名前を付けた場合は、ノードごとに次のキーと値のペアを使用します。

    consul-datacenter = primary
    
  5. 新しい設定を適用してください。 このコマンドの完了には時間がかかる場合があるため、screen または tmux などのターミナル マルチプレクサーでコマンドを実行することをお勧めします。

    ghe-cluster-config-apply
    
  6. 設定の実行を終了すると、GitHub Enterprise Serverは以下のメッセージを表示します。

    Finished cluster configuration

GitHub Enterprise Server がプロンプトに戻ったら、ノードをクラスタのプライマリデータセンターに割り当てます。

パッシブノードをクラスタ設定ファイルに追加する

High Availability を設定するには、クラスタ内のすべてのアクティブノードに対応するパッシブノードを定義する必要があります。 次の手順では、アクティブノードとパッシブノードの両方を定義する新しいクラスタ設定を作成します。 このチュートリアルの内容は次のとおりです。

  • アクティブなクラスタ設定ファイルのコピーを作成します。
  • コピーを編集して、アクティブノードに対応するパッシブノードを定義し、プロビジョニングした新しい仮想マシンの IP アドレスを追加します。
  • クラスタ設定の変更されたコピーをアクティブな設定にマージします。
  • 新しい設定を適用してレプリケーションを開始します。

構成例については、「構成例」を参照してください。

  1. クラスタ内のノードごとに、同じバージョンの GitHub Enterprise Server を実行して、同じ仕様で一致する仮想マシンをプロビジョニングします。 新しい各クラスターノードの IPv4 アドレスとホスト名に注意してください。 詳しい情報については、「前提条件」を参照してください。

    : フェイルオーバー後に High Availability を再構成する場合は、代わりにプライマリ データセンターの古いノードを使用できます。

  2. クラスタ内のいずれかのノードにSSHで接続してください。 詳細については、「管理シェル (SSH) にアクセスする」を参照してください。

  3. 既存のクラスタ設定をバックアップします。

    cp /data/user/common/cluster.conf ~/$(date +%Y-%m-%d)-cluster.conf.backup
    
  4. /home/admin/cluster-passive.conf などの一時的な場所に、既存のクラスター設定ファイルのコピーを作成します。 IP アドレス (ipv*)、UUID (uuid)、WireGuard の公開キー (wireguard-pubkey) に対するキーと値のペアを削除します。

    grep -Ev "(?:|ipv|uuid|vpn|wireguard\-pubkey)" /data/user/common/cluster.conf > ~/cluster-passive.conf
    
  5. 前のステップでコピーした一時クラスター構成ファイルから [cluster] セクションを削除します。

    git config -f ~/cluster-passive.conf --remove-section cluster
    
  6. パッシブノードをプロビジョニングしたセカンダリデータセンターの名前を決定してから、一時クラスタ設定ファイルを新しいデータセンター名で更新します。 SECONDARY を、選んだ名前に置き換えます。

    sed -i 's/datacenter = default/datacenter = SECONDARY/g' ~/cluster-passive.conf
  7. パッシブノードのホスト名のパターンを決定します。

    警告: パッシブ ノードのホスト名は一意であり、対応するアクティブ ノードのホスト名とは違うものにする必要があります。

  8. ステップ 3 の一時クラスタ設定ファイルをテキストエディタで開きます。 たとえばVimを利用できます。

    sudo vim ~/cluster-passive.conf
  9. 一時クラスタ設定ファイル内の各セクションで、ノードの設定を更新します。 クラスター構成ファイルでは、[cluster "HOSTNAME"] 見出しの下に各ノードが示されます。

    • 上記のステップ 7 で選んだパターンに従って、セクション見出しの引用符で囲まれたホスト名とセクション内の hostname の値をパッシブ ノードのホスト名に変更します。
    • ipv4 という名前の新しいキーを追加し、その値をパッシブノードの静的 IPv4 アドレスに設定します。
    • 新しいキーと値のペア replica = enabled を追加します。
    [cluster "NEW PASSIVE NODE HOSTNAME"]
      ...
      hostname = NEW PASSIVE NODE HOSTNAME
      ipv4 = NEW PASSIVE NODE IPV4 ADDRESS
      replica = enabled
      ...
    ...
  10. ステップ 4 で作成した一時クラスタ設定ファイルの内容をアクティブ設定ファイルに追加します。

    cat ~/cluster-passive.conf >> /data/user/common/cluster.conf
  11. セカンダリデータセンターのプライマリ MySQL ノードと Redis ノードを指定します。 REPLICA MYSQL PRIMARY HOSTNAMEREPLICA REDIS PRIMARY HOSTNAME を、既存の MySQL および Redis プライマリと一致するようにプロビジョニングしたパッシブ ノードのホスト名に置き換えます。

    git config -f /data/user/common/cluster.conf cluster.mysql-master-replica REPLICA MYSQL PRIMARY HOSTNAME
    git config -f /data/user/common/cluster.conf cluster.redis-master-replica REPLICA REDIS PRIMARY HOSTNAME

    警告: 続ける前に、クラスター構成ファイルを確認してください。

    • トップレベルの [cluster] セクションで、mysql-master-replicaredis-master-replica の値が、フェイルオーバー後に MySQL と Redis のプライマリとして機能するセカンダリ データセンター内のパッシブ ノードに対する正しいホスト名であることを保証します。
    • [cluster "ACTIVE NODE HOSTNAME"] という名前の付いたアクティブ ノードの各セクションで、次のキーと値のペアをもう一度確認します。
      • datacenter は、最上位セクション primary-datacenter[cluster] 値と一致する必要があります。
      • consul-datacenter は、datacenter の値と一致する必要があります。これは、最上位セクション [cluster] にある primary-datacenter の値と同じです。
    • アクティブ ノードごとに、構成には、同じロールを持つ 1 つ のパッシブ ノードに対応するセクションが構成に 1 つ 確実に存在するようにします。 パッシブノードの各セクションで、各キー/値ペアを再確認します。
      • datacenter は、他のすべてのパッシブ ノードと一致する必要があります。
      • consul-datacenter は、他のすべてのパッシブ ノードと一致する必要があります。
      • hostname は、セクション見出しのホスト名と一致する必要があります。
      • ipv4 は、ノードの一意の静的 IPv4 アドレスと一致する必要があります。
      • replicaenabled として構成する必要があります。
    • 必要に応じて、使用されなくなったオフラインノードのセクションを削除してください。

    構成例を確認するには、「構成例」を参照してください。

  12. 新しいクラスタ設定を初期化します。 このコマンドの完了には時間がかかる場合があるため、screen または tmux などのターミナル マルチプレクサーでコマンドを実行することをお勧めします。

    ghe-cluster-config-init
  13. 初期化が完了すると、GitHub Enterprise Server は次のメッセージを表示します。

    Finished cluster initialization
  14. 新しい設定を適用してください。 このコマンドの完了には時間がかかる場合があるため、screen または tmux などのターミナル マルチプレクサーでコマンドを実行することをお勧めします。

    ghe-cluster-config-apply
    
  15. 設定の実行を終了すると、GitHub Enterprise Serverは以下のメッセージを表示します。

    Finished cluster configuration
  16. パッシブノードにフェイルオーバーした場合にユーザからの接続を受け入れるロードバランサを設定します。 詳細については、クラスター ネットワーク構成に関する記事を参照してください。

クラスタ内のノードの High Availability レプリケーションの設定が完了しました。 各アクティブノードは、対応するパッシブノードへの設定とデータの複製を開始します。障害が発生した場合は、トラフィックをセカンダリデータセンターのロードバランサに転送できます。 フェールオーバーの詳細については、「レプリカ クラスターへのフェールオーバーの開始」を参照してください。

構成例

最上位の [cluster] 構成は、次の例のようになります。

[cluster]
  mysql-master = HOSTNAME OF ACTIVE MYSQL MASTER
  redis-master = HOSTNAME OF ACTIVE REDIS MASTER
  primary-datacenter = PRIMARY DATACENTER NAME
  mysql-master-replica = HOSTNAME OF PASSIVE MYSQL MASTER
  redis-master-replica = HOSTNAME OF PASSIVE REDIS MASTER
  mysql-auto-failover = false
...

クラスタのストレージ層のアクティブノードの設定は、次の例のようになります。

...
[cluster "UNIQUE ACTIVE NODE HOSTNAME"]
  datacenter = default
  hostname = UNIQUE ACTIVE NODE HOSTNAME
  ipv4 = IPV4 ADDRESS
  consul-datacenter = default
  consul-server = true
  git-server = true
  pages-server = true
  mysql-server = true
  elasticsearch-server = true
  redis-server = true
  memcache-server = true
  metrics-server = true
  storage-server = true
  vpn = IPV4 ADDRESS SET AUTOMATICALLY
  uuid = UUID SET AUTOMATICALLY
  wireguard-pubkey = PUBLIC KEY SET AUTOMATICALLY
...

ストレージ層内の対応するパッシブノードの設定は、次の例のようになります。

  • 対応するアクティブ ノードとの大きな違いは 太字 であることです。
  • GitHub Enterprise Server は、vpnuuid、および wireguard-pubkey の値を自動的に割り当てるため、初期化するパッシブ ノードの値を定義しないでください。
  • *-server キーで定義されたサーバー ロールは、対応するアクティブ ノードと一致します。
...
[cluster "UNIQUE PASSIVE NODE HOSTNAME"]
  replica = enabled
  ipv4 = IPV4 ADDRESS OF NEW VM WITH IDENTICAL RESOURCES
  datacenter = SECONDARY DATACENTER NAME
  hostname = UNIQUE PASSIVE NODE HOSTNAME
  consul-datacenter = SECONDARY DATACENTER NAME
  consul-server = true
  git-server = true
  pages-server = true
  mysql-server = true
  elasticsearch-server = true
  redis-server = true
  memcache-server = true
  metrics-server = true
  storage-server = true
  vpn = DO NOT DEFINE
  uuid = DO NOT DEFINE
  wireguard-pubkey = DO NOT DEFINE
...

アクティブクラスターノードとパッシブクラスターノード間のレプリケーションを監視する

クラスタ内のアクティブノードとパッシブノード間の初期レプリケーションには時間がかかります。 時間は、複製するデータの量と GitHub Enterprise Server のアクティビティレベルによって異なります。

GitHub Enterprise Server 管理シェルから利用できるコマンドラインツールを使用して、クラスタ内の任意のノードの進行状況を監視できます。 管理シェルの詳細については、「管理シェル (SSH) にアクセスする」を参照してください。

  • データベースのレプリケーションの監視する:

    /usr/local/share/enterprise/ghe-cluster-status-mysql
    
  • リポジトリと Gist データのレプリケーションを監視する:

    ghe-spokes status
    
  • 添付ファイルと LFS データのレプリケーションを監視する:

    ghe-storage replication-status
    
  • Pages データのレプリケーションを監視する:

    ghe-dpages replication-status
    

ghe-cluster-status を使用すると、クラスターの全体的な正常性を確認することができます。 詳細については、「コマンド ライン ユーティリティ」を参照してください。

フェイルオーバー後の High Availability レプリケーションを再設定する

クラスタのアクティブノードからクラスタのパッシブノードにフェイルオーバーした後、2 つの方法で High Availability レプリケーションを再設定できます。

新しいパッシブノードのプロビジョニングと設定

フェイルオーバー後、2 つの方法で High Availability を再設定できます。 選択する方法は、フェイルオーバーした理由と元のアクティブノードの状態によって異なります。

  1. セカンダリデータセンターの新しいアクティブノードごとに、パッシブノードの新しいセットをプロビジョニングして設定します。

  2. 古いアクティブノードを新しいパッシブノードとして使用します。

High Availability を再設定するプロセスは、High Availability の初期設定と同じです。 詳細については、「クラスターの High Availability レプリカを作成する」を参照してください。

クラスタの High Availability レプリケーションを無効化する

GitHub Enterprise Server のクラスタデプロイメントのパッシブノードへのレプリケーションを停止できます。

  1. クラスタ内のいずれかのノードにSSHで接続してください。 詳細については、「管理シェル (SSH) にアクセスする」を参照してください。

  2. /data/user/common/cluster.conf のクラスター設定ファイルをテキスト エディターで開いてください。 たとえばVimを利用できます。

    sudo vim /data/user/common/cluster.conf
    
  3. 最上位のセクション [cluster] で、redis-master-replicamysql-master-replica のキーと値のペアを削除します。

  4. パッシブノードの各セクションを削除します。 パッシブ ノードの場合、replicaenabled として構成されます。

  5. 新しい設定を適用してください。 このコマンドの完了には時間がかかる場合があるため、screen または tmux などのターミナル マルチプレクサーでコマンドを実行することをお勧めします。

    ghe-cluster-config-apply
    
  6. 設定の実行を終了すると、GitHub Enterprise Serverは以下のメッセージを表示します。

    Finished cluster configuration

GitHub Enterprise Server がプロンプトに戻ったら、High Availability レプリケーションの無効化が完了したことになります。