gateway worker 分离部署
什么是 Gateway Worker 分离部署
GatewayWorker 有三种进程,Gateway 进程负责网络 IO,BusinessWorker 进程负责业务处理,Register 进程负责协调 Gateway 与 BusinessWorker 之间建立 TCP 长连接通讯。我们可以把 Gateway BusinessWorker Register 分开部署在不同的服务器上,当业务进程 BusinessWorker 出现瓶颈时,单独增加 BusinessWorker 服务器提升系统负载能力。同理,如果 Gateway 进程出现瓶颈,则增加 Gateway 服务器。Register 服务只有在进程启动的时候协调 Gateway 与 BusinessWorker 建立 TCP 连接,集群运行起来后通讯量极低,不会成为系统瓶颈。
部署示例
以 Applications/Todpole 为例,假如需要部署 4 台服务器 (192.168.0.1/4) 提供高可用服务,192.168.0.1/2 运行 gateway 服务和 register 服务,192.168.0.3/4 运行 BusinessWorker 服务。
gateway worker 分离部署扩容步骤
设置服务器 192.168.0.1/2 上 start_register.php 监听本机内网 ip,例如
new Register('text://192.168.0.1:1236');
(为了服务安全,请不要将 1236 端口暴露给外网)删除服务器 192.168.0.1/2 上的 start_businessworker.php。配置 start_gateway.php 中的
lanIp=192.168.0.x
与本机 ip 一致。配置 registerAddress 为['192.168.0.1:1236','192.168.0.2:1236']
,start_gateway.php 文件最终类似下面配置。
文件 Applications/Todpole/start_gateway.php
<?php
use \Workerman\Worker;
use \GatewayWorker\Gateway;
// 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.2 上为 192.168.0.2
// ==== 注意这里配置 ====
$gateway->registerAddress = ['192.168.0.1:1236', '192.168.0.2:1236'];
$gateway->startPort = 2000;
$gateway->pingInterval = 10;
$gateway->pingData = '{"type":"ping"}';
...
打开 192.168.0.3/4 两台服务器,删除 start_gateway.php 和 start_reigster.php。设置 start_businessworker.php 的 registerAddress 为 ['192.168.0.1:1236', '192.168.0.2:1236']
逐台启动
至此,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 进程的联系。
如何给 Gateway 添加负载均衡
负载均衡方案是通用的,你可以用 nginx 代理、云厂商自带的 TCP 负载均衡、或者在 gateway 域名 DNS 上添加多条 A 记录。