使用Nginx+Lua代理Hadoop HA

来源:http://www.cnblogs.com/fanzhidongyzby/archive/2016/06/27/5621866.html
-Advertisement-
Play Games

一、Hadoop HA的Web頁面訪問 Hadoop開啟HA後,會同時存在兩個Master組件提供服務,其中正在使用的組件稱為Active,另一個作為備份稱為Standby,例如HDFS的NameNode、YARN 的ResourceManager。HDFS的web頁面只有通過Active的Name ...


一、Hadoop HAWeb頁面訪問

 

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地址更細緻地檢查,而非粗略地判斷是否可達。

 

二、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健康檢查的完美方案,真正完美的方案是OpenRestylua-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.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-modulepcre庫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.”。

 

四、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: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擴展功能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:楓雪庭 出處:http://www.cnblogs.com/FengXueTing-px/ 歡迎轉載 Android學習心得之 Linux下命令行Android開發環境的搭建 1. 前言2. Java以及Ant安裝3. Android SDK安裝4. Android工程的基礎命令 一、前言 本 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 上一篇階段一:一個簡單的天氣預報應用的完整實現過程(一)完成了應用的核心功能,接下來就要對它進行優化。今天我先優化它的部分UI和設置一些動畫。 首先,說明一下,這部分都是我現學現做的,弄的時候也挺折騰的,所以我想先 ...
  • 1,安裝oracle 10g資料庫並創建一個要恢復的資料庫相同一的實例(註意:最好是新安裝的資料庫,並且安裝的資料庫儘量和要恢復的資料庫的版本一致,並且實例必須一致); 2,以sysdba身份登錄:對控制文件進行備份; sqlplus /nolog;(此處不能加分號,否則黑屏視窗會一閃而過) con ...
  • K-Means聚類演算法是最為經典的,同時也是使用最為廣泛的一種基於劃分的聚類演算法,它屬於基於距離的無監督聚類演算法。KMeans演算法簡單實用,在機器學習演算法中占有重要的地位。對於KMeans演算法而言,如何確定K值,確實讓人頭疼的事情。 最近這幾天一直忙於構建公司的推薦引擎。對用戶群體的分類,要使用KM ...
  • 事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都 ...
  • 電子書為網友wglzaj精心整理,這批資料下載量好評率都非常高,廣受oracle學習者歡迎。文檔共整理了12個精品專題和120個熱門資料的下載地址,推薦給大家希望大家喜歡。目錄0豆下載地址:http://down.51cto.com/data/428209目錄部分預覽: Oracle資料庫性能優化指 ...
  • 有時需要在網上租用空間或資料庫,Mysql成本低一些,所以想將sql server轉成mysql…… 註意:在安裝Mysql時要選擇文字集為utf8,否則將不能使用中文(當前也可以在創建資料庫時使用utf8,不過我不知道在ef生成資料庫時如何設置,希望高手指點) 一、在項目中引用mysql的EF包 ...
  • 對於設計和創建資料庫完全是個新手?沒關係,Joe Celko, 世界上讀者數量最多的SQL作者之一,會告訴你這些基礎。和往常一樣,即使是最專業的資料庫老手,也會給他們帶來驚喜。Joe是DMBS雜誌是多年來最受 讀者喜愛的作者。他在美國、英國,北歐,南美及非洲傳授SQL知識。他在ANSI / ISO ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...