nodejs 多核心伺服器管理模組 cluster

http://learnboost.github.com/cluster/

像上一篇 nodejs 轉載的文章提到一點關於多核心框架的一些概念,最近看到這款 多核心伺服器 模組,搭配作者拍的介紹影片,感覺就很容易使用,而且功能很強大的感覺…

介紹:

什麼是多核心伺服器?由於 nodejs 底層實做的方式是採用 nio (asyn) 來減少在伺服器 IO 時所等待的時間,所以採用 Event based 的架構,所有的 io 處理都透過事件佇列回應 callback function 來運作,也因此採用單執行緒運作且就能達到很好的效能。

但一隻程式只用到一個核心,對於現代多核心的伺服器來講也太浪費了吧~,因此如果你想要在 nodejs 用到多核心的方法,就只有多跑幾個 process 了,但當一堆 process 的伺服器在運作時,該怎麼管理與如何平衡負載就是一個麻煩了。

所以這個 cluster 的作者就是在解決這個問題,而這個 multi-core server 也不光只是能用在 nodejs 擅長的 web server 的情況而已,由於只是執行續的管理為主,所以不管什麼樣的伺服器都能透過他來管理與運行。作者從二月中到現在才獨立開發一個月就已經成長到 5.2 版本,就能顯示出這種模組的實際需求,或許他自己本身在 LearnBoost 的工作也在負責這一塊呢。

特性:

官網上寫了一堆特性,大概提幾個實做上作者考慮到的點,

  • 零停機重啟:當伺服器程式修改過,一般來講都要將伺服器重啟來重讀新程式,而 cluster 可以讓現有在運行的 processes 不停機的狀況下銜接上重啟的新伺服器。
  • 優雅的停機:讓現有使用者不斷線的情況下,漸漸的關閉所有伺服器。
  • 停機:就是直接關機…也可以很不優雅 @Q@
  • 可擴充:提供以 plugin 的方式擴充。
  • ..

模組:

  • api documentation

主要函式的使用方式與 api,以及 plugin 的撰寫方式。

  • cli provides a command-line interface for your cluster

提供一個小工具模組讓你可以簡單的撰寫命令列的銜接介面,例如可以寫 –help –stat –restart,等指令來查看伺服器狀態或與伺服器溝通。

  • debug verbose debugging information

一個可以讓你顯示所有伺服器程序運行狀態資訊的 plugin

  • logger master / worker access and error logs

與上述類似,將 log 訊息的內容可以寫到指定檔案中,還可以分錯誤等級,debug,warning..之類的。

  • pidfiles writes master / worker pid files

讓你可以查詢與指令 每個程序的 pid 存放,可以額外寫管理或監控的 plugin。

  • reload reloads workers when files change

可以指定監控某些檔案,當這些檔案改變的話的重啟所有伺服器。

  • repl perform real-time administration

提供一個 telnet 的介面,功能簡潔有利…幾乎就是把上面他提到的模組都有實做。

  • stats adds real-time statistics to the repl plugin

在 repl 裡面實做 檢視所有伺服器狀態。

影片裡面有提到,如果要重啟伺服器可以至 telnet 至 repl 內下 restart() 就可以重啟了,另外 help() 是查詢支援的指令。

貼上一個 github 的範例,順便提一下,剛在看得時候作者剛好釋出 5.0版…

Example

app.js: 先寫一個普通的 http server..

  var http = require('http');

  module.exports = http.createServer(function(req, res){
    console.log('%s %s', req.method, req.url);
    var body = 'Hello World';
    res.writeHead(200, { 'Content-Length': body.length });
    res.end(body);
  });

server.js:  在寫 cluster 去引入 server 的程式,然後設定好 plugin 以後就可以開始跑了…指令 repl 監聽 8888。

  var cluster = require('cluster')
    , app = require('./app');

  cluster(app)
    .use(cluster.logger('logs'))
    .use(cluster.stats())
    .use(cluster.pidfiles('pids'))
    .use(cluster.cli())
    .use(cluster.repl(8888))
    .listen(3000);

一個 repl 運作的樣子,telent 進去以後下指令,查詢現在的 processes 分別在哪些 pid ,重啟後在查詢一次。

cluster> pids()

   pids
   master: 1835
   worker #0: 1837
   worker #1: 1838
   worker #2: 1843
   worker #3: 1844

 cluster> restart()
 restarting 4 workers
 cluster> pids()

   pids
   master: 1835
   worker #0: 1845
   worker #1: 1849
   worker #2: 1848
   worker #3: 1847

小感:

感覺自從 nodejs 出來以後他各式模組發佈的速度都很多又很快,猜想是因為 js 的開發簡易,且領域很新許多東西都還沒做過,也不同以往開發的流程與模式,很容易兜一兜就有新東西出來,且異於往常,且大部分都是 OpenSource。

由於 nodejs 切入的時機正是  github(git) 在不斷成長的時候,搭上 web 與瀏覽器技術的轉機,呈現出一種不同與以往程式語言社群的一種風格,相當的自由開放活躍,也不是說其他語言沒有,而是因為太容易用 js 寫出一個新東西擺上 github 上分享,實做快速變化又多,像 jQuery 運行了那麼長的時間,花了幾年的時間還能夠不斷進步就可以大致瞭解,js 是一種容易實做出結果但不容易將之改善至極的語言。

註:https://github.com/languages 目前 js 已經是 github 排行版第一名..

相關資源:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *