使用Nginx+Lua代理Hadoop HA
一、Hadoop HA的Web页面访问
Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNode、YARN 的ResourceManager。HDFS的web页面只有通过Active的NameNode才能正常访问,同样地,YARN的web页面也只有通过Active的ResouceManager才能正常访问。

(1) HDFS HA的Web访问
正常使用Nginx的proxy_pass代理单一的Web服务地址时非常简单(参考博文最简反向代理配置),而面对Hadoop HA这样的多Web服务地址时就会有点麻烦。

(2) HDFS HA的Web代理
虽然Nginx的upstream支持配置多个Web地址,默认会随机将Web请求随机转发到任意一个Web地址,只有某个web地址被认为不可达后,才会被Nginx列入黑名单。而Hadoop HA的Active和Standby节点都是一直服务的,只是同一个时刻,最多只有一个节点的Web访问是有效的,这就要求Nginx对upstream中的Web地址更细致地检查,而非粗略地判断是否可达。
二、Nginx的upstream健康检查
对upstream的地址有效性检查称为健康检查。通过定期的调用检查逻辑,对upstream配置的Web地址进行标记,不健康的Web地址会被临时列入黑名单内,直到该地址被标记为健康状态时,才会有新的Web请求转发到该地址上。
(1)Nginx本身对upstream的健康检查支持并不强大,做不到对检查逻辑的自由定制。
(2)开源项目nginx_upstream_check_module以Nginx补丁的方式扩展了Nginx的upstream语法,支持自定义HTTP请求的方式检查Web服务的健康状态。但在实际使用过程中,遇到一个很不方便的地方。
upstream resourcemanagers {
server 192.168.0.1:;
server 192.168.0.2:;
check interval= rise= fall= timeout= type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_3xx;
keepalive ;
}
nginx_upstream_check_module使用check命令定义健康检查的基本属性,使用check_http_send自定义HTTP请求,check_http_expect_alive定义期望的健康状态HTTP code。这里使用http_3xx是该模块定义的内置匹配语法,表示以3开头的HTTP code。想必大家已经想到,这种定义方式是无法精确区分301、302、307报文的。当然正常情况下,3xx的报文应该是同类型的报文,不需要如此精确的区分,但是不巧的是Hadoop2.7.2版本的Active ResourceManager和Standby ResourceManager分别返回的是302和307报文!
(3)以上两种方案并不是解决Nginx upstream健康检查的完美方案,真正完美的方案是OpenResty的lua-resty-upstream-healthcheck。OpenResty内置了大量的Lua库,可以自由扩展、定制Nginx的功能。其中healthcheck.lua模块用于upstream的健康检查。
不过我希望在Nginx的基础上只扩展upstream健康检查的功能,而非用OpenResty代替Nginx,因此需要使用Nginx的lua-upstream-nginx-module模块。
三、编译安装扩展Nginx
(1)由于lua-upstream-nginx-module是使用Lua脚本对Nginx进行扩展,因此必须安装Lua解释器。LuaJIT是Lua语言的即时编译器,效率更高。
$ wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz $ tar zxvf LuaJIT-2.0..tar.gz $ cd LuaJIT-2.0. $ make $ make install $ export LUAJIT_LIB=/usr/local/lib $ export LUAJIT_INC=/usr/local/include/luajit-2.0 $ rm /usr/local/lib/libluajit-5.1.so* $ cd ..
导出环境变量LUAJIT_LIB和LUAJIT_INC是为了后续编译lua-nginx-module模块使用。删除libluajit的所有动态链接库是为了保证后续编译时是静态链接,否则默认为动态链接。
(2)准备好Lua环境后,接下来下载Nginx的Lua模块lua-nginx-module、Nginx开发包ngx_devel_kit、Nginx upstreamLua模块lua-upstream-nginx-module、pcre库和openssl库、Nginx源码。解压后的文件列表如下:
./lua-nginx-module-0.10. ./lua-upstream-nginx-module-0.05 ./nginx-1.10. ./ngx_devel_kit-0.3. ./openssl-OpenSSL_1_0_1t ./pcre-8.38
执行命令编译Nginx:
$ cd nginx-1.10. $ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=root --group=root --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-pcre=../pcre-8.38 --with-openssl=../openssl-OpenSSL_1_0_1t --add-module=../ngx_devel_kit-0.3. --add-module=../lua-nginx-module-0.10. --add-module=../lua-upstream-nginx-module-0.05 $ make && make install
(3) 安装完毕后,Nginx的配置文件为/etc/nginx/nginx.conf,可执行文件为/usr/sbin/nginx。执行Nginx启动命令:
$ nginx
访问http://127.0.0.1:8080即可看到Nginx主页。
(4) 添加Lua测试链接,测试Lua模块是否正常工作。
location /lua {
set $test "hello, world.";
content_by_lua '
ngx.header.content_type = "text/plain";
ngx.say(ngx.var.test);
';
}
更新Nginx配置:
$ nginx -s reload
访问http://127.0.0.1:8080/lua即可看到”hello,world.”。
四、Nginx代理Hadoop HA

