Lakebaseからデータを複製する

このガイドでは、Lakebaseデータベースから外部Postgresの購読者に変更を論理的レプリケーションを用いて公開する方法を紹介します。 Lakebaseはパブリッシャーとして機能し、パブリケーションを定義し、外部サブスクライバーが接続して変更を受け取ります。

前提 条件

  • 公開したいデータベースと、公開したいテーブルを含むLakebaseプロジェクトです。
  • パブリケーションを作成するための、databricks_superuser ロールのメンバーである Lakebase の Postgres ロール。 これはあなたが接続時に使用するロールであり、サブスクライバーが使うロールではありません。 最初のステップで加入者のレプリケーションロールを作成します。
  • プロジェクトでパスワード接続を有効にしています。 購読者はネイティブのPostgresパスワードロールで接続し、新規プロジェクトではパスワード接続はデフォルトで無効化されます。 パスワード接続の管理を参照してください。
  • 購読者として機能する外部Postgresデータベース。 サブスクライバーは別の地域のLakebaseデータベースである場合もあります。 同じリージョン内のLakebaseデータベース間のレプリケーションはサポートされていません。

論理レプリケーションはLakebaseでサポートされており、デフォルトでは wal_level = logical で実行されるため、プロジェクトごとに公開をオンにする手順はありません。

レプリケーションロールを作成する

外部加入者が接続できる専用ロールを作成しましょう。 購読者はPostgresのユーザー名とパスワードで接続しているので、OAuthロールではなくネイティブのPostgresパスワードロールを作成してください。 OAuth ロールは、有効期間の短い Azure Databricks トークンで認証されますが、パスワードベースのサブスクリプション接続文字列ではこれを使用できません。 ロールは REPLICATION 属性を備えている必要があります。 Lakebase App、CLI、APIで作成するロールは、ロールにdatabricks_superuserを付与するかどうかに関わらず、この属性を持ちます。 Lakebaseアプリの「ロールを追加」>パスワードタブで、ロール名を入力してください。 databricks_superuserを選ぶ必要はありません。 「ネイティブ Postgres パスワード ロールの作成」を参照してください。

自分でパスワードを設定するなら、代わりにSQLでロールを作成しましょう。 REPLICATION属性を含めてください。SQL で作成されたロールには自動的に付与されないためです:

CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';

そのロールが複製するテーブルを所有していない場合は、読み取り権限を付与してください:

GRANT USAGE ON SCHEMA public TO replication_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO replication_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO replication_user;

出版物を作成する

databricks_superuserロールのメンバーとしてLakebaseデータベースに接続し、複製したいテーブルのパブリケーションを作成します。 各テーブルには PRIMARY KEY またはレプリカ ID が設定されている必要があります。 Postgresのドキュメントにある レプリカ識別 についてご参照ください。

CREATE PUBLICATION my_publication FOR TABLE orders, customers;

サブスクライバーが接続できるようにする

外部サブスクライバーはAzure Databricksのエッジプロキシを通じてLakebaseに接続し、このエッジプロキシがワークスペースのIPアクセスリストを適用します。 Lakebaseデータベースにアクセスできるように、加入者のIPアドレスをワークスペースのIPアクセスリストに追加してください。 「 IPアクセスリストの管理」を参照してください。

加入者接続にはPrivate Linkはサポートされていません。 加入者は公開のLakebaseエンドポイントを通じて接続します。

外部データベースからサブスクライブしてください

外部のPostgresデータベースで、公開するテーブルと同じ名前とカラムでターゲットテーブルを作成してください。 空に作成する:ターゲットテーブルにすでに行が含まれている場合、重複キーや制約違反で初期コピーが失敗します。 テーブルは手動で作成するか、Lakebaseからスキーマをダンプしてサブスクライバーに読み込むこともできます。 「 スキーマのみをダンプする」を参照してください。

次に、外部データベースでサブスクリプションを作成できる役割として、Lakebaseに接続するサブスクリプションを作成しましょう:

CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=<lakebase-host> port=5432 dbname=<lakebase-db> user=replication_user password=<password> sslmode=verify-full sslrootcert=system'
PUBLICATION my_publication;

加入者には直接接続を使いましょう。 論理レプリケーションには永続的な接続が必要なので、 <lakebase-host> は -pooler 接続プーラーのホスト名ではなく、直接エンドポイントのホスト名でなければなりません。 接続プーリングを参照してください。

Note

Lakebaseはすべての接続でTLSを強制するため、トラフィックは常に暗号化され、何の操作も不要です。 最も強力な保護を得るためには、sslmode=verify-full を使用して接続してください。これは、Lakebase サーバー証明書をシステムのルートストアと照合して検証します。 Lakebaseはパブリックに信頼された証明書を使用しているため、追加の証明書は必要ありません。 より弱い sslmode=require は暗号化しますが、サーバーの検証はしません。

レプリケーションの検証

外部サブスクライバーで既存の行が届いたことを確認します:

SELECT COUNT(*) FROM orders;

Lakebaseで行を挿入または更新し、その後、サブスクライバーを再度クエリします。 変更は数秒以内にサブスクライバーに表示されます。

購読者の購読状況と遅延を確認してください:

SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;

初期コピーが完了したことを確認するには、サブスクライバーの Monitor replication でテーブルごとの同期状態クエリを実行し、すべてのテーブルに Ready (fully live) と表示されるまで待ちます。

加入者の接続はLakebaseパブリッシャー上でレプリケーションスロットを維持しています。 サブスクライバーがアクティブにレプリケーションしている間は、Lakebaseのコンピュートはゼロまでスケールしません。 論理レプリケーションとゼロへのスケールを参照してください。 加入者が変更の消費を停止すると、スロットは非アクティブとなり、Lakebaseはそのスロットを約40時間後に削除します。 非アクティブなスロットの自動削除を参照してください。

次のステップ

  • レプリケーション管理: パブリケーションやスロットを監視し、トラブルシューティングを行います。 「 論理複製の管理と監視」を参照してください。
  • Lakebaseへの複製: 外部PostgresデータベースをLakebaseに複製します。 「 データをLakebaseに複製する」を参照してください。
  • 方法を比較する:Lakebaseへのデータの出入りに適切な方法を選択してください。 「Lakebase へのデータの出入り」を参照してください。