HBASE-18226 Disable reverse DNS lookup at HMaster and use the hostname provided by RegionServer (Duo Xu)

This commit is contained in:
tedyu 2017-06-21 08:15:27 -07:00
parent 0f5a250ac2
commit 3ff84a2da9
3 changed files with 91 additions and 3 deletions

View File

@ -988,6 +988,15 @@ possible configurations would overwhelm and obscure the important.
When set to a non-empty value, this represents the (external facing) hostname for the underlying server. When set to a non-empty value, this represents the (external facing) hostname for the underlying server.
See https://issues.apache.org/jira/browse/HBASE-12954 for details.</description> See https://issues.apache.org/jira/browse/HBASE-12954 for details.</description>
</property> </property>
<property>
<name>hbase.regionserver.hostname.disable.master.reversedns</name>
<value>false</value>
<description>This config is for experts: don't set its value unless you really know what you are doing.
When set to true, regionserver will use the current node hostname for the servername and HMaster will
skip reverse DNS lookup and use the hostname sent by regionserver instead. Note that this config and
hbase.regionserver.hostname are mutually exclusive. See https://issues.apache.org/jira/browse/HBASE-18226
for more details.</description>
</property>
<!-- The following properties configure authentication information for <!-- The following properties configure authentication information for
HBase processes when using Kerberos security. There are no default HBase processes when using Kerberos security. There are no default
values, included here for documentation purposes --> values, included here for documentation purposes -->

View File

@ -450,6 +450,11 @@ public class HRegionServer extends HasThread implements
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG) @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)
protected final static String MASTER_HOSTNAME_KEY = "hbase.master.hostname"; protected final static String MASTER_HOSTNAME_KEY = "hbase.master.hostname";
// HBASE-18226: This config and hbase.regionserver.hostname are mutually exclusive.
// Exception will be thrown if both are used.
final static String RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY =
"hbase.regionserver.hostname.disable.master.reversedns";
/** /**
* This servers startcode. * This servers startcode.
*/ */
@ -577,6 +582,16 @@ public class HRegionServer extends HasThread implements
useThisHostnameInstead = conf.get(MASTER_HOSTNAME_KEY); useThisHostnameInstead = conf.get(MASTER_HOSTNAME_KEY);
} else { } else {
useThisHostnameInstead = conf.get(RS_HOSTNAME_KEY); useThisHostnameInstead = conf.get(RS_HOSTNAME_KEY);
if (conf.getBoolean(RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY, false)) {
if (shouldUseThisHostnameInstead()) {
String msg = RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY + " and " + RS_HOSTNAME_KEY +
" are mutually exclusive. Do not set " + RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY +
" to true while " + RS_HOSTNAME_KEY + " is used";
throw new IOException(msg);
} else {
useThisHostnameInstead = rpcServices.isa.getHostName();
}
}
} }
String hostName = shouldUseThisHostnameInstead() ? useThisHostnameInstead : String hostName = shouldUseThisHostnameInstead() ? useThisHostnameInstead :
rpcServices.isa.getHostName(); rpcServices.isa.getHostName();

View File

