Pomelo分布式部署方案

一 配置文件servers.json的配置

20180828170210505.png

以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服务监听的是61506157端口,connector监听的是62006207端口。首先我们会有一个域名绑定到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
image.gif

--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']);
    }
}

你可能感兴趣的:(Pomelo分布式部署方案)