现象
haas中regionserver频繁报警killed、running。分析hbase regionserver日志发现异常:
1 |
|
发现regionserver的IP地址是docker0 而master对应的是bond0的IP地址。
从regionserver到master的TCP会话都停留在SYN_SENT。
1 | [hadoop@hostname logs]$ netstat -an | egrep 6000 |
原因
从错误日志看到,hbase regionserver的本地子网是172.x,但是远程master子网是10.x1
[connection-pending local=/172.42.0.1:41015 remote=hostname/10.95.26.153:60003]
当服务器分配有多层网络接口时,可能会发生这种情况。 默认情况下,region server通过查找标识的主要主机名和性能DNS来确定它应该绑定到哪个接口。 基于网络路由表之后,region server确定它需要进行docker0接口,即使主服务器正在bond0上进行通信。1
2
3
4
5
6
7
8
9
10
11
12[hadoop@hostname logs]$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.90.18.4 0.0.0.0 UG 0 0 0 bond0
10.0.0.0 10.90.18.1 255.0.0.0 UG 0 0 0 bond0
10.90.18.0 0.0.0.0 255.255.254.0 U 0 0 0 bond0
10.232.0.0 10.90.18.4 255.255.224.0 UG 0 0 0 bond0
100.64.0.0 10.90.18.1 255.192.0.0 UG 0 0 0 bond0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 bond0
172.16.0.0 10.90.18.1 255.240.0.0 UG 0 0 0 bond0
172.42.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 10.90.18.1 255.255.0.0 UG 0 0 0 bond0
解决
在hbase-site.xml中设置param hbase.regionserver.dns.interface,以强制区域服务器在启动时使用bond0,以便它可以在正确的网络接口上与hbase master进行通信。
<property>
<name>hbase.regionserver.dns.interface</name>
<value>bond0</value>
</property>
重启regionserver 即可。