外部の PostgreSQL インスタンスとの Geo

このドキュメントは、Omnibusによって管理されていないPostgreSQLインスタンスを使用している場合に関連します。 これには、AWS RDSのようなクラウド管理されたインスタンスや、手動でインストールして設定したPostgreSQLインスタンスが含まれます。

注意: Omnibus管理インスタンスは積極的に開発およびテストされているため、Omnibus管理インスタンスを実行することを強くお勧めします。 ほとんどの外部(Omnibus管理ではない)データベースとの互換性を目指していますが、互換性を保証するものではありません。

一次ノード

  1. GitLabのプライマリアプリケーションサーバにSSHで接続し、rootでログインします:

    sudo -i
    
  2. /etc/gitlab/gitlab.rb を編集し、ノードのユニークID(任意の値)を追加します:

    # The unique identifier for the Geo node.
    gitlab_rails['geo_node_name'] = '<node_name_here>'
    
  3. 変更を有効にするには、プライマリノードを再設定します:

    gitlab-ctl reconfigure
    
  4. 以下のコマンドを実行して、ノードをプライマリ・ノードとして定義します:

    gitlab-ctl set-geo-primary-node
    

    このコマンドは/etc/gitlab/gitlab.rbで定義したexternal_url を使用します。

複製する外部データベースの設定

外部データベースを設定するには、次のいずれかを実行します:

  • 自分でストリーミングレプリケーションを設定します(例えばAWS RDSで)。
  • Omnibusの設定は、以下のように手動で行います。

クラウド・プロバイダーのツールを活用して、プライマリー・データベースを複製します。

RDSを使用するAWS EC2上にプライマリノードがセットアップされている場合、別のリージョンに読み取り専用のレプリカを作成するだけで、レプリケーションプロセスはAWSによって管理されます。 必要に応じてネットワークACL、サブネット、セキュリティグループを設定し、セカンダリアプリケーションノードがデータベースにアクセスできるようにしてください。

以下の手順では、一般的なクラウドプロバイダの読み取り専用レプリカを作成する方法を詳しく説明します:

読み取り専用レプリカの設定が完了したら、セカンダリ・アプリケーション・ノードの設定に進むことができます。

レプリケーション用のプライマリ・データベースの手動設定

geo_primary_roleは、pg_hba.confpostgresql.confに変更を加えることで、プライマリノードのデータベースがレプリケートされるように構成します。 外部データベース構成に対して以下の構成変更を手動で行い、その後にPostgreSQLを再起動して変更を有効にするようにしてください:

##
## Geo Primary Role
## - pg_hba.conf
##
host    all         all               <trusted primary IP>/32       md5
host    replication gitlab_replicator <trusted primary IP>/32       md5
host    all         all               <trusted secondary IP>/32     md5
host    replication gitlab_replicator <trusted secondary IP>/32     md5
##
## Geo Primary Role
## - postgresql.conf
##
wal_level = hot_standby
max_wal_senders = 10
wal_keep_segments = 50
max_replication_slots = 1 # number of secondary instances
hot_standby = on

二次ノード

レプリカデータベースの手動設定

外部レプリカデータベースのpg_hba.confpostgresql.conf、以下の設定を手動で変更し、その後PostgreSQLを再起動して変更を有効にするようにしてください:

##
## Geo Secondary Role
## - pg_hba.conf
##
host    all         all               <trusted secondary IP>/32     md5
host    replication gitlab_replicator <trusted secondary IP>/32     md5
host    all         all               <trusted primary IP>/24       md5
##
## Geo Secondary Role
## - postgresql.conf
##
wal_level = hot_standby
max_wal_senders = 10
wal_keep_segments = 10
hot_standby = on

外部リード・レプリカを使用するようにセカンダリ・アプリケーション・ノードを設定します。

Omnibusでは、geo_secondary_role、主に3つの機能があります:

  1. レプリカデータベースを設定します。
  2. トラッキングデータベースを設定します。
  3. Geoログカーソルを有効にします(このセクションでは説明しません)。

外部リード・レプリカ・データベースへの接続を設定し、ログ・カーソルを有効にするには、以下の手順に従います:

  1. GitLabセカンダリアプリケーションサーバにSSHで接続し、rootでログインします:

    sudo -i
    
  2. /etc/gitlab/gitlab.rb を編集し、以下を追加します。

    ##
    ## Geo Secondary role
    ## - configure dependent flags automatically to enable Geo
    ##
    roles ['geo_secondary_role']
    
    # note this is shared between both databases,
    # make sure you define the same password in both
    gitlab_rails['db_password'] = '<your_password_here>'
    
    gitlab_rails['db_username'] = 'gitlab'
    gitlab_rails['db_host'] = '<database_read_replica_host>'
    
    # Disable the bundled Omnibus PostgreSQL, since we are
    # using an external PostgreSQL
    postgresql['enable'] = false
    
  3. ファイルを保存し、GitLabを再設定します。