(3) Nginx代理Hadoop HA
虽然安装了lua-upstream-nginx-module模块,但是仍需要使用OpenResty的healthcheck.lua模块才能完成upstream的健康检查功能。
(1) 下载最新版本的OpenResty代码。执行如下命令:
make && make install ls /usr/local/openresty/lualib/resty/upstream/healthcheck.lua
其中healthcheck.lua脚本就是我们需要的健康检查模块。
(2) 配置nginx.conf:
# upstream
upstream resourcemanagers {
server 192.168.0.1:;
server 192.168.0.2:;
keepalive ;
}
upstream namenodes {
server 192.168.0.1:;
server 192.168.0.2:;
keepalive ;
}
# health check
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
lua_shared_dict healthcheck 1m;
lua_socket_log_errors off;
init_worker_by_lua_block {
local hc = require "resty.upstream.healthcheck"
local ok, err = hc.spawn_checker {
shm = "healthcheck",
upstream = "resourcemanagers ",
type = "http",
http_req = "GET / HTTP/1.0\r\n\r\n",
interval = ,
timeout = ,
fall = ,
rise = ,
valid_statuses = {},
concurrency = ,
}
if not ok then
ngx.log(ngx.ERR, "=======> failed to spawn RM health checker: ", err)
return
end
local ok, err = hc.spawn_checker {
shm = "healthcheck",
upstream = "namenodes ",
type = "http",
http_req = "GET /webhdfs/v1/?op=LISTSTATUS HTTP/1.0\r\n\r\n",
interval = ,
timeout = ,
fall = ,
rise = ,
valid_statuses = {},
concurrency = ,
}
if not ok then
ngx.log(ngx.ERR, "=======> failed to spawn NameNode health checker: ", err)
return
end
}
# proxy
location /yarn/ {
proxy_pass http://resourcemanagers/;
# some sub_filter, rewrite config
}
location /hdfs/ {
proxy_pass http://namenodes/;
# some sub_filter, rewrite config
}
更新Nginx配置:
$ nginx -s reload
访问http://127.0.0.1:8080/hdfs或http://127.0.0.1:8080/yarn即可看到HDFS或YARN的Web页面。
五、总结
综上,使用Lua扩展Nginx的功能十分强大,且十分容易定制,这也是OpenResty的功能如此强大的原因。虽然OpenResty已经提供了lua-resty-upstream-healthcheck模块完成upstream的健康检查功能,不过我们仍在社区版的Nginx上亲自扩展了该功能。希望这篇文章能帮助大家快速的配置Nginx+Lua的环境,并方便地开发自己的Nginx扩展功能。
使用Nginx+Lua代理Hadoop HA的更多相关文章
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- Nginx+Lua(OpenResty)开发高性能Web应用
使用Nginx+Lua(OpenResty)开发高性能Web应用 博客分类: 跟我学Nginx+Lua开发 架构 ngx_luaopenresty 在互联网公司,Nginx可以说是标配组件,但是主要场 ...
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 使用Nginx+Lua(OpenResty)开发高性能Web应用
摘自(http://jinnianshilongnian.iteye.com/blog/2280928) 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等 ...
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)
声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...
- nginx+lua的基本原理概念介绍
一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%.Nginx采用 ...
- 单机闭环 使用Nginx+Lua开发高性能Web应用
[西域骆驼D1532101213]西域骆驼(VANCAMEL)D1532101213 休闲套脚鞋 卡其43[行情 报价 价格 评测]-京东 http://item.jd.com/1856564.htm ...
随机推荐
- Visual Studio 2010的MSDN帮助文档离线使用
如果没有在安装vs过程中安装帮助,也可通过Visual Studio帮助菜单中的Manage Help Settings来对帮助进行设置或安装. 可以选择从磁盘安装内容,如果选择从磁盘安装可能会要求提 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- TemplateMethod(模块方法模式)
/** * 模块模式 * @author TMAC-J * 将一个完整的算法分离,分成不同的模块 * 用于有很多步骤的时候,可能以后这些步骤还会增加,把这些步骤分离 * 将有共性的部分放在抽象类中 * ...
- 如何理解DT将是未来IT的转型之路?
如今的IT面临着内忧外患的挑战. 一方面,企业多多少少都建立了信息化,有些企业或集团甚至会有数几十个分公司,包含直销.代理.零售以及第三方物流等多种业态.越是复杂的业务,信息化建设越困难,比如运用大量 ...
- A*算法应用[转]
转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ...
- 敏捷测试模式之Scrum及其实践
一. 敏捷开发模式简介 敏捷是近年来软件研发领域很火的一个词,采用敏捷开发模式的研发团队是越来越多了,尤其是敏捷模式中的Scrum更是佼佼者大行其道,这表明敏捷模式确有其好处,能给企业带来效率的 ...
- MySQL:Fabric 安装
MySQL Fabric安装 MySQL Fabric是Oracle提供的用于辅助进行ha\sharding的工具,它的基本架构: 从上面看出,借助于Fabric, 可以搭建 HA 集群.Sharin ...