环境说明
本文基于 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
分类:PostgreSQL
2 replies ›