Stay Hungry.Stay Foolish.
nginx反向代理大数据应用(spark, rm, hadoop等)

问题

工作原因需要反向代理大数据的应用程序,但是由于他们的特殊性,一般是内网部署,一般公司都不会对他进行反向代理,而是通过ip+port的形式直接访问。

导致原因

我这里使用Resourcemanager系统举例,在新版本里面,ResourceManager HA通过主动/备用架构实现 - 在任何时间点,其中一个RM是活动的,并且一个或多个RM处于待机模式,等待接管,如果活动发生任何事情。转换到活动的触发器来自管理员(通过CLI)或通过集成的故障转移控制器(当启用自动故障转移时), 由于内部已经实现了这种高可用,导致如果使用nginx去反代,不知道upstream该怎么写了。

解决方式

curl -i 172.18.14.8:8088
HTTP/1.1 307 TEMPORARY_REDIRECT
Cache-Control: no-cache
Expires: Thu, 26 Apr 2018 06:32:06 GMT
Date: Thu, 26 Apr 2018 06:32:06 GMT
Pragma: no-cache
Expires: Thu, 26 Apr 2018 06:32:06 GMT
Date: Thu, 26 Apr 2018 06:32:06 GMT
Pragma: no-cache
Content-Type: text/plain; charset=UTF-8
curl -i 172.18.14.9:8088
HTTP/1.1 302 Found
Cache-Control: no-cache
Expires: Thu, 26 Apr 2018 06:31:59 GMT
Date: Thu, 26 Apr 2018 06:31:59 GMT
Pragma: no-cache
Expires: Thu, 26 Apr 2018 06:31:59 GMT
Date: Thu, 26 Apr 2018 06:31:59 GMT
Pragma: no-cache
Content-Type: text/plain; charset=UTF-8

通过curl两个机器的地址我们会发现返回的http状态码不同,再借助nginx的健康检查,我们可以把请求全部转发到活动的RM节点,相当于废弃了自带的高可用,用nginx实现高可用。

check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD /cluster HTTP/1.0\r\n\r\n";
check_http_expect_alive http_4xx;

因为自带的nginx健康检查模块无法区分302或者307,只能识别3xx, 所以选择蹩脚的访问/cluster这个路径,活动的机器会返回405状态,不活动的机器返回的是307,配置之后,10秒之后只有活动的机器会显示up,请求将都被转发到此机器,实现了反向代理

结语

上面的方式其实比较的挫,如果想要优雅的解决,可以使用nginx lua的健康检测模块

自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
评论

暂无评论~~