PostgreSQL MongoDB FDW安装部署与使用

最近有业务要求通过PostgreSQL FDW去访问MongoDB。开始我觉得这是个很轻松的任务。但接下来的事真是让人恶心的吐了。MongoDB FDW编译起来真是要人命:混乱的依赖,临时下载和Hotpatch,错误的编译参数,以及最过分的是错误的文档。总算,我在生产环境(Linux RHEL7u2)和开发环境(Mac OS X 10.11.5)都编译成功了。赶紧记录下来,省的下次蛋疼。

环境概述

理论上编译这套东西,GCC版本至少为4.1。
生产环境 (RHEL7.2 + PostgreSQL9.5.3 + GCC 4.8.5)
本地环境 (Mac OS X 10.11.5 + PostgreSQL9.5.3 + clang-703.0.31)

mongo_fdw的依赖

总的来说,能用包管理解决的问题,尽量用包管理解决。
mongo_fdw是我们最终要安装的包
它的直接依赖有三个

总的来说,mongo_fdw是使用mongo提供的C驱动程序完成功能的。所以我们需要安装libbson与libmongoc。其中libmongoc就是MongoDB的C语言驱动库,它依赖于libbson。
所以最后的安装顺序是:
libbson → libmongoc → json-c→ mongo_fdw

间接依赖

默认依赖的GNU Build全家桶,文档是不会告诉你的。
下面列出一些比较简单的,可以通过包管理解决的依赖。
请一定按照以下顺序安装GNU Autotools

m4-1.4.17 → autoconf-2.69 → automake-1.15 → libtool-2.4.6 → pkg-config-0.29.1
总之,用yum也好,apt也好,homebrew也好,都是一行命令能搞定的事。
还有一个依赖是libmongoc的依赖:openssl-devel,不要忘记装。

安装 libbson-1.3.1

 
  1. git clone -b r1.3 https://github.com/mongodb/libbson;
  2. cd libbson;
  3. git checkout 1.3.1;
  4. ./autogen.sh;
  5. make && sudo make install;
  6. make test;

安装 libmongoc-1.3.1

 
  1. git clone -b r1.3 https://github.com/mongodb/mongo-c-driver
  2. cd mongo-c-driver;
  3. git checkout 1.3.1;
  4. ./autogen.sh;
  5. # 下一步很重要,一定要使用刚才安装好的系统中的libbson。
  6. ./configure --with-libbson=system;
  7. make && sudo make install;

这里为什么要使用1.3.1的版本?这也是有讲究的。因为mongo_fdw中默认使用的是1.3.1的mongo-c-driver。但是它在文档里说只要1.0.0+就可以,其实是在放狗屁。mongo-c-driver与libbson版本是一一对应的。1.0.0版本的libbson脑子被驴踢了,使用了超出C99的特性,比如复数类型。要是用了git clone默认的版本就真的傻逼了。

安装json-c

首先,我们来解决json-c的问题

 
  1. git clone https://github.com/json-c/json-c;
  2. cd json-c
  3. git checkout json-c-0.12

./configure完了可不要急着Make,这个版本的json-c编译参数有问题。
打开Makefile,找到CFLAGS,在编译参数后面添加-fPIC 
这样GCC会生成位置无关代码,不这样做的话mongo_fdw链接会报错。

安装 Mongo FDW

真正恶心的地方来咯。

 
  1. git clone https://github.com/EnterpriseDB/mongo_fdw;

好了,如果这时候你想当然的运行./autogen.sh --with-master,它就会去重新下一遍上面几个包了……,而且都是从墙外亚马逊的云主机去下。唯一靠谱的编译方法,就是手动一条条的执行autogen里面的命令。

首先把上面的json-c目录复制到mongo_fdw的根目录内。
然后添加libbson和libmongoc的include路径。

 
  1. export C_INCLUDE_PATH="/usr/local/include/libbson-1.0/:/usr/local/include/libmongoc-1.0:$C_INCLUDE_PATH"

查看autogen.sh,发现里面根据--with-legacy--with-master的不同选项,会有不同的操作。具体来说,当指定--with-master选项时,它会创建一个config.h,里面定义了一个META_DRIVER的宏变量。当有这个宏变量时,mongo_fdw会使用mongoc.h头文件,也就是所谓的“master”,新版的mongo驱动。当没有时,则会使用”mongo.h”头文件,也就是老版的mongo驱动。这里,我们直接vi config.h,添加一行

 
  1. #define META_DRIVER

这时候,基本上才能算万事大吉。
在最终build之前,别忘了执行:ldconfig

 
  1. [sudo] ldconfig

回到mongo_fdw根目录make,不出意外,这个mongo_fdw.so就出来了。

试一试吧?

 
  1. sudo make install;
  2. psql
  3. admin=# CREATE EXTENSION mongo_fdw;

如果提示找不到libmongoc.so和libbson.so,直接把它们丢进pgsql的lib目录即可。

 
  1. sudo cp /usr/local/lib/libbson* /usr/local/pgsql/lib/
  2. sudo cp /usr/local/lib/libmongoc* /usr/local/pgsql/lib/
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/63187

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。