Oracle RAC Multiple Private Interconnects注意配置rp_filter
一套Oracle Exadata的环境, 2个ib做的cell存储网络,但总有一条存储链路从db server到cell server ping不通,ibstat ibping rds-ping都正常, 当其中一个IB链路出问题同样影响I/O,容易出现voting盘的心跳丢失和I/O slow问题, 无法做到存储链路高可用。后分析发现是出于安全检查只是从内存级修改了rp_filter值为1启用了严格的反向路径校验,禁用rp filter后恢复正常。同时这套RAC的2个private network使用的是相同网段(subnet)的IP, 也不符合RAC的安装对网络的要求。
操作系统日志
xxx kernel [xxx] RDS/IB: connection <192.168.xx.3, 192.168.xx.4> droped due to ‘qp event’
xxx kernel [xxx] RDS/IB: conn <192.168.xx.3, 192.168.xx.4> racing for more than 1s, retry
xxx kernel [xxx] RDS/IB: conn <192.168.xx.3, 192.168.xx.4> racing for more than 1s, retry
xxx kernel [xxx] RDS/IB: conn <192.168.xx.3, 192.168.xx.4> racing for more than 1s, retry
…
xxx kernel [xxx] RDS/IB: re-connect <192.168.xx.3, 192.168.xx.4> stalling for more than 1 min… (drops=31 err=0)
Control file sequential read I/O slow
io不稳定时出现IO slow ,影响数据库性能或可用性
出现RAC节点驱逐
clssnmvdisk check: NO I/O completion for 23333333333 ms for voting file o/192.168.xx.4/DBFS_xxx
clssmvdiskavailabilitychange voting file xxxx
clssnmvgetdiskHandle: unable to open disk xxxxx
clssnmvworkerthread: failed to open xxxx
— or —
CSSD voting file is offline :o/192.168.xx.4/DBFS. deatails at xxx ocssd.log。
— or —
An I/O error occured for voting file 为、192.168.xx.4/DBFSxxx
之前在 Troubleshooting Oracle instance start fail join cluster wait control file enqueue 记录过该故障,当时是插拔了IB网线恢复,实际并未真正解决,IB与硬件当时都有检查。后回想最近的变更与交换机上抓包,定位到了rp_filter。
Multiple Private Interconnects and Oracle Linux
记录从Oracle Linux kernel 2.6.31和UEK 2.6.32修复一个bug 引入了安全增强,如果环境中有ORALCE RAC配置多个Private Interconnects,需要配置Linux内核参数rp_filter参数, 建议把private interconnect网卡的rp_filter参数值为0或是2.
此要求也适用于运行 Linux 内核 2.6.32 及更高版本的所有 Exadata 系统。 如果没有这些 rp_filter 参数设置系统,互连数据包可能会被阻止或丢弃,出现数据包被心跳网连接失败,和no network影响CRS启动。禁用或放松此过滤并不被认为是不安全的,因为private interconnect应该位于专用且隔离的网络上。
rp_filter
rp_filter 本身会过滤反向路由不通的数据包。Reverse Path Filtering 模块会将数据包的源地址和目的地址(srcIP->dstIP)调转过来成为(dstIP->srcIP),然后在路由表中查找这个(dstIP->srcIP) 的路由,如果出口恰好是发送网卡那么 rp_filter 测试通过,否则不通过/丢弃。
rp_filter 参数有三个值:
0:不开启源地址校验
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不通,则直接丢弃该数据包
sysctl -a 内核参数中包含 all 和 etho(具体网卡)的 rp_filter 参数,取其中较大的值生效。
[root@oel7db1 conf]# sysctl -a 2> /dev/null|grep rp_filter net.ipv4.conf.all.arp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.arp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.enp0s3.arp_filter = 0 net.ipv4.conf.enp0s3.rp_filter = 2 net.ipv4.conf.lo.arp_filter = 0 net.ipv4.conf.lo.rp_filter = 0
如上all rp_filter=0 专有网卡是2, 取max(0,2) =2 ,最终影响是2松散校验. 如rp_filter for multiple private interconnects and Linux Kernel 2.6.32+ (Doc ID 1286796.1) 也建议如果使用多个ib网络的private interconnect配置如下两种
(Max value would be “2”, this is OK)
net.ipv4.conf.ib1.rp_filter = 2
net.ipv4.conf.ib0.rp_filter = 2
net.ipv4.conf.all.rp_filter = 0
(Max value would be “0”, this is OK)
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
rp_filter 作用
严格过滤意味着当数据包到达系统时,内核会获取数据包的源 IP 并查找其路由表,以查看数据包到达的接口是否与内核用于发送数据包的接口相同 到那个IP。 如果接口相同,则数据包通过了严格的过滤测试,可以正常处理。 如果接口不相同,则数据包将被丢弃,而不进行任何进一步处理,并且在 RHEL 7+ 中,IPReversePathFilter 计数器会递增。 严格过滤的主要作用是,对于给定的远程IP,系统只会通过特定的接口与其通信。 设置静态路由来控制哪个接口响应给定的远程 IP 或网络。
还可以防止 IP Spoofing:校验数据包的反向路径,如果客户端伪造的源 IP 地址对应的反向路径不在路由表中,或者反向路径不是最佳路径,则直接丢弃数据包,不会向伪造 IP 的客户端回复响应。
检查方法
检查当前生效的rp_filter值
$ sysctl -a 2>/dev/null | grep "\.rp_filter"
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.enp0s31f6.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.virbr0.rp_filter = 0
net.ipv4.conf.virbr0-nic.rp_filter = 0
net.ipv4.conf.virbr1.rp_filter = 0
net.ipv4.conf.virbr1-nic.rp_filter = 0
net.ipv4.conf.wlp58s0.rp_filter = 0
检查IPReversePathFilter记录,For RHEL 7 and above
$ nstat -rsz | grep IPReversePathFilter
TcpExtIPReversePathFilter 52537 0.0
检查IP的路由
$ ip route get <remote IP>
修改方法
1,永久生效
修改sysctl.conf, sysctl -p
2,临时生效
echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter
…
— or —
sysctl -w ‘net.ipv4.conf.all.rp_filter’=2
对不起,这篇文章暂时关闭评论。