このガイドでは、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 へのデータの出入り」を参照してください。