天天看點

玩轉Nodejs的叢集

在nodejs中使用叢集還是不容易的。javascript的單線程屬性讓nodejs下的應用很難使用現代機器的多核特性。比如下面的代碼實作了一個http伺服器的主幹部分。這部分代碼隻會執行在一個線程上,不管這段代碼運作的機器是單核的cpu還是1000個核心的cpu。

玩轉Nodejs的叢集
玩轉Nodejs的叢集

使用多核特性

隻需要一點修改,上面的代碼就可以把cpu的所有核心都用起來。上面的示例代碼将使用cluster子產品重構。cluster子產品可以讓你很容易的建立多個分享端口的程序。每一個程序使用一個系統核心,也就是代碼中的numcpus變量中cpu核心的一個。每一個子程序都實作了http server,并監聽指定的端口。

玩轉Nodejs的叢集
玩轉Nodejs的叢集

多機器的均衡

使用cluster子產品,你就可以更高效的使用硬體。然而,你還是被限制在單一的機器上。如果你的應用有客觀的通路量,你最終還是把負載分部在不同的機器上。使用reverse proxy server可以把并發的通路負載到不同的伺服器上。

nodejitsu開發了node-http-proxy子產品,一個開源的nodejs應用代理服務。使用以下指令可以安裝這個子產品:

實際的使用可以參考以下代碼。在這裡例子中負載被分發到兩台伺服器上。首先測試反轉代理,確定http server運作在8080和8081兩個端口上。接下來,運作反轉代理,然後用浏覽器通路這個代理。如果一切正常的話,你會發現請求被兩個伺服器交替處理。

玩轉Nodejs的叢集
玩轉Nodejs的叢集

當然,這個例子隻使用了一台機器。然而,如果你有多台機器的話,你可以在一台機器上運作反向代理伺服器,其他的機器上運作http server。

使用nginx負載均衡

使用nodejs寫的反向代理有一個好處是你使用的技術都是一樣的。但是,在生産環境下,更多使用的是nginx來處理負載均衡。nginx是一個開源的http server和反向代理工具,尤其擅長處理靜态檔案,比如:css和html。是以,nginx常被用于處理站點的靜态檔案,和分發動态請求到nodejs的伺服器上。

要實作nginx的負載均衡,隻需要安裝nginx,之後把nodejs伺服器作為upstream resource添加在配置檔案中。配置檔案的路勁一般是{nginx-root}/conf/nginx.conf,{nginx-root}是nginx安裝的根目錄。整個的配置檔案請參考下面的示例。當然,我們隻需要用到其中的一小部分。

玩轉Nodejs的叢集
玩轉Nodejs的叢集

如前文所述,本教程隻會涉及到整個配置檔案的一部分。第一個需要關注的部分如下所示。

這部分的配置定義了一個upstream伺服器,名稱為node_app。對這個伺服器的請求會配置設定到就兩個ip位址上(這裡隻用端口區分了一下)。

隻是定義了一個upstream伺服器還沒有告訴nginx如何使用它。是以,我們必須使用如下的指令頂一個路由的規則。使用這個路由,任何的到/foo的請求都會被代理到之前配置的nodejs伺服器上。

玩轉Nodejs的叢集
玩轉Nodejs的叢集

最後

本教程旨在介紹如何把單線程的nodejs應用運作在多台機器的多個核心上。你也可以學到如何使用nodejs或者nginx建立一個負載均衡。當然本文不是深入的介紹如何在産品環境下運作的。是以,如果你使用的是nginx,還有很多其他的可以做的,比如緩存,來提高系統性能。你也會需要使用forever,如果崩潰的話這個工具可以重新開機你的nodejs程序。

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/p/4680472.html