PostgreSQL 9.2にredis_fdwをインストールした記録

相変わらず、DBのインストールは以下のポリシーでやってます。
あ、あとソースコンパイル導入系は、Pacoを使って管理してます。

インストール:
/usr/local/pgsql/${pgsql_version}/

データベースクラスタ:
/home/postgres/${pgsql_version}/data

今回は、SL6.3のPostgreSQL 9.2.0で試してます。事前に、redis_fdwはhiredisが必要なので、インストールしておきます。

yum install -y hiredis-devel

で、FDW入れるなら、pgxnclient使うと簡単に入るわけですが、実際は、こんな感じ。。。

# pgxnclient install redis_fdw
INFO: best version: redis_fdw 1.0.0
INFO: saving /tmp/tmpjdIyEI/redis_fdw-1.0.0.zip
INFO: unpacking: /tmp/tmpjdIyEI/redis_fdw-1.0.0.zip
INFO: building extension
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I. -I. -I/usr/local/pgsql/9.2.0/include/server -I/usr/local/pgsql/9.2.0/include/internal -D_GNU_SOURCE   -c -o redis_fdw.o redis_fdw.c
redis_fdw.c:103: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
redis_fdw.c: In function ‘redis_fdw_handler’:
redis_fdw.c:130: error: ‘FdwRoutine’ has no member named ‘PlanForeignScan’
redis_fdw.c:130: error: ‘redisPlanForeignScan’ undeclared (first use in this function)
redis_fdw.c:130: error: (Each undeclared identifier is reported only once
redis_fdw.c:130: error: for each function it appears in.)
redis_fdw.c: トップレベル:
redis_fdw.c:321: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
redis_fdw.c: In function ‘redisBeginForeignScan’:
redis_fdw.c:480: 警告: implicit declaration of function ‘RelationGetRelid’
redis_fdw.c:544: error: 不完全型のポインタへの間接参照
redis_fdw.c:581: error: 不完全型のポインタへの間接参照
make: *** [redis_fdw.o] エラー 1
ERROR: command returned 2: make PG_CONFIG=/usr/local/pgsql/9.2.0/bin/pg_config all

だけど、ソースコンパイルしたら、うまく導入できたので、その記録。

まずは、環境変数を設定。(最初からやっとけよって??複数環境とか別バージョン入れるとミスると痛いので。。。)

export PATH=$PATH:/usr/local/pgsql/9.2.0/bin
export PG_CONFIG=/usr/local/pgsql/9.2.0/bin/pg_config
export USE_PGXS=1

んで、ソースをcloneして持ってくると。

git clone https://github.com/dpage/redis_fdw.git

でcloneしたソースのブランチを見てみると、

git branch
   rREL9_2_STABLE
*  master

おー。。。9.2のstableあるじゃん!!ということで、切り替えて

git checkout REL9_2_STABLE

後は、makeしてインストール(Paco使ってるので、Pacoでインストール管理)

make install USE_PGXS=1
paco -D make install

んで、CREATE EXTENSIONをする。

su - postgres -c '/usr/local/pgsql/9.2.0/bin/psql -c "CREATE EXTENSION redis_fdw;"'
CREATE EXTENSION

/usr/local/pgsql/9.2.0/bin/psql 
psql (9.2.0)
Type "help" for help.

確認っと。

postgres=# \dx
                            List of installed extensions
   Name    | Version |   Schema   |                   Description                    
-----------+---------+------------+--------------------------------------------------
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 redis_fdw | 1.0     | public     | Foreign data wrapper for querying a Redis server
(2 rows)

入ってる、入ってる。。。

あ、外部からの問い合わせの場合は、redis.confの

bind 127.0.0.1

は、

#bind 127.0.0.1bind 0.0.0.0

に変更して下さい。

あとは、PostgreSQLさんに接続先を教えてあげて問い合わせ。

postgres=# CREATE SERVER redis_server
postgres-# FOREIGN DATA WRAPPER redis_fdw
postgres-# OPTIONS (address '192.168.xxx.xxx', port '6379');
CREATE SERVER
postgres=#
postgres=# CREATE FOREIGN TABLE redis_db0 (key text, value text)
postgres-# SERVER redis_server
postgres-# OPTIONS (database '0');
CREATE FOREIGN TABLE
postgres=# CREATE USER MAPPING FOR PUBLIC
postgres-# SERVER redis_server
postgres-# OPTIONS (password '');
CREATE USER MAPPING

postgres=# SELECT * FROM redis_db0 WHERE key = 'bid_price_hallname_1/123';
NOTICE:  Got qual key = bid_price_hallname_1/123
NOTICE:  Executed: KEYS bid_price_hallname_1/123
           key            |                                     value                                  
    
--------------------------+----------------------------------------------------------------------------
----
price | {"price":5000000000,"id":"xxx","session_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
(1 row)

でも、

There is currently no support for non-scalar datatypes in Redis such as lists.

リスト型使いたい。。。(ToT)