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.1 か bind 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)