追跡データベースの設定

セカンダリノードでは、レプリケーションステータスを追跡し、潜在的なレプリケーションの問題から自動的に回復するために、別のPostgreSQLインストールを追跡データベースとして使用します。Omnibusでは、roles ['geo_secondary_role'] を設定すると、追跡データベースが自動的に設定されます。このデータベースをOmnibusの外部で実行する場合は、以下の手順に従ってください。

トラッキングデータベースにクラウドマネージドサービスを使用している場合、トラッキングデータベースユーザーに追加のロールを付与する必要があるかもしれません(デフォルトでは、gitlab_geo):

  • Amazon RDSにはrds_superuser ロールが必要です。
  • Azure Database for PostgreSQL にはazure_pg_admin ロールが必要です。

トラッキング・データベースは、パフォーマンス向上のため、セカンダリ・レプリカ・データベースとの FDW接続が必要です。

トラッキング・データベースとして使用する外部データベースをお持ちの場合は、以下の手順に従ってください:

注意:AWS RDS をトラッキングデータベースとして使用する場合は、セカンダリデータベースにアクセスできるようにしてください。 残念ながら、アウトバウンドルールは RDS PostgreSQL データベースには適用されないため、同じセキュリティグループを割り当てるだけでは十分ではありません。 そのため、read-replica のセキュリティグループに、ポート 5432 のトラッキングデータベースからの TCP トラフィックを許可するインバウンドルールを明示的に追加する必要があります。
  1. セカンダリノードが追跡データベースと通信できるように、追跡データベースに関連付けられているpg_hba.conf を手動で変更してください。 変更を有効にするために、PostgreSQL を再起動することを忘れないでください:

    ##
    ## Geo Tracking Database Role
    ## - pg_hba.conf
    ##
    host    all         all               <trusted tracking IP>/32      md5
    host    all         all               <trusted secondary IP>/32     md5
    
  2. GitLabのセカンダリサーバにSSHで接続し、rootでログインします:

    sudo -i
    
  3. PostgreSQLインスタンスのあるマシンの接続パラメータと認証情報で/etc/gitlab/gitlab.rb

    geo_secondary['db_username'] = 'gitlab_geo'
    geo_secondary['db_password'] = '<your_password_here>'
    
    geo_secondary['db_host'] = '<tracking_database_host>'
    geo_secondary['db_port'] = <tracking_database_port>      # change to the correct port
    geo_secondary['db_fdw'] = true       # enable FDW
    geo_postgresql['enable'] = false     # don't use internal managed instance
    
  4. ファイルを保存し、GitLabを再設定します。

  5. トラッキングデータベースのマイグレーションを実行します:

    gitlab-rake geo:db:create
    gitlab-rake geo:db:migrate
    
  6. PostgreSQLFDW接続と認証情報を設定します:

    以下のスクリプトを/tmp/geo_fdw.sh などのファイルに保存し、接続パラメータを環境にあわせて変更してください。 実行するとFDW接続が設定されます。

    #!/bin/bash
    
    # Secondary Database connection params:
    DB_HOST="<public_ip_or_vpc_private_ip>"
    DB_NAME="gitlabhq_production"
    DB_USER="gitlab"
    DB_PASS="<your_password_here>"
    DB_PORT="5432"
    
    # Tracking Database connection params:
    GEO_DB_HOST="<public_ip_or_vpc_private_ip>"
    GEO_DB_NAME="gitlabhq_geo_production"
    GEO_DB_USER="gitlab_geo"
    GEO_DB_PORT="5432"
    
    query_exec () {
      gitlab-psql -h $GEO_DB_HOST -U $GEO_DB_USER -d $GEO_DB_NAME -p $GEO_DB_PORT -c "${1}"
    }
    
    query_exec "CREATE EXTENSION postgres_fdw;"
    query_exec "CREATE SERVER gitlab_secondary FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '${DB_HOST}', dbname '${DB_NAME}', port '${DB_PORT}');"
    query_exec "CREATE USER MAPPING FOR ${GEO_DB_USER} SERVER gitlab_secondary OPTIONS (user '${DB_USER}', password '${DB_PASS}');"
    query_exec "CREATE SCHEMA gitlab_secondary;"
    query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};"
    
    注意:上記のスクリプトテンプレートは、Geo マシンから実行することを想定しているためgitlab-psql を使用していますが、psql データベースにアクセスできる任意のマシンから実行psqlするように変更することができますpsql 。 またpsql、AWS RDS 用にpsql 使用することをお勧めしますpsql
  7. ファイルを保存し、GitLabを再起動します。
  8. FDWテーブルを入力します:

    gitlab-rake geo:db:refresh_foreign_tables