- 准备工作:
1) 申请后台代码编译/部署用的私服
2) 申请后台代码权限
3) 找到后台同学的wiki地址,搞清专业术语
4) 把Linux/vim/svn命令打印出来贴在桌上,
5) 花1-2个小时安装和掌握相关操作,如ScureCrt或XShell WinSCP
6) 使用记事本记录操作步骤和遇到的问题,推荐使用印象笔记本
准备工作结束后,就可以开始着手私服的搭建工作。客户端程序员从事后台开发,对于写逻辑代码并不是太难的事情,前后台逻辑区别不大。难点在于熟悉后台的操作,调试和部署,我花了近1周(包括周末)的时间才把私服环境配置好,编译并部署成功,想想当时的兴奋仍回荡脑海。期间踩了不少坑,把root用户密码删除导致需要运维同学帮忙重装系统和各种相关软件。下面是我搭建天天炫斗私服记录的步骤,以此为例,或许对其它后台开发有抛砖引玉之功效。
通过该文档, 您将了解到如下流程:申请机子(TLinux)-安装系统-安装必要软件-下载代码-编译-远行游戏-开发新功能-编译-调试-外网问题跟进。
下面列出一些专业术语:
1.IDIP:给客服查询钻石消耗/删除道具/增加道具等接口,接收来自网页的请求, 由专门的IDIPSvr处理
- TCM:进程集中管理系统,控制所有分布在不同机器的不同事务进程的start、stop,配置刷新等
- TConnd:登录验证
- TLog: 记得道具消耗的流水日志
5.GameSvrd: 负责游戏的逻辑
- DBSvrd: 负责游戏数据存储与读取
- 搭建登录私服
第一步是先使用SecureCRT登录私服
1) 安装svn, 执行如下命令
rpm -ivh http://172.27.202.121/tlinux/tlinux/1.0/cr/x86_64//RPMS/subversion-1.6.11-2.el6_1.4.x86_64.rpm http://172.27.202.121/tlinux/tlinux/1.0/cr/x86_64//RPMS/subversion-svn2cl-1.6.11-2.el6_1.4.noarch.rpm http://172.27.202.121/tlinux/tlinux/1.0/os/x86_64/Packages/neon-0.29.3-1.2.el6.x86_64.rpm http://172.27.202.121/tlinux/tlinux/1.0/os/x86_64/Packages/libproxy-0.3.0-2.el6.x86_64.rpm http://172.27.202.121/tlinux/tlinux/1.0/os/x86_64/Packages/pakchois-0.4-3.2.el6.x86_64.rpm http://172.27.202.121/tlinux/tlinux/1.0/os/x86_64/Packages/libproxy-bin-0.3.0-2.el6.x86_64.rpm http://172.27.202.121/tlinux/tlinux/1.0/os/x86_64/Packages/libproxy-python-0.3.0-2.el6.x86_64.rpm
2) 安装mysql,
参考《IDC机器安装mysql》
/WeFight/wikis/view/IDC%2525E6%25259C%2525BA%2525E5%252599%2525A8%2525E5%2525AE%252589%2525E8%2525A3%252585mysql
3) 添加Hosts
确保机子可以访问svn和msdktest.qq.com, 用root用户修改/etc/hosts文件,增加一下两行(如果不能访问msdktest.qq.com, 创建角色会提示56错误)
10.14.40.10 tc-svn.tencent.com
10.194.146.218 msdktest.qq.com
4) 迁出SVN
在/data/home/user00中迁出svn线
svn co https://tc-svn.tencent.com/xxxxxx/Develop_branch
svn co https://tc-svn.tencent.com/xxxxxx/Develop_branch/apps
建立软链接, 编译代码后可以直接运行, 不需要解包:
ln -s Develop_branch vxd
5) 修改TCM配置及端口
(如二个人共用一个私服,一服多TCM需要)
1) 更改数据库(1.apps/tcm/conf_template/ 2. vxd/common/para )
1) sed -i 's/dbVXD/dbAlbertVXD/g' grep -rl 'dbVXD' apps/tcm/conf_template
2) sed -i 's/dbVXD/dbAlbertVXD/g' grep -rl 'dbVXD' vxd/common/para
2) 修改程序执行路径(apps/tcm/cfg/proc.xml WorkPath='/data/home/user00/vxd/' )
1) sed -i 's/user00/yourname/g' `grep -rl 'user00' apps`
2) sed -i 's/user00/yourname/g' `grep -rl 'user00' vxd`
3) 修改端口号, 建议前面加数字, 如18080 , 需要修改的地方比较多
文件apps/tcm/cfg/proc_deploy.xml
4) 申请外网访问的端口权限
一般申请三个端口权限:tconnd_dirs、tconnd_pvps、tconnd_gsvr
申请地址: /net_access_control/input
(参考:
/WeFight/wikis/view/%2525E4%2525B8%252580%2525E9%252594%2525AE%2525E6%252590%2525AD%2525E7%2525A7%252581%2525E6%25259C%25258D
/WeFight/wikis/view/tcm%252B%2525E5%252585%2525A5%2525E9%252597%2525A8%2525E7%2525AF%252587)
6) 使Develop_branch中的sh可执行
find . -name '*.sh' -exec chmod 777 {} \;
7) 创建DB数据库
执行 Develop_branch/dbcreatesql/create_alldb.sh 创建DB库
创建如下几个db:
dbVXDBossdbVXDGamedbVXDGameIDdbVXDGameLogdbVXDGuilddbVXDMaildbVXDNamedbVXDTopListdbVXDMatch
8) 初始化tcm(初始化ip端口,tbus管道)
#init脚本需要两个参数,本机IP 以及 Index
#Index需要看本机已经部署了几套tcm, 如果之前已经存在一个tcm(ps aux|grep tcmcenter 查看), Index填2即可
./init_all.sh localhostid 2
./start_all.sh
9) 查看TCM是否起来:
ps aux|grep tcmcenter
10) 全量编译服务器代码
进行~/vxd/
1) checkout.sh
2) build.sh debug
3) packall.sh dev(如果vxd和Develop_branch是软链接, 只需要执行一次,为了使vxd/多一次新生成的目录)
4) tar xzvf vxd_20*****.tgz -C ../
11) 启动程序
(如TCM没有启动,请求参考8步启动TCM)进入/apps/tcm/bin)
1) ./stop_tcmcenter.sh
2) ./start_tcmcenter.sh
3) ./start_tcmconsole.sh 后,进入tcm终端
12) TCM操作
(如果提示pid文件找不到, 可能是因为配置没有, 需要执行下面的命令)
1)新环境创建tbus管道
RefreshBusCfg *.*.*.*
2)创建配置并下发(tcm的配置改变了, 需要执行)
createcfg *.*.*.*
pushcfg *.*.*.*
3) 起停所有进程
stop *.*.*.*
start *.*.*.*
4) 如果发现启动某个进程失败,使用tcm命令:
listproc 1.1.11.1
5) 可以查看到失败的进程名称以及IP,然后到对应的日志目录查看失败原因,日志目录默认为:/data/home/user00/log
13) 私服起来后,使用客户端登录验证
1 )在客户端res/config/LoginDir/下添加私服dir配置(如:client.xml)
2 )将私服私线的protoco/cs_protocol外链到客户端,生成协议重新编译
3 )客户端选择登录该私服
4 )可能遇到的问题:
提示网络不太好,先检查客户端和私服协议是否一致。再查看gameserver错误日志和dbserver错误日志
如提示网络不太好(3), 查看gameserver没有对应的日志, 需要查看dbserver: handler, executor和dbsvrd.log三类日志都需要看, 发现缺少对应的字段, 需要在dbserver中调用.sh脚本创建表
如提示网络不太好(56),msdk关系链无法拉到,过几分钟后再试,如果问题还是出现,在私服中ping msdktest.qq.com是否通,详细参考前面步骤. 另一个可能是数据库字段被修改了, 需要cleardb
如登录小区提示: '网络不太好,请重新登录(35)'错误时, 需要申请私服IP访问msdk的权限
- 项目代码编写与编译
1 使用您熟悉的IDE修改服务器代码。因为天天炫客户端使用IDE是Vs2008,把后台代码导入到vs2008是个不错的选择。但手动导入费时费事,很多临时代码是难过xml生成的。CMake是非常好用的工程组织工具,我通过CMake把后台功能导到vs2008中,根据makefile配置宏和include头文件和库,所以有非常好的智能感知。下面是客户端和后台的工程,如果不编译调试仅写代码,是否觉得没有任何区别
CMakeLists.txt生成项目,做小小的修改inlude目录和宏,对任何工程项目都适用:
2 同步编写好的代码到私服上,一般使用WinSCP同步到私服上。如果是私线,可以直接commit到svn同步。还有一种方法是在私服上建samba共享目录,pc上连接该共享目录,直接在共享目录上编写代码。在linux上执行编译命令和部署。还有一种方案是VS2015+VisualGDB,可以在vs2015上推送文件到Linux上编译执和调试,看起来很高大上,但该方法没有尝试过。
3 执行过一次全量编译后, 小的修改可能增量编译
如果只修改了GameSvrd的代码, 进入vxd/gamesvrd/src/,
make –j16 (make –j 可以实现联合编译)
如果改了协议, 需要重新生成协议:
vxd/gamesvrd/src/upate_protocol.sh
如果修改了后台字符串
cd ~/vxd/tools/CreateSourceFile/bin
./CreateSourceFile ../../../common/common/i18n_string/i18nString.xml
如果出错, 重复第1步
- 刷新Gamesvr配置
1 修改配置目录(通过同步软件上传配置)
/data/home/user/vxd/common/common
2 进入私服上的gameserver执行目录
/data/home/user/vxd/gamesvrd/bin
3 查看进程id(格式如6.1.11.1)
ps aux|grep gamesvrd
4 执行如下命令
./refreshgamesvrd.sh 6.1.11.1
- 后台功能介绍
1 不同的事务放在不同的文件夹下,如gamesvr, dbsvr,
2 ISvrCtrl所有服务控件模块的基类, Main函数调用ISvrCtrl::Run(), Run执行:
1) 加载tcm配置
2) DoInitialize():1)加载日志配置文件CLogCfg::Initilize(); 2) CGameCtrl::Initialize() 各种数据/资源池的初始化
3) while(1): CGameCtrl::Update()->CGameCtrl::RecvClientMsg()处理服务器消息.
/data/home/user00/apps 链接Develop_branch/apps
/data/home/user00/vxd 链接Develop_branch
1)代码结构
游戏服务器(gamesvrd):
bin:编译后的.so文件,启动脚本
config:服务器自用的配置文件
src: 源代码
lib: 动态库
DB服务器(dbsvrd):
协议(protocol):
protocol/cs_protocol
共享配置:
Common/common/
其它服务器(服务器之间通过tcp通信)
Xxxsvrd,
公共库
libs/common所有服务器都会使用的代码/共用接口/工具apk
第三方静态库
Libs/lib
客户端共享:
libs/GamePlay
TCM目录
apps/
tagent
tcenterd
tcm
tconnd
tools
2) 服务器架构
服务器总架构图,各服务之间通过socket通信,服务标识号类似ip,如1.1.11.1代表gameserver
【gs集群】<->[proxy集群]<->[dbsvrd集群]【其他服务】
3) GameSvrd启动流程
4) 角色登录流程
5) TCM基本构建
6) 协议定义
1 客户端与服务器通讯协议在protocol\cs_protocol添加协议字段
cs_com_item.xml:
cs_com_msg.xml
2 服务器内部存储协议在protocol中添加
svr_com.xml
3在gamesvrd\src\ update_protocol.bat(win)生成gameserver协议
7) 更新DB表字段的过程:
gamesvrd/Player -> DBHandle -> DBExecutor -> SQLHelper::Update
8) 读取DB表字段的过程:
SQLHelper::Select -> DBExecutor -> DBHandle -> Player
- 调试
后台调试主要有GDB和看LOG, 其中LOG是主要的调试方式
- GDB断点
1)附加到对应进程
gdb attach pid
2)设置断点,可直接设置某个文件中的某一行
b filename:linenum
3)让进程继续执行
c
4)退出
detach或quit
5)进入函数
S
6) 删除断点
delete num
日志跟踪
1 服务器日志目录 /data/home/user00/log/xxxx/xxx.log如:gamesrv的日志在gamesvrd.1.1.11.1, gamesvrd.log是通用的日志, player/下面的是与角色相关的日志
2 apollo日志目录 /data/home/user00/vxd/apollo_sns/log/
3 tversion日志 /data/home/user00/vxd/tversionsvr/log
- Crash跟进
查看core文件(core文件在/data/corefile)
gdb ~/vxd/gamesvrd/bin/gamesvrd -c /data/corefile/core_gamesvrd_1430644548.7768
bt(或where查看堆栈)
- 外网问题跟进
1). 外网玩家信息查询步骤
1 通过QQ或WX找到openid
/index4.html?auth_cm_com_ticket=1c8908dc-a64a-4ada-a71b-c264867d1754#!/service/16075
2 登录MNET, 把Develop_branch/toos/scripts/目录上传到跳板机上,
3 填写脚本里面的用户名和密码(MNET的帐户), 几乎所有脚本都需要填写用户名和密码, 直接运行脚本不带参数会有提示
4 设置xxx.sh权限
chmod 777 *
5 通过openid查到角色ruid
./GetRuid.sh ado qq openid
6 通过ruid查到角色db信息(输出到PlayerDBInfo.txt中)
./GetInfo.sh ado qq game role 2257327448916329 > PlayerDBInfo.txt
7 查服务器IP列表信息
./jump.sh pub_qq
8 登录对应的服务器
./jump.sh pub_qq 1(通过序号, 会自动切换到user00用户)
同在跳板机上执行: ssh 10.205.139.86 -p 36000 -l albertzhong
2). 打开日志的办法
1 登录到对应的服务器(通过jump.sh脚本)
2 进入/data/home/user00/vxd/gamesvrd/config/server/ 修改locallogcfg.xml.1.7.11.1
3 进入/data/home/user00/vxd/gamesvrd/bin/ 运行 ./refreshgamesvrd.sh, 用户重新登录后, 就会有日志
- 常见问题
- SecureCRT乱码
- 私服上执行svn up命令提示编码问题时, 请执行:export LC_CTYPE=”zh_CN.UTF-8”
- 如果启动服务进程时, 提示deplop_xxx_....xml时, 可能是配置有问题, 需要重新更新apps/tcm/cfg中的配置, 5月2号就是遇到该问题, 因为ADDR和PORT里面的数值是空的
- 如果是Libs中的源代码改变了, 比如与客户端共用的代码GamePlay/EntryCfg, 需要到Libs/Gameplay目录下执行make –j16进行编译.
- 如果经常提示56错误, 先看看主机能否ping通msdk的服务器, 另一个可能是数据库字段被修改了, 需要执行清理DB操作
- 时间校对: /bin/sh /usr/local/ieod-public/ntpdate/ntpdate.sh -f (用root 登录)
如果机子挂了后, 需要重新启动进程, 步骤如下:
1) 非常重要的一步, 首先查看mysql是否起来在root下启动mysql: /etc/init.d/mysqld start
2) ~/apps/init_all.sh 10.12.153.88 1
3) ~/apps/start_all.sh 10.12.153.88 1
4) ~/apps/tcm/bin/start_tcmconsole.sh
1) RefreshBusCfg *.*.*.* 2) createcfg *.*.*.* 3) pushcfg *.*.*.* 4) start *.*.*.*
- 如果启动某个服务失败, 可能是配置问题, 尝试tcm中的createcfg ... 和 pushcfg ...
如果关闭某个服务失败, 也可能是配置问题, 执行上面的操作
- 装备, 道具的实倒, 是在统一的资源池中获得, 资源会重复利用, 删除后的物品, 增加新物品, 会使用到相同的Gid
问题: 符石升级后, 发现旧符石与新符石的Gid是一样的, 原因是使用了统一的资源池
10.在登录事务未处理完后, 不能更新DB, 因为DBServer无法获得有效的Session, 会被跳出来(错误码2), 但不知道Equip什么能更新成功
11.如果旧角色登录不了, 新角色可能登录, 可能是因为角色身上的物品ID是旧的
12.修改SQLHelper.xml后, 使用同级目录下的SQLHelper.bat生成.cpp和.h文件
13.状态统计需要在stat.xml中定义字段, 然后生成cpp和h文件