Pomelo 的分布式部署(以LordOfPomelo为例)

Pomelo 的分布式部署(以LordOfPomelo为例)

分布式部署的方法和步骤

1. 系统及应用软件环境搭建和配置

所有参与分布式部署的机器:

  • 必须为同类操作系统(建议为完全相同的操作系统, 本文所示例的4台机器的操作系统均为"Debian GNU/Linux 7.0").
  • 必须都有一个同名的用户(如:"pomelo"等, 本文所示例的4台机器均有一个名为"pomelo"的用户).
  • Node.js的安装版本必须完全相同, 安装的绝对路径也必须完全相同(本文所示例的安装绝对路径为"/home/pomelo/node-v0.10.21-linux-x64").
  • "lordofpomelo"所放置的绝对路径也必须完全相同(本文所示例的绝对路径为"/home/pomelo/lordofpomelo").
  • 在所有参与分布式部署的机器上配置ssh登录选项. 方法为: 在"~/.ssh"目录下创建一个名为"config"的文件(本文所示例的目录为"/home/pomelo/.ssh"), 文件内容如下:
Host *
HashKnownHosts no
CheckHostIP no
StrictHostKeyChecking no

上述文件的目的是使得各个机器之间可以进行顺畅的ssh登录. 各选项的含义请参考ssh_config.

2. 全局安装Pomelo, 安装lordofpomelo依赖包

$ npm install pomelo -g
$ cd lordofpomelo
$ sh npm-install.sh

详细的步骤请参考安装pomeloLordOfPomelo-安装指南.

3. 修改lordofpomelo中相关配置文件

  • 修改"lordofpomelo/shared/config/mysql.json": 将其中的host的地址修改为MySql所在机器的IP地址, 注意: 不要填写"127.0.0.1"或者"localhost". 具体的配置如下所示, 大家可以根据实际情况修改对应配置项:
{
    "development": {
      "host" : "pomelo3.server.163.org",
      "port" : "3306",
      "database" : "Pomelo",
      "user" : "xy",
      "password" : "dev"
    },
    "production": {
      ...
    }
}
  • 修改"lordofpomelo/game-server/config/master.json": 将其中的host的地址修改为master所在机器的IP地址(即, 将要在哪台机器上使用pomelo start来启动game-server服务器集群), 注意: 不要填写"127.0.0.1"或者"localhost". 具体的配置如下所示, 大家可以根据实际情况修改对应配置项:

    {
    "development":{
        "id": "master-server-1", "host": "pomelo16.server.163.org", "port": 3005
    },
    "production":
    {
        ...
    }      
    }
  • 修改"lordofpomelo/game-server/config/servers.json": 将其中的host的地址修改为相应服务进程所在机器的IP地址(即, 将要在哪台机器上运行该服务进程), 注意: 不要填写"127.0.0.1"或者"localhost". 具体的配置如下所示, 大家可以根据实际情况修改对应配置项:

    {
    "development": {
        ...
        "area": [
            {"id": "area-server-1", "host": "pomelo16.server.163.org", "port": 3250, "area": 1},
            {"id": "area-server-2", "host": "pomelo18.server.163.org", "port": 3251, "area": 2},
            {"id": "area-server-3", "host": "pomelo19.server.163.org", "port": 3252, "area": 3},
            ...
        ],
        ...
        "gate": [
            {"id": "gate-server-1", "host": "pomelo16.server.163.org", "clientPort": 3014, "frontend": true}
        ],
        ...
    },
    "production": {
        ...
    }
    }
  • 修改"lordofpomelo/web-server/public/js/config/config.js": 将其中的GATE_HOSTGATE_PORT修改为game-server的gate服务进程所在机器的IP地址和端口, 注意: 如果web-servergame-server的gate服务进程在同一台机器上则可将GATE_HOST配置为window.location.hostname, 否则配置相应的IP; 该配置应与"lordofpomelo/game-server/config/servers.json"中gate的配置相对应. 具体的配置如下所示, 大家可以根据实际情况修改对应配置项:

    ...
    IMAGE_URL: 'http://pomelo.netease.com/art/',
    GATE_HOST: 'pomelo16.server.163.org',
    GATE_PORT: 3014
    ...

