Pomelo分布式部署方案


一 配置文件servers.json的配置

以connector服務為例我們想要在幾台機器上部署該服務,對應的json文件connector元素下就有幾個子元素。此處我們是在三台機器上部署,因此就有三個子元素,每個子元素包含了每台機器相應信息。

參數解讀:

  1. id:在pomelo框架里面每個服務都有一個唯一的id。
  2. host:服務進程所在的主機ip。
  3. port:每個服務都是一個單獨的進程存在於服務器之上,因此會監聽一個單獨的端口。這里的host和port也是服務之間進行rpc調用時候必須用到的,因為rpc調用走的是內網,所以不需要走外網。因此我們也可以把port理解為內網端口。
  4. clientHost:這是提供給客戶端調用的ip地址。
  5. clientPort:這是提供給客戶端調用的ip地址的端口,客戶端調用是要帶上此端口號,因為一個服務在一台機器上會復制多個進程,不同的進程監聽的端口號不同,因此客戶端訪問的時候必須得帶上端口號才行。
  6. frontend:如果為true說明該進程是前端進程可以提供給內部進程進行rpc調用和客戶端調用,如果為false該進程為后端進程,只能提供給內部進程進行rpc調用,默認為false。
  7. clusterCount:pomelo框架提供了一個很人性化的子進程復制方式,比如:我們這里配置connector服務的clientPort參數為:6200++,clusterCount參數為:8,pomelo框架在啟動時會對此框架進行解析,會在本台機器上依次創建8個子進程作為connector服務,8個進程監聽的端口為:6200—6207。如果clusterCount參數缺省,那就在本台機器創建一個進程,同時把port或者clientPort參數改為:6200。

 

二 服務器負載均衡方案

ULB(UCloud Load Balancer)是負載均衡服務,即在多台雲主機間實現應用程序流量的自動分配。可實現故障自動切換,提高業務可用性,並提高資源利用率。

下面我們說一下客戶端到服務器是如何路由的,每台機器gate服務監聽的是6150~6157端口,connector監聽的是6200~6207端口。首先我們會有一個域名綁定到ULB,客戶端是使用域名來訪問的,用戶的請求首先到達ULB。經過ULB負載均衡之后請求到達六台服務器48個gate進程其中一個。gate進程收到請求后對userid和24進行取余計算后(三台服務器共有24個connector服務),返回其中一個connector服務的clientHost和clientPort給客戶端。客戶端通過這個ip地址和端口號連接到相應的connector服務上,到此客戶端到服務器的長連接連接成功。

gate服務通過對userId進行取余之后,相當於把所有的用戶平均的分配到了24個connector服務上。為什么是24而不是48呢?六台機器分為兩組,方便之因為我們是把后的代碼熱更新。

 

三 Pomelo分布式系統的代碼更新方案

項目上線之后,總會有一些小需求需要立馬更新上線,用戶正在玩着游戲,立馬停機重啟項目,太暴力了,對用戶的傷害很大。好在我們的項目是小游戲玩一局的時間是兩分鍾,本局結束時候進行重連。那我們的更新方案是:六台機器分為兩組,如果有更新需求的情況,通過ULB路由設置把新連接都路由到第一組的gate服務上,等待三分鍾后第二組的用戶已經結束游戲,長連接都斷開了,此時重啟第二組,啟動之后開啟ULB路由到第二組的操作。到此第二組的代碼更新成功,同理第一組重復上述流程。

六組機器分為兩組的另一個好處是:在其中一組出現故障的情況下ULB會把請求都路由到可以使用一台上。

 

四 服務器的啟動

項目部署在六台機器上,都是放到同樣的目錄路徑下。六台機器的代碼一樣,六台機器分為兩組,每組的配置文件一樣,不同的組配置文件不一樣。

以第一組為例,選定一台作為主機,其他的兩台為從機,進入到主機的game-server目錄下運行如下命令:

./node_modules/pomelo/bin/pomelo start --env=production -D

--env=production表示讀取線上配置文件啟動進程,--env=development表示讀取開發環境的配置文件啟動進程。

執行該命令后主機會一次啟動主機和從機上的所有進程,這里因為主機和從機的項目目錄一致(約定優於配置的原則),主機通過ssh找到從機的項目目錄啟動進程,所有的進程由主機上的master進程管理和監控。我們可以通過master獲取到所有進程的狀態和詳細信息。

最后別忘了開啟ssh端口(如果你每台服務器ssh默認端口不是22的話),因為主機是通過ssh來啟動從機的進程的,不開啟ssh端口服務啟動不了。

app.configure('production|development', function () { var env = app.get('env'); if (env == 'production') { app.set('ssh_config_params', ['-p 59622']); } }

 

 

 

 

更多編程知識交流,關注以下公眾號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM