阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Nginx+Lua代理Hadoop HA

209次阅读
没有评论

共计 10997 个字符,预计需要花费 28 分钟才能阅读完成。

一、Hadoop HAWeb 页面访问

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

 使用 Nginx+Lua 代理 Hadoop HA

 

(1) HDFS HA 的 Web 访问

 

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

 使用 Nginx+Lua 代理 Hadoop HA

 

(2) HDFS HA 的 Web 代理

 

虽然 Nginx 的 upstream 支持配置多个 Web 地址,默认会随机将 Web 请求随机转发到任意一个 Web 地址,只有某个 web 地址被认为不可达后,才会被 Nginx 列入黑名单。而 Hadoop HA 的 Active 和 Standby 节点都是一直服务的,只是同一个时刻,最多只有一个节点的 Web 访问是有效的,这就要求 Nginx 对 upstream 中的 Web 地址更细致地检查,而非粗略地判断是否可达。

二、Nginxupstream 健康检查

对 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:8084;

    server 192.168.0.2:8084;

    check interval=30000 rise=1 fall=3 timeout=5000 type=http;

    check_http_send "HEAD / HTTP/1.0\r\n\r\n";

    check_http_expect_alive http_3xx;

    keepalive 2000;

}

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 模块。

下面关于 Hadoop 的文章您也可能喜欢,不妨看看:

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

三、编译安装扩展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.4.tar.gz

$ cd LuaJIT-2.0.4

$ 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.5

./lua-upstream-nginx-module-0.05

./nginx-1.10.1

./ngx_devel_kit-0.3.0

./openssl-OpenSSL_1_0_1t

./pcre-8.38 

执行命令编译 Nginx:

$ cd nginx-1.10.1

$ ./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.0 --add-module=../lua-nginx-module-0.10.5 --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.”。

 

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-07/133120p2.htm

 

四、Nginx代理Hadoop HA

 

 使用 Nginx+Lua 代理 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:8084;

    server 192.168.0.2:8084;

    keepalive 2000;

}

upstream namenodes {server 192.168.0.1:50070;

    server 192.168.0.2:50070;

    keepalive 2000;

}

 

# 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 = 2000,

           timeout = 5000,

           fall = 3,

           rise = 2,

           valid_statuses = {302},

           concurrency = 1,

       }

       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 = 2000,

           timeout = 5000,

           fall = 3,

           rise = 2,

           valid_statuses = {200},

           concurrency = 1,

       }

       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 扩展功能。

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133120.htm

一、Hadoop HAWeb 页面访问

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

 使用 Nginx+Lua 代理 Hadoop HA

 

(1) HDFS HA 的 Web 访问

 

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

 使用 Nginx+Lua 代理 Hadoop HA

 

(2) HDFS HA 的 Web 代理

 

虽然 Nginx 的 upstream 支持配置多个 Web 地址,默认会随机将 Web 请求随机转发到任意一个 Web 地址,只有某个 web 地址被认为不可达后,才会被 Nginx 列入黑名单。而 Hadoop HA 的 Active 和 Standby 节点都是一直服务的,只是同一个时刻,最多只有一个节点的 Web 访问是有效的,这就要求 Nginx 对 upstream 中的 Web 地址更细致地检查,而非粗略地判断是否可达。

二、Nginxupstream 健康检查

对 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:8084;

    server 192.168.0.2:8084;

    check interval=30000 rise=1 fall=3 timeout=5000 type=http;

    check_http_send "HEAD / HTTP/1.0\r\n\r\n";

    check_http_expect_alive http_3xx;

    keepalive 2000;

}

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 模块。

下面关于 Hadoop 的文章您也可能喜欢,不妨看看:

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

三、编译安装扩展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.4.tar.gz

$ cd LuaJIT-2.0.4

$ 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.5

./lua-upstream-nginx-module-0.05

./nginx-1.10.1

./ngx_devel_kit-0.3.0

./openssl-OpenSSL_1_0_1t

./pcre-8.38 

执行命令编译 Nginx:

$ cd nginx-1.10.1

$ ./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.0 --add-module=../lua-nginx-module-0.10.5 --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.”。

 

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-07/133120p2.htm

 

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计10997字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中