首页 / 新闻

02.

24

2017

揭秘Inceptor Server HA

技术博客

高可用性对于对于系统集群而言至关重要,是否具备高可用性决定了一个系统是否具有令人满意的使用质量和价值。为了保证Inceptor Server为业务提供可持续性服务,避免单点故障,提高运作的可靠性。星环改变了以往的单点Inceptor Server的形式,从TDH 4.7开始提供Inceptor Server HA支持。

对于一个具有高可用性的Inceptor服务,用户可以配置两个或两个以上的Server节点,分别为Active Server(活动节点)及Standby Server(备用节点), 活动节点提供服务,备用节点闲置,二者间的心跳线由Zookeeper维护,以了解对方的存活状态。如果活动节点的心跳超时,备用节点会立即接续活动节点来执行业务,实现业务的不中断运行。

本文将对Inceptor Server HA展开全面介绍。在这篇文章中,你可以了解到Inceptor Server HA的实现原理和配置过程,Inceptor Server在切换过程中的命令执行情况,以及Inceptor HA管理工具HA Tools的使用方式。

Inceptor Server HA的实现原理和注意事项

Inceptor Server HA通过在不同节点启动多个Inceptor Server实现。Inceptor在运行时最多只有一个Master Inceptor Server,该节点可以享有资源,启动Executor提供服务。其余节点作为Standby Server,并不会在Yarn上去申请Executor的资源,这样可以避免Yarn所管理资源的被浪费,并保证总是有一个Active Inceptor Server对外提供服务。

注意事项和使用限制:

  1. Inceptor Server HA目前仅支持用Yarn作为资源管理框架的情况。

  2. Inceptor Server HA可以同多活Inceptor Server方式共存。多活Inceptor Server是指在一个集群中,允许有多个Inceptor Server提供服务。和多活Inceptor Server不同之处在于,Inceptor Server HA方案中,仅有Master Inceptor Server享有资源并提供服务。

  3. 一台机器可以启动多个Inceptor服务,但是这些Inceptor服务的Server不可以属于同一个Inceptor Server HA Group。

  4. 每启动一个Standby Inceptor Server需要额外启动一个Application Master。Application Master用以管理在 YARN 内运行的应用程序的实例,与Resource Manager保持通信,为执行任务申请资源,并得到资源后与Node Manager通信,启动相应任务。

  5. Inceptor Server HA仅支持HiveServer2。

​Inceptor Server HA的配置过程

Inceptor Server HA的配置主要分为两步:多Inceptor Server的设置和Inceptor Server HA的启用。

  • 配置多Inceptor Server

由实现原理可知,Inceptor服务需要有两个及以上的Inceptor Server角色,才可以配置Inceptor Server HA。因此首先要保证存在多个Inceptor Server角色,设置方式分为 在创建服务时设置多Server 和 创建服务后增加Server 两种情况。

(1)创建Inceptor服务时配置多Server

配置过程如下:

在创建新的Inceptor服务时,选择2个或以上的Inceptor Server,如下图所示:

然后按照步骤顺序完成Inceptor服务的创建(具体过程可在Transpedia上阅览《Transwarp运维手册》)。

进入Inceptor 服务的角色页面可以看到成功添加的两个Inceptor Server角色,如下图所示:

(2)为现有Inceptor服务配置多Server

针对现有的Inceptor服务,首先要查看其是否配置了多个Inceptor Server角色。

如果该Inceptor服务仅有一个节点承担Inceptor Server角色,就必须为其新增Server。

如果该Inceptor服务已经有2个或2个以上节点承担Inceptor Server角色,可略过该过程,或根据实际需要决定是否需新增Inceptor Server角色。

配置过程如下:

如下图所示,该Inceptor服务仅有一个Inceptor Server角色,不满足配置Inceptor Server HA的条件。下面为对Inceptor服务新增一个Inceptor Server角色的方法。

首先在InceptorSQL1的角色页面点击右上方的

在弹出的窗口中选择Inceptor Server,并选择安装的节点,已经安装Inceptor Server角色的节点不可以选择

添加完成后,新增的Inceptor Server角色会出现在Inceptor角色页面中。

  • 开启Inceptor Server HA功能

为了开启Inceptor Server HA用户必须在Manager配置页面上对如下参数进行正确的设置,对于HA特有的参数需要用户手动通过“增加自定义参数”添加:

完成配置后,重启同组内的所有InceptorServer就可以了,启动完成后访问相对应的服务器的4040页面可以看到当前InceptorServer HA的状态。这里以两台InceptorServer为例。

