原作者:赵安琪
- 前言
- 问题现象
- 问题分析及思路
- 问题处理
- 备注:MTU
前言
本文旨在记录一次由于官网文档中参数最佳指导设置MTU参数,导致数据库无法正常安装的故障
问题现象
Panweidb(openGauss内核)标准安装,预安装步骤中,安装程序无法将软件包分发到备1节点及备2节点,具体表现为长时间卡顿,同时备库节点收到的PanWei缓存包大小为0。
问题分析及思路
OpenGauss标准安装相对其他商业数据库相对复杂,无论是安装之前的准备,还是安装的步骤上,都存在大量的陷阱,一不留神可能就会陷进去,其中出现频率最高的就是ssh互信的问题,在本次故障中,第一怀疑点就是ssh互信问题。
基于这个思路,检查本地package,发现文件大小正常
继续检查备节点的package,发现大小为0,而且长时间大小没有增长
至此,基本可以确定问题现象,主节点在预安装过程中,没有正常的将安装包分发到2个备节点上。
OpenGauss基于主备节点的通信,是通过pssh组件完成,该工具是通过python编写的ssh并行版本,用法与功能大致与ssh及相关组件一致,使用的必要条件时主备节点要配置ssh互信。
使用scp命令模拟OG安装脚本数据传输,发现命令发生长时间等待,最终由于超时,退出传输
##测试步骤:
dd if=/dev/zero of=1.blk count=1024 bs=1M
scp 1.blk paas-hostname-1:/tmp/
该现象不分服务器,在主节点 -> 备节点,或备节点 -> 主节点的传输过程中,都会存在无法传输的情况。
截止到此,问题成因逐渐清晰,但接下来的问题处理却进入了瓶颈。
问题处理
在明确故障现象后,第一个想法是ssh互信或者ssh配置出现了问题。
使用ssh hostname -C "hostname;date"命令在三个节点上测试,发现没有任何问题,证明ssh互信本身是不存在问题的。紧接着怀疑是ssh配置问题,在对比正常安装的数据库/etc/ssh/sshd_config文件后,没有发现明显异常,期间尝试在/etc/ssh/sshd_config中添加"Protocol 2"条目,重启sshd服务后,问题依然存在。
之后,使用scp -v 输出详细的scp过程,仍未发现任何报错。
检查/var/log/message,没有报错。
检查系统权限及读写能力,没有报错。
…
直到在不停尝试的过程中发现了一个现象,在传输小文件的时候,scp是可以正常传输文件的,在基于枚举试错后,发现这个文件大小在1KB左右,
那么scp会在1KB文件的时候,会有一个明显的分水岭呢?是不是哪里做了限制?而限制传输文件大小都机会集中在网络层面,在重新检查安装步骤后,发现基于官网最佳参数实践设置了MTU参数,将之前的1450设置为了8192。
服务器网卡带宽
将MTU重新设置为1450后,发现scp可以正常将文件传输到备节点上。
重新预安装数据库,安装正常,安装后,数据库正常使用。
至此,问题解决。
备注:MTU
Maximum Transmission Unit,缩写MTU,中文译名:最大传输单元。
一个网络传输数据单元的最大尺寸,类似于网络层面的os block,通过字节数计算大小,在包含包头和包尾管理字节的情况下,一般为1500,但是服务器端设置应尽量小于1500。
因为在整个网络传输链路中,有一些不可见设备MTU设置,会偏小,特别是在虚拟化场景中,最终导致数据传输失败,比如
服务器A -> 交换机A -> 路由A -> 交换机B -> 服务器B
每个节点都有一个MTU值,正常情况下都是1500,但是如果把服务器A的MTU最大值设置成了1700,然后发送了一个网络数据包(2000),这时候服务器A在output数据包的时候,包会被拆成2个包,一个1700,一个300,然后加上头信息进行传输。
但是在交换机A接受到1700的数据包,发现大于自己设置的最大值:1500,如果IP包DF标志位为1,也就是不允许分包,那么路由器直接就把这个包丢弃了,根本就不会到达路由A,最终也就到不了服务器B了。
所以,在整个传输链路中,只要有一个网络设备的MTU值设置过小,就有可能会发生数据包丢失。
openguass