什么是Gateway Worker分離部署
GatewayWorker有三種進程,Gateway進程負責網(wǎng)絡(luò)IO,BusinessWorker進程負責業(yè)務(wù)處理,Register進程負責協(xié)調(diào)Gateway與BusinessWorker之間建立TCP長連接通訊。我們可以把Gateway BusinessWorker Register分開部署在不同的服務(wù)器上,當業(yè)務(wù)進程BusinessWorker出現(xiàn)瓶頸時,單獨增加BusinessWorker服務(wù)器提升系統(tǒng)負載能力。同理,如果Gateway進程出現(xiàn)瓶頸,則增加Gateway服務(wù)器。而Register服務(wù)一個集群只需要部署一臺服務(wù)器,Register服務(wù)只有在進程啟動的時候協(xié)調(diào)Gateway與BusinessWorker建立TCP連接,集群運行起來后通訊量極低,不會成為系統(tǒng)瓶頸。
部署示例
以Applications/Todpole為例,假如需要部署三臺服務(wù)器提供高可用服務(wù)。瓶頸在BusinessWorker進程,則可使用1臺作為gateway服務(wù)器,另外兩臺做BusinessWorker服務(wù)器。(如果瓶頸在gateway進程(一般是帶寬瓶頸),則可以2臺gateway機器,1臺BusinessWorker機器,部署方法類似)。Register服務(wù)可以部署在任意一臺服務(wù)器上。
gateway worker 分離部署擴容步驟
1、由于一個集群只需要一臺服務(wù)器運行Register服務(wù),這里選擇192.168.0.1,端口是1236(端口為start_register.php中監(jiān)聽的端口),其它服務(wù)器中start_register.php中的代碼可以注釋掉。
2、將進程切分,將Gateway進程部署在一臺機器上(假設(shè)內(nèi)網(wǎng)ip為192.168.0.1),這臺服務(wù)器也運行著集群的Register服務(wù),而BusinessWorker部署在另外兩臺機器上(內(nèi)網(wǎng)ip為192.168.0.2/3)。
3、由于192.168.0.1這臺機器只部署Gateway進程和Register進程,所以將該服務(wù)器上初始化BusinessWorker實例的地方注釋或者刪掉,避免運行BusinessWorker進程,例如
這里打開文件Applications/Todpole/start_businessworker.php,注釋掉bussinessWorker初始化
...
// bussinessWorker
//$worker = new BusinessWorker();
//$worker->name = 'TodpoleBusinessWorker';
//$worker->count = 4;
...
4、配置Gateway服務(wù)器(192.168.0.1)上start_gateway.php中的lanIp=192.168.0.1與本機ip一致,配置registerAddress為192.168.0.1:1236,start_gateway.php文件最終類似下面配置
文件Applications/Todpole/start_gateway.php
<?php
use WorkermanWorker;
use GatewayWorkerGateway;
// gateway
$gateway = new Gateway("Websocket://0.0.0.0:8282");
$gateway->name = 'TodpoleGateway';
$gateway->count = 4;
// ==== 注意這里配置的是本機內(nèi)網(wǎng)ip ====
$gateway->lanIp = '192.168.0.1';
// ==== 注意這里配置的是192.168.0.1:1236 ====
$gateway->registerAddress = '192.168.0.1:1236';
$gateway->startPort = 2000;
$gateway->pingInterval = 10;
$gateway->pingData = '{"type":"ping"}';
...
5、由于192.168.0.2/3 兩臺服務(wù)器只部署B(yǎng)usinessWorker進程,所以將這兩臺服務(wù)器上的Gateway進程初始化文件注釋掉或者刪掉。
這里打開Applications/Todpole/start_gateway.php,注釋掉gateway初始化部分
<?php
use WorkermanWorker;
use GatewayWorkerGateway;
// gateway
//$gateway = new Gateway("Websocket://0.0.0.0:8282");
//$gateway->name = 'TodpoleGateway';
//$gateway->count = 4;
//$gateway->lanIp = '192.168.0.1';
//$gateway->registerAddress = '192.168.0.1:1236';
//$gateway->startPort = 2000;
//$gateway->pingInterval = 10;
//$gateway->pingData = '{"type":"ping"}';
6、打開192.168.0.2/3兩臺服務(wù)器的start_businessworker.php,配置registerAddress為 192.168.0.1:1236
7、逐臺啟動
至此,GatewayWorker分布式部署完畢。
一些問題及解答
為什么將Gateway與BusinesWorker分別部署在不同的服務(wù)器上?
首先說明的是不一定非要將Gateway BusinessWorker分開部署,但是推薦分開部署,原因如下:
1、由于Gateway只負責網(wǎng)絡(luò)IO,只要服務(wù)器帶寬夠用,絕大多數(shù)情況下Gateway服務(wù)器不會成為瓶頸,所以在很長時間我們只需要一臺或者少數(shù)幾臺Gateway服務(wù)器即可。由于我們不想BusinessWorker影響到Gateway,所以將Gateway和BusinessWorker分開部署
2、BusinessWorker主要負責業(yè)務(wù)邏輯。當請求量增大時,由于可能BusinessWorker業(yè)務(wù)比較復雜,負載可能會明顯升高,這時我們只要單純增加BusinessWorker服務(wù)器即可,Gateway服務(wù)器則一般不需要變動,也就是不用通知客戶端Gateway的ip列表有所變動
3、當系統(tǒng)BusinessWorker負載較低,需要下線服務(wù)器時,我們只需要下線BusinessWorker服務(wù)器即可,無需變動GateWay服務(wù)器,也就不會導致客戶端鏈接因為服務(wù)器下線而斷開。
當BusinessWorker服務(wù)器集群負載較低時,需要下線一些機器怎么實施?
只需要停止BusinessWorker的服務(wù),運行php start.php stop,然后下線即可。Gateway服務(wù)器會自動感知有BusinessWorker服務(wù)器下線,不會再將請求轉(zhuǎn)發(fā)給下線的機器,整個下線過程中不影響服務(wù)質(zhì)量。
當Gateway服務(wù)器集群負載較低時,需要下線一些機器怎么實施?
首先還是要說明下Gateway服務(wù)器一般情況下不會成為系統(tǒng)瓶頸,所以一般你很長時間內(nèi)Gateway服務(wù)器數(shù)量是一個穩(wěn)定的值,一般一臺即可
下線Gateway服務(wù)器,首先停止服務(wù),運行php start.php stop,此時會導致該服務(wù)器上已有的客戶端鏈接斷開,然后下線服務(wù)器即可。此時BusinessWorker會感知到有Gateway服務(wù)器下線,會自動斷開與Gateway進程的聯(lián)系。