mongo_fdw 环境搭建与简单验证

环境说明

本文基于 CentOS Linux release 7.5.1804 (Core) 虚拟机,使用 PostgreSQL 10.5 、MongoDB 4.0.10 和 mongo_fdw (Latest commit 5fe371a on 31 Mar) 搭建的测试验证环境,其中 MongoDB 的驱动使用的是 v0.8。

MongoDB 未开启用户认证模式,使 mongo_fdw 生效的命令(用户映射、创建外部表)大都使用了默认参数。

为了更好地解释说明问题,约定下文中示范命令前的 “#” 符号代表以 root 用户执行,而 “$” 符号代表以 postgres 用户执行。

若遵循以下安装搭建流程,需要 wget、unzip 工具,可使用如下命令获得。

# yum install wget -y
# yum install unzip -y

安装 PostgreSQL 并启动服务

这个比较简单,可以从 rpm 包或者 yum 源安装启动 PostgreSQL,也可以从官网获取源码自行编译安装;下面是自行编译安装启动的示例。

# ./configure && make && make install
$ /usr/local/pgsql/bin/initdb -D ~/data
$ /usr/local/pgsql/bin/pg_ctl -D /home/postgres/data -l logfile start

安装 mongo_fdw 插件

此部分需要注意的是 mongo_fdw 的编译需要 pg_config,所以需要设置一下 PATH 环境变量,否则在编译时报错。

# make
make: pg_config: Command not found
Makefile:51: *** PostgreSQL 9.3, 9.4, 9.5, 9.6 10.0 or 11.0 is required to compile this extension.  Stop.

以下是正确的流程示范。

# wget https://github.com/EnterpriseDB/mongo_fdw/archive/master.zip
# unzip master.zip
# cd mongo_fdw-master/
# ./autogen.sh --with-legacy
# export PATH=$PATH:/usr/local/pgsql/bin/
# make
# make install

安装 MongoDB 并启动服务

命令示范如下所示。

# curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz
# tar -zxvf mongodb-linux-x86_64-4.0.10.tgz
# mv  mongodb-linux-x86_64-4.0.10/ /usr/local/mongodb
# mkdir -p /data/db
# chown -R postgres:postgres /data/

# su - postgres
$ /usr/local/mongodb/bin/mongod # 启动后不要退出 或 "nohup &" 后台启动

启用 mongo_fdw 插件

以 postgress 用户启动 psql,安装 mongo_fdw 插件,创建 MongoDB 服务节点,创建用户映射,创建外部表,插入几条数据,最后可以成功查询出来。

注意创建外部表没有指定数据库,就会使用默认数据库 test。

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

postgres=# CREATE EXTENSION mongo_fdw;
CREATE EXTENSION
postgres=# create server mongo_server foreign data wrapper mongo_fdw options(address '127.0.0.1',port '27017');
CREATE SERVER
postgres=# create user mapping for postgres server mongo_server;
CREATE USER MAPPING
postgres=# create foreign table warehouse(_id NAME, warehouse_id int, warehouse_name text, warehouse_created timestamptz) server mongo_server;
CREATE FOREIGN TABLE
postgres=# select * from warehouse;
 _id | warehouse_id | warehouse_name | warehouse_created 
-----+--------------+----------------+-------------------
(0 rows)

postgres=# INSERT INTO warehouse values (0, 1, 'UPS', '2014-12-12T07:12:10Z');
INSERT 0 1
postgres=# INSERT INTO warehouse values (0, 1, 'UPS', '2014-12-12T07:12:10Z');
INSERT 0 1
postgres=# INSERT INTO warehouse values (0, 1, 'UPS', '2014-12-12T07:12:10Z');
INSERT 0 1
postgres=# INSERT INTO warehouse values (0, 1, 'UPS', '2014-12-12T07:12:10Z');
INSERT 0 1
postgres=# select * from warehouse;
           _id            | warehouse_id | warehouse_name |   warehouse_created    
--------------------------+--------------+----------------+------------------------
 5d2eb4ff460cc6240428b702 |            1 | UPS            | 2014-12-12 02:12:10-05
 5d2eb501460cc6240428b703 |            1 | UPS            | 2014-12-12 02:12:10-05
 5d2eb502460cc6240428b704 |            1 | UPS            | 2014-12-12 02:12:10-05
 5d2eb503460cc6240428b705 |            1 | UPS            | 2014-12-12 02:12:10-05
(4 rows)

postgres=#

手动连接 MongoDB 验证

在上一节中通过 mongo_fdw 创建了 warehouse 表,并插入了几条数据;现在通过 mongo 接入 MongoDB 验证这几条是否存在。

$ /usr/local/mongodb/bin/mongo
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("586adc95-1ab9-439d-bab5-fc38788bd35c") }
MongoDB server version: 4.0.10
Welcome to the MongoDB shell.
(省略一些输出)
> use test
switched to db test
> db.users.find()
> db.warehouse.find()
{ "_id" : ObjectId("5d2eb4ff460cc6240428b702"), "warehouse_id" : 1, "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") }
{ "_id" : ObjectId("5d2eb501460cc6240428b703"), "warehouse_id" : 1, "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") }
{ "_id" : ObjectId("5d2eb502460cc6240428b704"), "warehouse_id" : 1, "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") }
{ "_id" : ObjectId("5d2eb503460cc6240428b705"), "warehouse_id" : 1, "warehouse_name" : "UPS", "warehouse_created" : ISODate("2014-12-12T07:12:10Z") }
>

在 test 数据库的 warehouse 集合中成功查到了刚刚通过 mongo_fdw 插入的数据,证明环境搭建成功。

参考链接

GitHub – EnterpriseDB/mongo_fdw: PostgreSQL foreign data wrapper for MongoDB

Advertisements

分类:PostgreSQL

Tagged as:mongo_fdw

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章