HBase-Kerberos连接更新策略

HBase-Kerberos连接更新策略,hbase,kerberos,Hbase,Kerberos,最近我在集群中启用了kerberos,在我的kerberos登录到期之前(比如12小时),一切都很好。此时,我创建的任何连接、使用这些连接创建的任何表等都将在使用它们时抛出。这可能会使我的应用程序崩溃,具体取决于我如何处理它 我不介意崩溃,因为我的应用程序是由slider管理的,如果应用程序宕机,slider会在应用程序宕机时重新启动应用程序,但是只有当HBase被“使用”(即,我调用了一个连接已过时的表上的方法)时才会发生这种情况,这可能是由用户交互引起的,这将导致用户体验不佳 我不希望身份验

最近我在集群中启用了kerberos,在我的kerberos登录到期之前(比如12小时),一切都很好。此时,我创建的任何连接、使用这些连接创建的任何表等都将在使用它们时抛出。这可能会使我的应用程序崩溃,具体取决于我如何处理它

我不介意崩溃,因为我的应用程序是由slider管理的,如果应用程序宕机,slider会在应用程序宕机时重新启动应用程序,但是只有当HBase被“使用”(即,我调用了一个连接已过时的表上的方法)时才会发生这种情况,这可能是由用户交互引起的,这将导致用户体验不佳

我不希望身份验证实现细节充斥我的应用程序,也不希望创建连接对象的频率超过必要的频率,因为这是一项代价高昂的操作,需要进行大量RPC调用(首先是zookeeper元数据位置)

是否有一种通用策略(最好内置在HBase客户端中)用于管理kerberos身份验证到期并在发生这种情况时续订HBase连接/表?

kerberos TGT有一个生存期(例如12小时)和一个可更新的生存期(例如7天)。只要票证仍然有效且可以续签,您就可以请求“免费”续签(无需密码),并且生命周期计数器将重置(例如,再过12小时)

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

因此,如果你让Slider在启动时创建一个可更新的票证,并且如果你可以贿赂你的系统管理员将默认的(参见client conf)和最大的(参见KDC conf)可更新生存期提高到,比如说,30天,那么你的应用程序可以使用初始TGT连续运行30天。很好的进步

~~~~~~~~~~

如果你真的渴望永恒。。。很抱歉,您实际上需要做一些编程。这意味着一个专用线程/进程负责或自动重新创建TGT

  • Java方式:启动时,在连接到HBase/HDFS/任何东西之前, 使用
    loginUserFromKeytab()
    显式创建一个
    不时检查tgtandrelogininfromkeytab()
  • Shell方式:启动一个Shell,该Shell(a)使用
    kinit
    (b)创建一个TGT 生成一个子进程,该子进程定期再次触发
    kinit
    (c) 启动Java应用程序,然后在应用程序终止时终止子进程
警告:如果在重新创建TGT时,其他线程碰巧打开或重新打开了一个连接,那么该连接可能会失败,因为缓存在被访问时是空的(“竞争条件”)。下一次尝试将成功,但日志中可能会出现一些恶意警告

~~~~~~~~~~


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

因为这是一个较老的问题,最好了解HBase的版本,Hadoop等

现在,Kerberos票证更新应该只在HBase中工作

请参阅配置步骤-

请参阅配置为使用TGT续订的HBase客户端示例-

(顺便说一句,
renewTGT
=
true
是默认值,这实际上是Hadoop Commons代码库的一部分,请参见此处。)-


)

如果这是自动化的,我强烈建议使用键盘,而不是用户名/密码。是的,我正在使用键盘。键表刷新,但任何Hbase连接(以及使用其中一个的任何连接)都将在键表过期后抛出。我正在寻找一种策略来处理这个问题,而不依赖于周期性的故障,也不需要重新发明轮子。帐户密码可能在几个月后生效。Oracle的Kerberos模块有一个
renewTGT
标志。你试过了吗?此外,您可以显示异常堆栈吗?要了解这一点,滑块会推出键选项卡,HBase应该会更新它们。如果这对您不起作用-在issues.apache.org上提交JIRA。@SteveLoughran最终没有使用slider,这实际上更像是一个通用的HBase Kerberos问题。滑块未发现任何问题。这是一个很好的答案。您介意快速查看一下我的java问题吗?这个问题是相关的,但这里没有完全回答@AW,对于长寿命的群集,滑块需要一个键表;它会把它推到集装箱里。这里可能出现的是Hadoop 2.6-recent-Java7不兼容,票证更新失败——即使调用checkTGTandRelogin。如果您使用的是Java7 of 1.7u45或更高版本,则需要Hadoop2.6.2或更高版本