单机遇到资源瓶颈时,要想支持更大的用户量,一般是优化业务和增加服务器配置。然而这么做只能是杯水车薪,成本巨大并且效果非常有限。
GatewayWorker支持分布式部署,你可以利用多台价格低廉的普通服务器,组成一个庞大的服务器集群,成倍的增加系统承载能力,这不管在资金成本上还是人力成本上都是最划算的方案。
单机对外提供服务,则风险很大,服务器任何故障都可能引起整个服务的不可用。
GatewayWorker分布式可以有效的降低这个风险,如果一台服务器故障宕机,还有其它服务器可以继续工作,可以做到对服务无影响或者影响最小化。例如GatewayWorker中一台Gateway服务器宕机,可以利用LVS健康探测等技术立刻踢掉故障ip,集群立刻恢复服务。如果GatewayWorker中任意一台Worker机器宕机,则GateWay会立刻踢掉故障Worker机器,做到对外网服务几乎无影响。
请求量突然增大,系统已经无法支撑,而你却束手无策。
GatewayWorker分布式可以让你从容应对,只需要再启动几台GatewayWorker服务器,便可以让你的系统增加几倍的承载能力,轻松应对突发流量。等请求量降下去时,你可以为降低成本将服务器回收,而不影响任何用户。
GatewayWorker提供的所有接口都是支持分布式调用的,所以业务代码不需要任何更改,直接就可以分布式部署。
GatewayWorker通过Register服务来建立划分集群。同一集群使用相同的Register服务ip和端口,即Gateway 和 businessWorker的注册服务地址($gateway->registerAddress $businessworker->registerAddress)指向同一台Register服务。
1、一个集群只需要一台服务器作为Register服务,用于进程启动时协调Gateway与BusinessWorker之间的建立连接通讯,其它服务器可以删掉start_register.php文件或者注释掉里面的代码。(Register服务本身通讯量极低,一般仅在进程启动时通讯,所以Register服务本身不会成为瓶颈,运行过程中即使Register服务服务器暂时挂掉,也不会对外网服务造成影响,所以Register服务一般不需要做高可用)
2、将Gateway 和 businessWorker的注册服务地址(registerAddress)设置成统一的Register服务地址,也就是步骤1选择的Register服务所在服务器的ip和端口。
3、设置Gateway启动脚本(一般是start_gateway.php)中的lanIp与当前服务器内网ip一致
假如需要部署三台服务器(192.168.1.1-3)提供高可用服务。
1、选择一台服务器运行统一的Register服务(该服务器同时也运行Gateway进程和BusinessWorker进程),这里选择192.168.1.1,Register服务的端口假设为1236(实际端口请打开start_register.php查看),其它服务器上的Register服务代码start_register.php可以删除或者注释掉。
2、配置三台服务器start_gateway.php start_businessworker.php中的registerAddress为'192.168.1.1:1236'。
3、分别配置三台服务器start_gateway.php中的lanIp为当前服务器的内网ip(192.168.1.1-3)。
4、逐台启动,分布式部署完毕。
注意事项及说明:
1、多机部署时以下端口注意不要被服务器防火墙屏蔽
①、Register服务监听的端口要可以被其它内网服务器访问(外网访问可以屏蔽);
②、start_gateway.php中如果$gateway->startPort=2300; $gateway->count=4;,则2300 2301 2302 2303四个端口需要被设置成能被其它服务器访问,也就是起始端口$gateway->startPort到$gateway->startPort + $gateway->count - 1这 $gateway->count个端口要设置成能被其它内网服务器访问。
2、如果多机部署服务器不在一个局域网,部署时ip参数可以使用外网ip,对应端口防火墙应该设置成能被外网服务器访问。
3、三台GatewayWorker机器都运行了Gateway进程和Worker进程,客户端连接上任意一台GatewayWorker的Gateway端口即可。
4、为了方便前端接入和扩容,可以在Gateway前加一层DNS、LVS等负载均衡策略。
5、如果服务器不够用可以使用同样的方法增加服务器
6、如果需要下线服务器,直接stop对应服务器即可。由于Gateway进程维护着客户端连接,当服务器下线时,对应服务器的客户端会掉线一次。
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进程
4、配置Gateway服务器(192.168.0.1)上start_gateway.php中的lanIp=192.168.0.1与本机ip一致,配置registerAddress为192.168.0.1:1236
5、由于192.168.0.2/3 两台服务器只部署BusinessWorker进程,所以将这两台服务器上的Gateway进程初始化文件注释掉或者删掉。
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进程的联系。