上述步骤都完成后就可以在master所在机器(本文所示例的是"pomelo16.server.163.org")的lordofpomelo/game-server目录下使用pomelo start命令启动game-server服务器集群; 在lordofpomelo/game-server目录下使用pomelo stop命令停止game-server服务器集群了. 在另外一台机器(本文所示例的是"pomelo17.server.163.org"; 当然也可以和上面的master在同一台机器上)的lordofpomelo/web-server目录下使用命令node app.js来启动web-server; 由于web-server是无状态的web服务器, 则可以通过kill/Ctrl+c来停止.

4. 说明

  • 在分布式部署中, 启动/停止各应用服务器的代码可以参考lordofpomelo/game-server/node_modules/pomelo/lib/master/starter.js中的sshrun函数相关部分.
标签:无
palmtoy 在 2013-11-7 11:44发布
palmtoy 在 2013-11-7 16:36重新编辑 分享到 weibo
8 回复
#1 py8765 2013-11-7 11:48 回复

赞~

#2 DoDeo 2013-11-7 15:41 回复

这个太赞了,正是现在所需的啊

#3 halfblood 2013-11-7 17:25 回复

赞……

#4 {3} qsonXu 2013-11-8 15:12 回复

@palmtoy @py8765
有几个问题,请教一下:

就是
在app.js需要是否先安装 pomelo-masterha-plugin 再把 然后主从mster,是不是需要app.enable('masterHA'); 打开的masterHA,再配置app.set('masterHAConfig',{}).

另外ssh是不是需要创建私钥?公钥?
还有,文中提到,配置ssh登录选项,是不是我只要ssh能访问的ip都可以被认为这个选项已经配置完成了?

py8765 2013-11-9 23:34 回复

在0.6版本以上的pomelo要使用masterha都需要安装masterha插件,具体插件的配置可以参考pomelo-masterha

ssh这个问题可以google一下。

palmtoy 2013-11-19 10:46 回复

关于pomelo-masterha-plugin的问题, 请参考Pomelo的master服务器高可用.

主贴中提到的使得各个机器之间可以进行顺畅的ssh登录, 是让各个参与分布式部署的机器之间都可以进行ssh登录, 建议按照主贴的步骤走一下试试看.

qsonXu 2013-12-5 14:38 回复

十分感谢

#5 yangwenle1988 2013-11-9 15:03 回复

这个真是太有用了

#6 kmend 2013-12-4 15:12 回复

测试发布成功、
遇到个端口冲突的问题、
mster 服务器上按ctrl + c结束进程、再次启动pomeo 会报出端口占用错误、请问这个怎么解决?

#7 {1} xiecc 2013-12-4 21:59 回复

Production环境不能用Ctrl + c , 要用pomelo kill

kmend 2013-12-5 16:43 回复

还是不行、 kill stop 都试过了、 server上pomelo 已关闭但是端口还是占用着需重启、

另这里的分布式为什么不用、pomelo-daemon 呢?

#8 {3} palmtoy 2013-12-5 15:01 回复

在pomelo的>=0.7.4版本中: 在非development环境下使用ctrl+c不能关闭除master之外的进程, 因为我们做了父子进程之间的detached设置. 但是在game-server目录下使用pomelo stop能够关闭所有pomelo相关进程. 在development环境下仍然可以使用ctrl+c关闭所有相关进程.

kmend 2013-12-5 17:04 回复

我们现在用的是7.1 回头升级看看、 刚看了 pomelo-daemon 也能做分布式发布、这个对比ssh 无密码登录的方式那个效率更高?

xiecc 2013-12-5 17:44 回复

@kmend 不同启动方式吧,pomelo-daemon需要事先在每台机器上安装

palmtoy 2013-12-6 10:51 回复

在每台机器上安装pomelo-daemon并作为daemon-server进程启动之后, pomelo-daemon就负责接收daemon-client的命令, 来启动相应的应用服务器进程.

一般来说, 如果用pomelo-daemon来做分布式部署, 需要先使用pomelo start来启动master服务器, 然后再使用daemon-client来启动其它的应用服务器. 这与主贴中所述的方式不同, 对应用服务器的效率来说是没有什么区别的, 只不过是启动方式的不同而已.

回到顶部