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