一、概述
笔者所在项目近期出现一例GBase 8a集群V8客户端gccli适配欧拉操作系统并连接V8集群进行ETL处理的需求,因集群版本及操作系统相对老旧,在适配较新的欧拉操作系统时出现一些问题,最终通过绕行方案解决,现将需求场景及绕行方案整理如下。
二、需求场景及问题分析
某电信运营商GBase 8a数据中台集群根据客户应用端业务扩容需要,计划部署若干台新客户端主机并安装gccli工具进行数据ETL处理,根据某电信运营商国产化要求,新客户端主机必须安装国产操作系统欧拉(openEuler-22.03-LTS-x86_64)。
集群总体环境如下:
集群版本:GBase8a_MPP_Cluster-NoLicense-8.6.2_build33-R11-redhat7.3-x86_64
集群操作系统:rhel_7.3_x64
新客户机操作系统:openEuler-22.03-LTS-x86_64
现场在部署过程中发现V8版本gccli无法在欧拉系统上正常运行,运行gccli报错”缺少共享库libnsl.so.1,该库文件在操作系统不存在”。
进一步尝试安装V9版本gccli(9.5.2.46.6-centos8-x86_64.tar),但在连接集群运行SQL时出现sftp加载导出报错的问题(加载报错Failed initialization,rmt导出报错Failed to receive FIN data before closing socket)。
现场初步分析并与客户沟通了问题处理建议:
1)申请针对V8版本集群发布适配欧拉系统的客户端gccli安装包。
2)将集群升级至V9版本,升级版本跨度较大,成本及风险相对较大。
与客户沟通后的结论为,该集群目前业务繁杂,运行平稳,且包括该集群在内的其余5套集群也存在类似需求,要尽量减少问题处理风险,快速解决问题,不考虑对集群进行升级。
三、绕行方案
根据现场分析及测试验证,发现可通过给libnsl.so.1做软链接的方式解决gccli连接数据库问题,通过配置sshd兼容协议解决sftp加载导出报错问题,从而快速低成本解决上述问题,总体方法如下:
1、确认在欧拉客户机部署V8版本客户端
gccli-8.6.2_build33-R11-redhat7.3-x86_64.tar
2、在欧拉客户机创建link文件/usr/lib64/libnsl.so.1
ln -s /usr/lib64/libnsl.so.2.0.1 /usr/lib64/libnsl.so.1
3、调整欧拉客户机sshd配置文件/etc/ssh/sshd_config,修改参数KexAlgorithms、MACs
将
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
修改为:
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
将
MACs hmac-sha2-512,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-256-etm@openssh.com
修改为:
MACs hmac-sha2-512,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com
4、重启欧拉客户机sshd
systemctl restart sshd
三、附录-问题记录
1)V8版本gccli无法在欧拉系统上正常运行,报错缺少共享库libnsl.so.1:
[gbase@Euler-001 gccli-8.6.2_build33-R11]$ /gbase/product/gccli-8.6.2_build33-R11/gcluster/server/bin/gccli -uroot -pxxxxxx -h172.16.243.21
/gbase/product/gccli-8.6.2_build33-R11/gcluster/server/bin/gbase: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory
2)V9版本gccli(9.5.2.46.6-centos8-x86_64.tar)加载导出报错:
数据加载验证: 加载报错Failed initialization
gbase> LOAD DATA INFILE 'sftp://user:xxxxxx@172.16.243.130/home/gbase/tmp_1.tbl' INTO TABLE testdb_20211125.tmp_1 DATA_FORMAT 3 FIELDS TERMINATED BY ',' MAX_DATA_PROCESSORS 2;
ERROR 1733 (HY000): (GBA-01EX-700) Gbase general error: I/O operation on sftp://gbase:*@172.16.243.130/home/gbase/tmp_1.tbl failed with error - Failed initialization, File name sftp://gbase:*@172.16.243.130/home/gbase/tmp_1.tbl
rmt导出验证:导出报错Failed to receive FIN data before closing socket,导出文件存在,内容不全
gbase> rmt:select * from gclusterdb.nodedatamap into outfile 'nodedatamap.txt';
ERROR 1708 (HY000): 172.16.243.22:5050Failed to query in gnode:
DETAIL: (GBA-01EX-700) Remote export: Failed to receive FIN data before closing socket[51], (104)Connection reset by peer
SQL: SELECT /172.16.243.21_20_1_2023-11-02_11:40:36/ /+ to('172.16.243.130:16066') / /+ TID('917549') / gclusterdb.nodedatamap
.hashkey
AS hashkey
, gclusterdb.nodedatamap
.nodeid
AS nodeid
, gclusterdb.nodedatamap
.data_distribution_id
AS data_distribution_id
INTO OUTFILE 'nodedatamap.txt' outfilemode by
ERROR:
Invalid data type. Connection: 172.16.243.22:18156.