PostgreSQLのDBLINK設定 | NOSAKAブログ

■ ■ やりたいこと ■ ■

PostgreSQLからRedshiftのテーブルを参照したい。

方法としては、DBLINKとpostgres_fdwというのがあるらしい。

 

■DBLINK

あるPostgreSQLから、別のPostgreSQLにアクセスできる。

PostgreSQL標準の機能。

リモートDBが持つテーブルにローカルライクにアクセスできるが、

・リモート表をSELECTする場合、データを全件ローカルに持ってくるためデータ転送が多くなる。
・リモートDBのテーブルや行をロックしない。整合性を担保するためには二相コミットの実装が必要。

・独特なSQL書式

など、制約はある。

 

■postgres_fdw

DBLINKの後継機能。

クエリはオーソドックスな書式で通用するが、結合、ソート、

LIMIT、集約などがリモートではなくローカルで行われる。

*WHERE句によるシンプルな絞り込みはリモートで行ってくれる。

 

■それぞれの特徴を把握して、使い分けが必要。

 

■ ■ 設定 ■ ■

■Redshiftでの作業

・PostgreSQLから参照する用のテーブル作成
 https://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/rs-gsg-create-sample-db.html

 サンプルデータはS3からLOADする。

 

既存のIAMロールに"AmazonS3ReadOnlyAccess"を与えたが、いろんな検証で使ってきたため、ロール名と権限内容が一致せずわかりにくい。IAMロールに限らず、セキュリティグループ名やインスタンス名も、内容と一致していない。

使い分けを考えないと。

あと、適切かつ分かりやすい名称をぱっと思いつく才能がほしい。

意外と悩むところ。

 

・セキュリティグループの設定

PostgreSQLからポート5349(Redshift)に接続できるよう、インバウンドの設定を追加する。
PostgreSQLのIPは、踏み台にて以下のコマンドを実行して確認。
$ nslookup
> <PostgreSQLのエンドポイント>

 

■PostgreSQLでの作業

・まずはRDS PostgreSQLを起動

 バージョン9.5以上、Redshiftと同じAZ。

・モジュール導入

 CREATE EXTENSION postgres_fdw;

 CREATE EXTENSION dblink;

 ¥dx

 

・Redshiftのサーバ情報を設定
  /* 外部サーバ設定 */
  CREATE SERVER foreign_server
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (
      host 'xx.xx.xx.xx',
      port '5439',
      dbname '<dbName>',
      sslmode 'require');
  *hostはRedshiftのプライベートIP

 

  /* PostgreSQLとRedshiftのユーザ情報をマッピングさせる */
  CREATE USER MAPPING FOR <PostgreSQL DB Name>
    SERVER foreign_server
    OPTIONS (
    user '<Redshift User Name>',
    password '<Redshift Password>');

 

/* DBLINKでRedshiftのデータをSELECT */
SELECT *
FROM dblink('foreign_server',$REDSHIFT$
    SELECT sellerid, sum(pricepaid) sales
    FROM sales
    WHERE saletime >= '2008-01-01'
    AND saletime < '2008-02-01'
    GROUP BY sellerid 
    ORDER BY sellerid DESC
$REDSHIFT$) AS t1 (sellerid int, sales decimal)
LIMIT 10;

 

/* postgres_fdwでRedshiftのデータをSELECT */

未実施

 

■ ■ わからなかったところ ■ ■

・DBLINKで参照されるテーブルは、publicスキーマに作る必要があるのか??

 テスト用のスキーマに作成したテーブルは参照できなかった。

・postgres_fdwでの参照もやってみたい。