由HA Status可知此时的leviathan1处于Master状态,leviathan2是Standby处于空置状态。切换到Executors标签页,可以发现只有leviathan1申请到了Executor。

连接Inceptor

完整的Inceptor Server HA功能需要配合4.6.3及以上版本的JDBC驱动才能使用,连接串使用多个服务器的地址拼接。在完成上述多Inceptor Server角色的设置后,必须使用如下所示的拼接连接串登录至Inceptor Server。假设我们设置了两个Server,其所在节点的hostname分别为leviathan1和leviathan2,那么连接字符串如下。

$ beeline -u jdbc:hive2://leviathan1:10000,leviathan2:10000/default

强调的一点

支持HA的Inceptor也允许单独连接到单独的IP地址,但是连接到单个地址并不能触发自动failover功能。

例如下面这个示例:

有两个Inceptor Server,分别位于leviathan1和leviathan2节点。目前leviathan2不能提供Inceptor服务。

执行语句

beeline -u jdbc:hive2://leviathan1:10000/default

可连接到位于leviathan1的Server,并成功执行SQL语句:show tables。

然后执行 

beeline -u jdbc:hive2://leviathan2:10000/default

尝试连接到leviathan2服务器,出现报错,说明并不能切换至levianthan1。

Inceptor Server切换过程中的命令执行情况

  • Query

当执行任务过程中Inceptor Server发生切换时,当前正在执行的Query会失败报错退出,用户可以使用原来的Statement继续执行语句,并且客户端会重放之前的session设置来保证当前session的Current Database以及HiveConf的值与之前的session的最后状态一致。

这里完整的记录了一次切换过程,automerge默认值是false,在切换前设置为true, 但是切换之后当前session的database和automerge值依然保持没有变化, automerge的值仍为true,与切换前session的最后状态保持一致。

当然如果发生切换,那么当前所执行的Query会失败。

  • Transaction

在进行事务操作时,如果遇到Inceptor Server切换的情况,Standby Inceptor Server在启动时,会确保当前所有未提交的事务都rollback后,才会转变成Master Inceptor Server。如果rollback失败,Standby Inceptor Server会直接退出。

发生切换时,当前开始的Transaction会失败,并且切换成功后,切换前没有提交的事务会回到开始时的状态,因而需要重新执行Transaction命令。

  • beeline

使用beeline的场景需要看beeline的处理逻辑,原则上beeline和JDBC无关,但因为主体逻辑是在JDBC过程中,对于beeline –f执行的脚本,当切换时JDBC报错,beeline –f会直接退出。 

示例如下:

HA Tools

Inceptor Server HA提供了一个用于监控/管理/调试/测试HA的状态的简单工具,目前支持获取当前HA状态和Master节点状态,也可以用来手工设置新的Master。

完整命令行如下:

java -cp /usr/lib/ngmr-shell/target/scala-2.10/ngmr-shell_2.10-1.1.0-transwarp-[TDH版本].jar -Djava.ext.dirs="/usr/lib/ngmr/lib_managed/jars:/usr/lib/zookeeper" io.transwarp.inceptor.ha.HATools [参数]

图示结果如下(注意在集群上运行请自行看好Jar包路径)

  • 查看当前HA状况(此图中leviathan1已经失联)

如下图所示:可以看出当前leviathan2 是Master Inceptor Server,每运行一次HA Tools,都可以发现leviathan2的刷新时间在不断更新。

  • 强制切换Master节点

建议在特殊情况使用,比如测试,调试,非生产功能。

需要注意的是,在切换到其他Master节点后,当前原本活跃的Master节点会因为“栅栏”的效果直接退出。

如下图所示:将Master由leviathan2强制切换至leviathan1后,leviathan2不再更新刷新时间,而leviathan1开始刷新。

总结

Inceptor Server HA对于提高服务稳定性有着十分重要的意义。我们努力增强Inceptor Server HA本身的可用和可靠性,使它既能保证顺利的节点切换,又能确保各状态在切换前后的一致性,让节点切换的影响对于使用者而言尽量透明。另外,Inceptor Server HA对于切换发生时业务所处的不同状态有不同的应对方式,为的是尽可能的保证执行结果正确,例如对于发生在事务执行过程中的切换,我们会进行rollback并要求重新执行事务,以维护事务的一致性。

Inceptor Server HA的支持提高了Inceptor的综合质量,降低了Inceptor服务失联风险所带来的影响。帮助TDH向着更加优秀的产品又迈进了一大步。

对此篇文章如有任何问题,欢迎以邮件形式联系我们:bigdataopenlab@transwarp.io