java连接zookeeper_java客户端连接Zookeeper服务器慢

当使用Java连接Zookeeper服务器时遇到速度慢的问题,原因可能是ZooKeeper在获取主机名时耗时过长。解决方法是在创建ZooKeeper实例时通过ZKClientConfig配置`ZOOKEEPER_SERVER_PRINCIPAL`属性,避免调用耗时的`getHostName()`方法。通过设置`ZOOKEEPER_SERVER_PRINCIPAL`为`zookeeper/<ip>`的形式,可以直接连接而无需等待主机名解析,有效提高连接速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据百度结果,推测问题可能是,当使用ip创建ZooKeeper对象时,如果host中没有ip到主机名的映射,ZooKeeper创建过程中会调用ZooInetAddress.getHostName()这个方法从网络中获取主机名,这里耗费时间太长所致。通过调试定位到SaslServerPrincipal类的static String getServerPrincipal(WrapperInetSocketAddress addr, ZKClientConfig clientConfig) {

String configuredServerPrincipal = clientConfig.getProperty(ZKClientConfig.ZOOKEEPER_SERVER_PRINCIPAL);

if (configuredServerPrincipal != null) {

// If server principal is already configured then return it

return configuredServerPrincipal;

}

String principalUserName = clientConfig.getProperty(

ZKClientConfig.ZK_SASL_CLIENT_USERNAME,

ZKClientConfig.ZK_SASL_CLIENT_USERNAME_DEFAULT);

String hostName = addr.getHostName();

......

if (canonicalize) {

WrapperInetAddress ia = addr.getAddress();

......

String canonicalHostName = ia.getCanonicalHostName();

//avoid using literal IP address when security check fails

if (!canonicalHostName.equals(ia.getHostAddress())) {

hostName = canonicalHostName;

}

}

String serverPrincipal = principalUserName + "/" + hostName;

return serverPrincipal;

}

解决耗时长问题 一个方式就是改host文件,添加ip到域名的映射,但查看上述函数可以发现,如果configuredServerPrincipal不为null,则不会执行String hostName = addr.getHostName();也就可以绕过耗时长的问题。

所以在创建ZooKeeper时,传入ZKClientConfig对象,并配置一个属性,代码如下String connectString="117.76.191.159";

ZKClientConfig zkClientConfig = new ZKClientConfig();

zkClientConfig.setProperty(ZKClientConfig.ZOOKEEPER_SERVER_PRINCIPAL,"zookeeper/"+connectString);

zooKeeper = new ZooKeeper(connectString, timeout, new Watcher() {

@Override

public void process(WatchedEvent event) {

}

},false,new StaticHostProvider(new ConnectStringParser(connectString).getServerAddresses()),zkClientConfig);

该方法适合单台Zookeeper,多台可能就不行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值