GaussDB(DWS)-通信问题
常规排查方式
有现场
首先排查哪一步建连存在问题:
数据流向:客户端–>LVS/ELB–>CN–>DN/CN–>DN–>CN–>LVS/ELB–>客户端
因此无法连接时,首先登录后台以以下命令检查连接状态
cm_ctl query -Cv
若集群不可用,请先修复集群
其后通过后台使用gsql方式依次直连CN、浮动IP,并执行pgxc型语句,确认哪条链路存在问题,或对比报错进行如下排查。
无现场
检查日志CN/DN日志,并通过语句关键词或queryid进行筛选:
#HCS/ESL
gs_ssh -c "zgrep {关键词或queryid} $GAUSSLOG/pg_log/*/*"
#HC
cat /etc/hosts | grep 'host-1' | awk '{print $2}' | xargs -I {} ssh {} "hostname && zgrep -i '{关键词或queryid}' /DWS/$GAUSSLOG/pg_log/*/*"
连接断开
异常断开
Connection reset by peer物理连接被关闭
相关链接:https://zhuanlan.zhihu.com/p/540070326
问题一
【现象】gsql连接VIP,偶发报Connection reset by peer
【定位】
- 检查/var/log/messages文件,找到和keepalived相关的信息,如果一直报如下错误或者有Keepalived刷屏日志:
Keepalived_vrrp[65354]: (VI_1) ip address associated with VRID 51 not present in MASTER advert : xx.xx.xx.xx
Keepalived_vrrp[65354]: (VI_1) ip address associated with VRID 51 not present in MASTER advert : xx.xx.xx.xx
出现上述现象,则表示问题与virtual_router_id有关。 - 检查是否virtual_router_id冲突。使用如下命令检查同一网段内virtual_router_id是否冲突:
tcpdump -i any -nn vrrp | grep 'vrid 51'
- 如果返回有两个或者两个以上不同的ip,说明同一网段还有集群部署LVS,LVS的virtual_router_id已经冲突。
【根因】
问题是由于在同一个网段有两个集群的VIP的virtual_router_id一致造成的。
【规避】
修改LVS的配置文件/etc/keepalived/keepalived.conf中的virtual_router_id,选择一个与之前不一样的值,取值范围0~255。
使用root用户,执行如下命令重启LVS服务。
cd /etc/init.d
./gs_keepalived restart
问题二
【现象】DWS读取hdfs文件报Connection reset by peer
【根因】hdfs客户端与dws之间认证方式不一致
【规避】
参数 | dws与hdfs配置参数一致 |
---|---|
dfs.encrypt.data.transfer | True |
dfs.encrypt.data.transfer.cipher.key.bitlength | 128 |
hadoop.rpc.protection | authentication |
dfs.data.transfer.protection | ==privacy== |
dfs.encrypt.data.transfer.cipher.suites | AES/CTR/NoPadding |
dfs.encrypt.data.transfer.algorithm | 3des |
问题三
【现象】客户端执行一段时间后断开连接,日志报Connection reset by peer
【定位】更换客户端所用机器后成功执行
【根因】客户端机器内存不足导致连接断开
问题四
【现象】备份恢复后无法连接,报错Connection reset by peer
【定位】
-
日志显示socket连接失败
-
因为通信从pgxc_node系统表中获取连接所需IP端口信息,检查pgxc_node
select * from pgxc_node;
- cm_ctl命令查到的pgxc_node的集群拓扑不一致,由于执行过备份恢复,为备份集选择错误,将另一套集群的备份集恢复到本集群导致
问题五
【现象】相关gaussdb进程重启
【定位】
1.检查进程启动时间,或检查cma日志启动时间
gs_ssh -c 'ps -ef | grep gaussdb'
【根因】
根因详见:https://bbs.huaweicloud.com/blogs/408570
问题六
【现象】相关gaussdb进程重启
【定位】
1.使用如下命令检查网卡丢包重传
sh $AUSSHOME/bin/dfx_tool/gsar.sh {网卡名/bond名}
详见:https://bbs.huaweicloud.com/forum/thread-121639-1-1.html
【根因】
网络波动导致
Connection refused端口不存在
ping IP 检查三层是否连通
telnet 对端监听IP 监听端口speed_test connect IP 端口
Address already in use端口被占用/随机端口不足
netstat -anop|grep 本地端口号
netstat -anop|awk '{print $4}'|grep 本地IP|sort|uniq -c|grep ' 1 '|wc –l
Connection timed out连接超时
netstat -l|grep 监听端口号gstack 接收端进程
相关链接:https://bbs.huaweicloud.com/forum/thread-0245115455051343004-1-1.html
Operation now in progress半连接状态
相关链接:https://www.coder.work/article/445864
Broken pipe本端关闭
问题一
【现象】作业报错Postgres-XC:ERROR SET query,查看cn日志报错failed could not send data to server, remote datanode dn_6005_6006: Broken pipe, socket[-1].,并且都是dn_6005_6006和dn_6007_6008
【定位】
日志显示socket句柄为-1表示此句柄已经处于释放状态,因此使用此句柄时直接进行本端的关闭
【根因】
问题是由于在同一个网段有两个集群的VIP的virtual_router_id一致造成的。
【规避】
相关链接:https://blog.csdn.net/Dreamhai/article/details/80878805
Stream closed by remote逻辑连接-线程对端关闭,需根据日志查看对端报错情况
问题一
【现象】报错Failed to read response from Datanodes. Detail: 1049 Stream closed by remote
【定位】
1、日志显示SQL语句报错could not poll socket:Interrupted system call 导致执行失败
2、LibcommPollWait中每隔9秒调用一次CheckClientConnectionStatus->PqCheckConnection检查与客户端连接是否正常
PqCheckConnection中调用poll对客户端连接的socket进行有效性检查,如果poll过程中刚好被信号打断,就会报错could not poll socket: Interrupted system call
3、客户返回结果集1200w,属于较大的结果集,在吐数据时会造成CN线程堵住,变得卡顿,导致poll过程时间拉长,容易被打断,触发概率上升,此次报错触发打断过程
【规避】
client_connection_check_interval设置为0后,可进行临时规避
timeout expired
60秒未收到应答,导致连接断开
相关链接:https://bbs.huaweicloud.com/forum、thread-0292102580229298020-1-1.html
相关链接:https://bbs.huaweicloud.com/forum/thread-0260114771672503022-1-1.html
Bad Address
相关链接:https://bbs.huaweicloud.com/forum/thread-0290107506998588004-1-1.html
Resource temporarily unavailable
相关链接:https://bbs.huaweicloud.com/forum/thread-0292102580229298020-1-1.html
相关链接:https://bbs.huaweicloud.com/forum/thread-181652-1-1.html
超时查杀
wait cmd
重新执行此异常断开语句:等待状态为wait cmd,常见于由一个集群通过CDM往另一个集群抽数
#获取阻塞语句的queryid
select usename,coorname,now()-query_start,query_id,substring(query,1,40) as querynamne,waiting,enqueue from pgxc_stat_activity where query ilike '{语句关键词}';
#通过阻塞语句的queryid查看等待状态
select * from pgxc_thread_wait_status where query_id={queryid};
源端为DWS集群,抽数慢,无法快速给数,可能存在以下原因:
-
未做analyze
-
分区过多
-
脏页较多
-
IO问题-慢盘
- cc或PR
- 硬盘坏道导致
详情可查看:https://bbs.huaweicloud.com/blogs/423497
-
持锁阻塞
session unused timeout
show session_timeout;
show statement_timeout;
是否设置过短导致超时查杀
误杀
相关链接:https://bbs.huaweicloud.com/forum/thread-0232118984662948016-1-1.html
相关链接:https://bbs.huaweicloud.com/forum/thread-0284126262973929021-1-1.html
只读导致cma对所有语句进行查杀
【现象】日志显示Disk write is not allowed as default_transaction_read_only is on.
【根因】
- 倾斜问题详见:https://bbs.huaweicloud.com/forum/thread-127754-1-1.html
- 下盘问题详见:https://bbs.huaweicloud.com/forum/thread-138159-1-1.html
- 升级详见:https://bbs.huaweicloud.com/forum/thread-0243141188127939007-1-1.html
- 扩容会进行重分布,重分布原理为首先创建新cgroup,创建原表临时表,将原表的数据导入到临时表,检查校验无误后删除。因此在重分布过程中,会存在正在重分布的表的双份数据,如果重分布的为大表,可能会导致数据量暴增,导致集群只读,从而引发查杀。
linux设置导致线程数/进程数超限
详见:https://bbs.huaweicloud.com/blogs/423656
集群设置连接数超限
stream算子数超限
stream线程池相关链接:https://bbs.huaweicloud.com/blogs/421686
需要检查如下两个参数设置是否合理:
show comm_max_stream;
show max_stream_pool;
connection连接数超限
pooler连接池相关链接:https://bbs.huaweicloud.com/blogs/421685
GaussDB for DWS 连接数 connection 总结
需要检查如下参数设置与当前连接数:
show max_connections;
#检查当前连接数及相关信息
select count(*) from pgxc_stat_activity;
select client_addr, count(*) from pgxc_stat_activity group by client_addr order by count(*) desc limit 100;
select application_name, count(*) from pgxc_stat_activity group by application_name order by count(*) desc limit 100;
select state,state_change ,count(*) from pgxc_stat_activity group by state order by count(*) desc limit 100;
select coorname, usename, client_addr, sysdate-query_start as dur, state, enqueue,waiting, pid, query_id, substr(query,1,150) from pgxc_stat_activity where and state = '"'"'active'"'"' order by dur desc limit 100;
造成连接数过多原因如下:
- session_timeout设置时间过长,导致会话来不及回收,造成连接数打满
show session_timeout;
- 查连接数保活,前端连接池机制可能存在连接保活,通过一些常用语句刷新连接状态,导致连接长时间无法释放
select state,state_change ,count(*) from pgxc_stat_activity group by state order by count(*) desc limit 100;
- 查pooler连接
select database,user_name,in_use,count(*) from pg_pooler_status group by 1, 2, 3 order by 4 desc limit 50;
残留
连接残留
注意:这也是上述连接数过多的原因之一
【现象】集群告警TCP连接数超阈值
【定位】
1.检查TCP连接数
netstat -tnp | grep gaussdb | awk '''{count[$6]++;} END {for(i in count) {print i " | " count[i]}}' | sort -k3nr
2.连接数都处于close_wait状态
3.查看对端服务器与端口发现为GDS及端口
【根因】
被动关闭的一方收到FIN包后,协议层回复ACK;然后被动关闭的一方进入CLOSE_WAIT状态,主动关闭的一方等待对方关闭,则进入FIN_WAIT_2状态;此时主动关闭的一方等待被动关闭的一方的应用程序,调用close操作;gaussdb因GDS版本不一致原因,未调用close关闭连接,导致连接残留。
【规避】
使用与集群版本一致的GDS服务
线程残留
通用排查方法
#在cn执行以下语句获取queryid
select usename,coorname,now()-query_start,query_id,substring(query,1,40) as querynamne,waiting,enqueue from pgxc_stat_activity where state='active' and usename <> 'omm' order by 3 desc;
#执行语句长的queryid以获取lwtid
select * from pgxc_thread_wait_status where query_id=''
gstack $lwtid
查看堆栈阻塞点
- 线程冲突导致的线程残留
【现象】一个query在所有DN上线程残留:StreamNodeGroup::quitSyncPoint()
【定位】
1,CN报错,下发cancel
2,DN postgres线程响应信号,报第一次ERROR,进入sync quit,持锁并进入pthread_cond_timedwait等待其他stream同步退出
3,DealWithConflictSelect向postgres线程发送PROCSIG_CANCEL_QUERY信号
4,pthread_cond_timedwait超时返回进入下次循环前调用CHECK_FOR_INTERRUPTS
5,DN postgres线程响应信号,报第二次ERROR,进入sync quit,此时拿不到锁死锁了
【规避】升级821解决 - LVS客户端下发的cancel被下发到其他CN,导致无法取消语句
【现象】下发cancel后无法杀掉语句
【定位】
1,确认查杀任务下发的节点
2,尝试直连想查杀语句所在节点,并执行查杀,查杀成功
【根因】
LVS的轮询机制导致cancel下发节点和语句执行节点不一致,客户也没指定节点执行,导致查杀失败
【规避】
直连CN或指定CN执行查杀语句 - 函数处于无法cancel的状态导致线程残留
因为系统效率原因,不是所有函数都会配置接收信号函数,因此在执行到某些函数时下发cancel,会无响应,并非未下发成功。
无法连接
无法连接单节点
固定排查思路:
- ping确定三层前的通信是否畅通
- telnet测试端口连通性
- netstat测试OS网络状态
- message日志查看是否有Linux告警
连接打满
CN上的连接总计:
1,客户端连接,这个要靠连接规划,并发数限制,客户端连接池限制
2,业务产生的CN内部连接,这个靠空闲超时回收
https://bbs.huaweicloud.com/blogs/239471
OS参数
nf_conntrack_count
【现象】message日志显示table full,dropping packet
【根因】连接跟踪表溢出
连接跟踪表nf_conntrack,Linux为每个经过内核网络栈的数据包,生成一个新的连接记录项,当服务器处理的连接过多时,连接跟踪表被打满,服务器会丢弃新建连接的数据包。
【规避】
在/etc/sysctl.conf中加入如下参数并执行sysctl –p使其生效。
net.netfilter.nf_conntrack_max=1503232
net.netfilter.nf_conntrack_buckets=375808
net.netfilter.nf_conntrack_tcp_timeout_time_wait=60
进程线程数限制
详见:https://bbs.huaweicloud.com/blogs/423656
节点/实例hang/D进程占用端口
ps -elf | grep $pid检查进程状态
gstack $pid
D进程详解:https://bbs.huaweicloud.com/blogs/421174
无法连接集群
-
LVS连接问题
【现象】服务器重启后主LVS,备LVS未升主无法使用
【根因】LVS在安装时设置了主备,主机挂掉备机会升主,主机启动后备机降备,主机keepalived进程拉起,但由于未添加开机启动项,导致原主配置丢失,无法正常执行LVS功能,集群无法通过LVS连接
【规避】按照产品文档正确配置开机启动项 -
Kerberos未关闭
【现象】cms/cma/DN日志显示PGKBSRVNAME
【根因】kerberos未关闭
【规避】前端界面
检查方法:在FusionInsight Manager,选择“集群 > 待操作的集群名称 > 配置 > 全部配置 > MPPDBServer > 安全 ”
参数信息中“mppdb_inner_kerberos_enable”参数值是否为“false”
关闭方法:在页面修改为false,点击保存;选择“集群 > 待操作的集群名称 > 更多 > 重启 -
防火墙未关闭
•SUSE下,使用chkconfig | grep SuSEfirewall2命令,查看节点上是否开启了防火墙。如果开启,使用SuSEfirewall2 stop命令将其关闭。
•Redhat6下,使用service iptables status命令,查看节点上是否开启了防火墙。如果开启,使用service iptables stop关闭防火墙。
•Redhat7下,使用systemctl status firewalld.service命令,查看节点上是否开启了防火墙。如果开启,使用systemctl stop firewalld.service关闭防火墙。 -
白名单配置但是CN未重启,导致未生效
-
白名单未打开
-
配置服务端远程连接错误
gs_guc check -Z coordinator -I all -c "listen_addresses"
检查输出的是否有业务面本机IP
没有的话使用此命令添加
gs_guc set -I all -Z coordinator -c "listen_addresses='localhost,{业务面IP},{管理面IP}'"
重启实例生效
语句执行慢
建连慢
查看语句执行计划,发现stream算子耗时较长
排查手段:
netstat -anop|sort -rnk3|head
发现缓冲区阻塞
- 打流能吃满带宽
—排查组网拓扑,确认交互机容量瓶颈 - 无法吃满带宽
—arm架构
详细可见:https://bbs.huaweicloud.com/forum/thread-0270145592469595017-1-1.html
gather执行慢
select database,user_name,in_use,count(*) from pg_pooler_status group by 1, 2, 3 order by 4;
查看CN的连接池是不是都是in_use=t的状态,并且数量忽高(新建连接)忽低(报错销毁连接),这种情况大多为有部分业务频繁报错导致连接被频繁销毁触发频繁建连导致,需整改报错业务解决。
grep -E '^model name|^cpu MHz' /proc/cpuinfo
查看CPU主频是否稳定为主频上限值,如不是则需从节能模式调整为高性能模式,提高CPU效率,并观察GATHER是否恢复。
可以通过打开日志参数,观察日志排查问题
如果日志量不大,可以打开:
logging_module='on(ALL)'; //控制通信报文打印,可以通过报文查看时间慢的地方
set log_min_messages=debug5; //debug日志可以具体查看慢的地方,有一些额外信息
如果日志量较大,可以打开:
set logging_module='on(COMM_IPC)';
set log_min_messages=debug3;
CPU过载
ksoftirq进程CPU占用高
网卡多队列未绑核
集群预装,可通过
gs_check -i CheckSysParams/CheckMultiQueue/CheckNetSpeed//CheckNICModel/CheckPing
检查
未实施arm加固
arm加固:https://support.huawei.com/enterprise/zh/doc/EDOC1100250023
LVS部署冲突
- 点赞
- 收藏
- 关注作者
评论(0)