@ -28,6 +28,8 @@ import java.util.Locale;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.testclassification.RegionServerTests; import org.apache.hadoop.hbase.testclassification.RegionServerTests;
@ -42,13 +44,14 @@ import org.junit.experimental.categories.Category;
@Category({RegionServerTests.class, MediumTests.class}) @Category({RegionServerTests.class, MediumTests.class})
public class TestRegionServerHostname { public class TestRegionServerHostname {
private static final Log LOG = LogFactory.getLog(TestRegionServerHostname.class); private static final Log LOG = LogFactory.getLog(TestRegionServerHostname.class);
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
@Test (timeout=30000) @Test (timeout=30000)
public void testInvalidRegionServerHostnameAbortsServer() throws Exception { public void testInvalidRegionServerHostnameAbortsServer() throws Exception {
final int NUM_MASTERS = 1; final int NUM_MASTERS = 1;
final int NUM_RS = 1; final int NUM_RS = 1;
String invalidHostname = "hostAddr.invalid"; String invalidHostname = "hostAddr.invalid";
Configuration conf = HBaseConfiguration.create();
HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(conf);
TEST_UTIL.getConfiguration().set(HRegionServer.RS_HOSTNAME_KEY, invalidHostname); TEST_UTIL.getConfiguration().set(HRegionServer.RS_HOSTNAME_KEY, invalidHostname);
try { try {
TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS); TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
@ -70,7 +73,8 @@ public class TestRegionServerHostname {
final int NUM_MASTERS = 1; final int NUM_MASTERS = 1;
final int NUM_RS = 1; final int NUM_RS = 1;
Enumeration<NetworkInterface> netInterfaceList = NetworkInterface.getNetworkInterfaces(); Enumeration<NetworkInterface> netInterfaceList = NetworkInterface.getNetworkInterfaces();
Configuration conf = HBaseConfiguration.create();
HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(conf);
while (netInterfaceList.hasMoreElements()) { while (netInterfaceList.hasMoreElements()) {
NetworkInterface ni = netInterfaceList.nextElement(); NetworkInterface ni = netInterfaceList.nextElement();
Enumeration<InetAddress> addrList = ni.getInetAddresses(); Enumeration<InetAddress> addrList = ni.getInetAddresses();
@ -102,4 +106,64 @@ public class TestRegionServerHostname {
} }
} }
} }
@Test(timeout=30000)
public void testConflictRegionServerHostnameConfigurationsAbortServer() throws Exception {
final int NUM_MASTERS = 1;
final int NUM_RS = 1;
Enumeration<NetworkInterface> netInterfaceList = NetworkInterface.getNetworkInterfaces();
Configuration conf = HBaseConfiguration.create();
HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(conf);
while (netInterfaceList.hasMoreElements()) {
NetworkInterface ni = netInterfaceList.nextElement();
Enumeration<InetAddress> addrList = ni.getInetAddresses();
// iterate through host addresses and use each as hostname
while (addrList.hasMoreElements()) {
InetAddress addr = addrList.nextElement();
if (addr.isLoopbackAddress() || addr.isLinkLocalAddress() || addr.isMulticastAddress()) {
continue;
}
String hostName = addr.getHostName();
LOG.info("Found " + hostName + " on " + ni);
TEST_UTIL.getConfiguration().set(HRegionServer.MASTER_HOSTNAME_KEY, hostName);
// "hbase.regionserver.hostname" and "hbase.regionserver.hostname.disable.master.reversedns"
// are mutually exclusive. Exception should be thrown if both are used.
TEST_UTIL.getConfiguration().set(HRegionServer.RS_HOSTNAME_KEY, hostName);
TEST_UTIL.getConfiguration().setBoolean(HRegionServer.RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY, true);
try {
TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
} catch (Exception e) {
Throwable t1 = e.getCause();
Throwable t2 = t1.getCause();
assertTrue(t1.getMessage()+" - "+t2.getMessage(), t2.getMessage().contains(
HRegionServer.RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY + " and " + HRegionServer.RS_HOSTNAME_KEY +
" are mutually exclusive"));
return;
} finally {
TEST_UTIL.shutdownMiniCluster();
}
assertTrue("Failed to validate against conflict hostname configurations", false);
}
}
}
@Test(timeout=30000)
public void testRegionServerHostnameReportedToMaster() throws Exception {
final int NUM_MASTERS = 1;
final int NUM_RS = 1;
Configuration conf = HBaseConfiguration.create();
HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(conf);
TEST_UTIL.getConfiguration().setBoolean(HRegionServer.RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY, true);
TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
try {
ZooKeeperWatcher zkw = TEST_UTIL.getZooKeeperWatcher();
List<String> servers = ZKUtil.listChildrenNoWatch(zkw, zkw.znodePaths.rsZNode);
// there would be NUM_RS+1 children - one for the master
assertTrue(servers.size() == NUM_RS+1);
zkw.close();
} finally {
TEST_UTIL.shutdownMiniCluster();
}
}
} }