本文分别介绍GuassDB跨集群访问远端oracle以及远端MPPDB数据库。因环境有限,这里不列举对接HDFS以及对接Spark功能。
一、对接oracle数据库
1、约束限制
- 仅支持连接Oracle11.2.0.1至Oracle12.2.0.1。
- 要求Oracle-ODBC驱动的版本为12.2.0.1.0。
- unixODBC的版本要求为2.3.6。
- 支持最多配置20组远端Oracle配置。
- 配置所需要的Oracle ODBC请从Oracle官网下载。以配置访问Oracle11.2.0.4为例,需要下载:“oracle-instantclient-basic-linux.x64-12.2.0.1.0.zip”、“oracle-instantclient-sqlplus-linux.x64-12.2.0.1.0.zip”、“oracle-instantclient-odbc-linux.x64-12.2.0.1.0.zip”。并将上述三个zip文件打包压缩为“package.zip”。
2、前提条件
- Oracle数据库和GaussDB 200集群状态正常。
- Oracle数据库物理节点和GaussDB 200集群之间可以互相通信。
3、安装unixODBC
Gaussdb要求的unixODBC版本必须为2.3.6。操作系统自带的版本不能正常使用,需要从官方网站单独下载并编译安装。
[root@hd06 ~]# tar -xzf unixODBC-2.3.6.tar.gz [root@hd06 ~]# cd unixODBC-2.3.6 [root@hd06 unixODBC-2.3.6]# ./configure [root@hd06 unixODBC-2.3.6]# make [root@hd06 unixODBC-2.3.6]# make install
安装完成后,需要指定库文件的环境变量,否则使用过程中会报错。
[root@hd06 ~]# vi /etc/profile export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib [root@hd06 ~]# isql --version unixODBC 2.3.6 [root@hd06 ~]# su - omm Last login: Tue Oct 29 16:35:31 CST 2019 [omm@hd06 ~]$ isql --version unixODBC 2.3.6
保存完成后,必须使环境变量生效。
4、创建package.zip压缩包
从oracle官方网站下载如下三个压缩包,然后压缩为package.zip文件。
[root@hd06 tmp]# zip package.zip instantclient-*.zip adding: instantclient-basic-linux.x64-12.2.0.1.0.zip (stored 0%) adding: instantclient-odbc-linux.x64-12.2.0.1.0-2.zip (stored 0%) adding: instantclient-sqlplus-linux.x64-12.2.0.1.0.zip (stored 0%)
5、在Gassdb管理页面创建对接oracle
登录FusionInsight Manager>选择“集群 > 待操作的集群名称 > 服务 > MPPDB > 对接 > 对接Oracle”,单击“创建”,填写配置组名称,单击“确定”。如下图所示:
参数说明见下表:
输入相关配置参数并上传驱动文件“package.zip”,单击“上传并部署”,等待部署完成。部署完成后,单击“保存”。等待保存配置成功,单击“完成”。然后在集群“概览”页面,选择“更多 > 重启”,执行相应操作重启服务。
注:在服务重启的过程中,系统会把odbc驱动分发到各个节点以完成部署。ODBC的部署目录为:/opt/huawei/Bigdata/mppdb/core/utilslib/fc_conf。6、创建Data Source并连接oracle数据库
从主机上切换到omm用户,并连接到mppdb数据库,执行下面的语句创建:
[root@hd06 ~]# su - omm
Last login: Tue Oct 29 16:43:45 CST 2019
[omm@hd06 ~]$ gsql -d postgres -p 25308
gsql ((GaussDB Kernel V300R002C00 build 8a9c1eb6) compiled at 2019-08-01 18:47:38 commit 6093 last mr 10175 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=#CREATE DATA SOURCE ds_oracle TYPE 'ORACLE' OPTIONS (DSN 'oracle_DSN', USERNAME 'spwuser', PASSWORD 'redhat', ENCODING 'UTF8');
CREATE DATA SOURCE
使用下面的语句验证是否可以连接到远端oracle数据库:
postgres=# SELECT * FROM exec_on_extension('ds_oracle', 'select * from web_customer;') AS (c1 int,c2 text,c3 text,c4 text);
如下图所示:
注:使用“exec_on_extension”之前需要创建Data Source对象。
以下举例将远端的查询结果导入本地表:
[omm@hd06 ~]$ gsql -d postgres -p 25308
gsql ((GaussDB Kernel V300R002C00 build 8a9c1eb6) compiled at 2019-08-01 18:47:38 commit 6093 last mr 10175 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=#\c rhnschema
rhnschema=# CREATE TABLE dd AS SELECT * FROM exec_on_extension('ds_oracle', 'select * from rhnpackagefile;') AS (package_id numeric,capability_id numeric,device numeric,
inode numeric,file_mode numeric,username character varying(32),groupname character varying(32),rdev numeric,file_size numeric,mtime timestamp with time zone,
checksum_id numeric,linkto character varying(256),flags numeric,verifyflags numeric,lang character varying(32),created timestamp with time zone,modified timestamp with time zone);
NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'package_id' as the distribution column by default.
HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
INSERT 0 6304854
rhnschema=# select count(*) from dd;
count
---------
6304854
(1 row)
二、对接远端MPPDB
GaussDB 200支持两种方式访问远端MPPDB数据库集群,包括通过FusionInsight Manager配置方式和创建Foreign Table的方式。
2.1、通过FusionInsight Manager配置方式
- 创建配置文件
登录FusionInsight Manager>选择“集群 > 待操作的集群名称 > 服务 > MPPDB > 对接 > 对接MPPDB”,单击“创建”,填写配置组名称,单击“确定”。如下图所示:
参数说明如下图所示:
单击“保存”。等待保存配置成功,单击“完成”。然后在集群“概览”页面选择“更多 > 重启”,执行相应操作重启服务。 - 配置集群互联
设置远端集群的监听IP
默认情况下,集群系统只监听localhost以及业务IP,可以使用下面的命令查询:
[omm@hd03 ~]$ gs_guc check -Z coordinator -I all -c "listen_addresses"
expected guc information: hd02: listen_addresses=NULL: [/srv/BigData/mppdb/data1/coordinator/postgresql.conf]
gs_guc check: hd02: listen_addresses='localhost,192.168.110.24': [/srv/BigData/mppdb/data1/coordinator/postgresql.conf]
Total GUC values: 1. Failed GUC values: 0.
The value of parameter listen_addresses is same on all instances.
listen_addresses='localhost,192.168.110.24'
如果没有监听业务IP,可以使用下面的方法将其加入监听里:
[omm@hd03 ~]$ gs_guc set -I all -Z coordinator -c "listen_addresses='localhost,192.168.110.24'"
expected instance path: [/srv/BigData/mppdb/data1/coordinator/postgresql.conf]
gs_guc set: listen_addresses='*': [/srv/BigData/mppdb/data1/coordinator/postgresql.conf]
Total instances: 1. Failed instances: 0.
Success to perform gs_guc!
以上只在集群的一个节点有效,其他节点也需要单独操作。另外多个IP之间,用逗号隔开。
在远端集群CN设置认证方式
默认情况下,系统只允许集群各个节点之间互相通信。如果其他网段需要访问就必须设置认证方式,这个在任意一个节点执行即可。
[omm@hd01 ~]$ gs_guc reload -Z coordinator -N all -I all -h "host all all 192.168.120.0/24 sha256"
Begin to perform gs_guc for all coordinators.
Total instances: 3. Failed instances: 0.
Success to perform gs_guc!
设置完成后,重启集群:
[omm@hd01 ~]$ gs_om -t stop && gs_om -t start
- 创建Data Source对象
如下,创建ds_mppdb对象,并使用exec_on_extension函数进行连接。
[omm@hd06 ~]$ gsql -d postgres -p 25308
gsql ((GaussDB Kernel V300R002C00 build 8a9c1eb6) compiled at 2019-08-01 18:47:38 commit 6093 last mr 10175 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=# CREATE DATA SOURCE ds_mppdb type 'MPPDB' OPTIONS (DSN 'mppdb_DSN', USERNAME 'spwuser', PASSWORD 'abcABC12', ENCODING 'UTF8');
CREATE DATA SOURCE
postgres=# SELECT * FROM exec_on_extension('ds_oracle', 'select * from web_customer;') AS (c1 int,c2 text,c3 text,c4 text);
c1 | c2 | c3 | c4
----+------+-----------------------------+-----------------------------
1 | xzxj | 2019-4-11 8:42:35.094133000 | 2019-4-11 8:42:35.094168000
(1 row)
2.2 使用Foreign Table方式
注意事项:
- 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表或列存表、哈希表或者复制表。
- 如果关联的表在另外一个集群是复制表或者存在数据倾斜,性能可能会很差。
- 使用期间,两个集群的状态应为“Normal”。
- 两个集群都需要具备基于Foreign Table的SQL on other GaussDB数据处理功能。
建议配置LVS,如未配置,推荐使用多个CN作为server的地址,禁止将多个集群的CN地址写在一起。 - 请尽可能保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。
- 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。
在配置之前,需要确保两个集群之间可以互相访问。集群互访可以参考上面的步骤操作。
创建Serverpostgres=# CREATE SERVER Gauss1 FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '192.168.110.22:25308,192.168.110.23:25308,192.168.110.24:25308' , dbname 'rhnschema', username 'spwuser', password 'abcABC12');
postgres=# CREATE FOREIGN TABLE f_web_customer ( ID NUMERIC, NAME character varying(128), CREATED timestamp with time zone, MODIFIED timestamp with time zone ) SERVER Gauss1 OPTIONS ( schema_name 'public', table_name 'web_customer', encoding 'UTF-8' ); postgres=# \d f_web_customer;
postgres=# CREATE TABLE local_web_customer ( ID NUMERIC, NAME character varying(128), CREATED timestamp with time zone, MODIFIED timestamp with time zone ); postgres=# INSERT INTO local_web_customer SELECT * FROM f_web_customer; INSERT 0 1 postgres=# select *from local_web_customer;