HBase Kerberos连接更新策略

kyj*_*210 11 hbase kerberos

最近我在我的集​​群中启用了kerberos,一切都运行良好,直到我的kerberos登录到期,比如12小时.此时我创建的任何连接,使用这些连接创建的任何表都会在我使用它们时抛出.这可能会使我的应用程序崩溃,具体取决于我如何处理它.

我不介意崩溃,因为我的应用程序是由滑块管理的,当它下降时会复活应用程序,但这只会在HBase被"使用"时发生(即我在一个现在陈旧的桌子上调用方法连接)可能是由用户交互引起的,这会导致用户体验不佳.

我不希望身份验证实现细节遍及我的应用程序,也不希望更频繁地创建连接对象,因为这是一个代价高昂的操作,会产生大量的RPC调用(zookeeper元数据位置开始).

有没有一个共同的策略(最好是在HBase客户端中内置)来管理kerberos身份验证到期并在发生这种情况时更新HBase连接/表?

Sam*_*ter 25

Kerberos TGT具有寿命(例如12小时)和可更新寿命(例如7天).只要票证仍然有效并且仍然可以续订,您可以请求"免费"续订 - 无需密码 - 并且重置终身计数器(例如,12小时再次启动).

Hadoop身份验证库生成一个特定的Java线程,用于自动续订当前的TGT.它有点难看,使用kinit -R命令行而不是JAAS库调用,但它可以工作 - 请参阅HADOOP-6656

所以,如果你让Slider在启动时创建一张可更新的票,如果你可以贿赂你的SysAdmin来提高默认值(参见客户端配置)和max(比较KDC conf)可续订的生命周期,比如30天,那么您的应用程序可以使用初始TGT直接运行30天.一个很好的改进.

~~~~~~~~~~

如果你真的渴望永恒...对不起,但你实际上会有一些编程要做.这意味着一个专门的线程/流程负责或自动重新创建 TGT.

  • Java Way:在启动时,在连接到HBase/HDFS /之前,显式创建一个UGI,loginUserFromKeytab()然后checkTGTAndReloginFromKeytab()不时运行
  • Shell方式:启动一个shell,它(a)创建一个TGT,kinit(b)产生一个子流程,定期kinit再次触发(c)启动你的Java应用程序,然后当你的应用程序永久终止时杀死子流程

警告:如果某个其他线程碰巧在重新创建TGT时打开或重新打开连接,则该连接可能会失败,因为缓存在访问它的确切时间是空的("竞争条件").下一次尝试将成功,但期望您的日志中出现一些流氓警告.

~~~~~~~~~~

最后的建议:您可以通过设置环境变量,为您的应用程序使用私人票证缓存(即,您可以在同一节点上使用相同的Linux帐户,但使用不同的Kerberos主体运行多个应用程序)KRB5CCNAME,只要它是"FILE:"缓存即可.