一. 服务器停服维护

  1. QA测试完成后会打出服务器更新维护的整包放到这里,同时会通知包名

  2. 下载更新包到本地,然后上传到指定的ftp目录

  3. 将更新包的信息同步给运维和运营的同学

  4. 到更新的时间点后运营同学会切换服务器状态到维护,运维同学负责停服,更新,启服等具体操作,不出意外的话是不需要程序这边做任何操作的。

  5. 服务器更新重启之后QA同学会过一遍基本功能,程序这边就看下日志是否有异常或者报错,主要关注1001和6001服,QA主要测试这两个服。QA测试通过了,服务器也没有异常和错误就可以开服对外了(一般由QA在大群里对运营同学说,运营将服务器状态切换为正常)

==注意事项:==

  • 每次更新服务器启动之后,需要将服务器的自动封禁关闭,避免程序bug导致误封。在游戏对外跑一个小时之后如果没有战斗校验的bug可以开启自动封禁。在关闭期间需要值班同学关注企业微信的MT-外挂监控告警群,手动对外挂玩家进行封禁,具体细节参照反外挂文档。

  • 因为1001服目前人数较多,配置和其他服不一样,1001服的战斗校验线程数量需要单独手动修改(运维操作),所以维护时需要提醒一下运维同学修改

二. 回档

数据库相关

1. 线上数据库获取

  1. 拷贝当时数据库脚本

    执行 sh -x get_gameid_all_sql.sh [serverid] 备注:all有建库语句 data没有建库建表

  2. 以前的快照

    • 获取到 实例名称

    • 在机器上拉取

    • 修改实例名字(rm-bp1ofj5dorx7ha83p.mysql.rds.aliyuncs.com)和导出文件的名字(mtob_game_6081 )

      1
      2
      3
      mysqldump -hrm-bpXXXXX.mysql.rds.aliyuncs.com -ultgame_read -pXXX --opt --single-transaction --set-gtid-purged=OFF xxxx_game_6081 >mtob_game_6081_1111.sql
      压缩下载:
      mysqldump -hrm-bpxxxx.mysql.rds.aliyuncs.com -ultgame_read -pxxxx --opt --single-transaction --set-gtid-purged=OFF mtob_game_6081 | gzip > xxxx_game_6081_0111.sql.gz
    • 修改数据库常用命令

      1
      2
      3
      4
      5
      UPDATE `localids` SET `v` = '{\"1\":[11x,400x]}' WHERE `k` = '0000000x';
      CREATE DATABASE IF NOT EXISTS xxxx_game_1111_1128 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
      DROP DATABASE xxxx_game_xxxx_1202;
      select * from localids;
      mysql -h172.2.2.2 -uroot -pxxxx

热更新可以看服务器维护文档

回档可能需要 上传数据到服务器

2. 运营 道具操作

运营提供回档数据表格 我们把json打包热更新数据包。执行gm

自动复制key的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
' keyData:  脚本导出的数据
' roleData: 需要操作的数据 [serverId(tab)roleId]
' ====================
' xShell 脚本主函數
Sub Main
readTxt()
xsh.Dialog.MsgBox("complete")
End Sub

Function writeTxt(serverId, roleId, data)
set fs=createobject("scripting.filesystemobject")
if(fs.fileexists("E:\todo\huidang\keyData\keyData.txt")) then
set f =fs.opentextfile("E:\todo\huidang\keyData\keyData.txt",8)
f.write serverId
f.write Chr(9)
f.write roleId
f.write Chr(9)+Chr(9)
f.write data
f.WriteBlankLines 1
f.close
else
set f=fs.opentextfile("E:\todo\huidang\keyData\keyData.txt",2, true)
f.writeblanklines 2
f.write serverId
f.write roleId
f.write data
f.WriteBlankLines 1
f.close
end if
End Function

' 146 测试
function seachsshTest(serverId, roleId)
xsh.Screen.Send("cd gm 读取回档路径")
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
xsh.Screen.Send("ls -lAFR | grep xxxx | head -n 1")
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
dim readline
screenrow = xsh.Screen.CurrentRow - 2
readline = xsh.Screen.Get(screenrow, 28, screenrow, 99)
dim str1:str1 = Split(readline, ".")
dim str2:str2 = Split(str1(0), " ")
call writeTxt(serverId, roleId, str2(5))
end function

' 跳板机操作
function seachssh(serverId, roleId)
xsh.Screen.Send("ssht " + serverId)
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
xsh.Screen.Send("cd apps/mtgl_server/exportData/human_rollback_data/")
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
xsh.Screen.Send("ls -lAFR | grep " + roleId + " | head -n 1")
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
screenrow = xsh.Screen.CurrentRow - 2
readline = xsh.Screen.Get(screenrow, 28, screenrow, 99)
dim str1:str1 = Split(readline, ".")
dim str2:str2 = Split(str1(0), "_")
call writeTxt(serverId, roleId, str2(1))
xsh.Screen.Send("exit")
xsh.Screen.Send(chr(13))
xsh.Session.Sleep(500)
end function

Function readTxt()
set fs=createobject("scripting.filesystemobject")
if(fs.fileexists("E:\todo\huidang\keyData\roleData.txt")) then
set f =fs.opentextfile("E:\todo\huidang\keyData\roleData.txt",1,true)
Do until f.atendofstream
line=f.readline
dim str
str = Split(line, " ")
call seachssh(str(0),str(1))
Loop
f.Close
end if
End Function

回档实现方案

  1. 按照玩家异常数据镜像导出json文件 和时间节点
  2. 根据节点回档
  3. 具体实现 在 【back/backGM.java】

反外挂

更新之后 维护期间操作

  1. 清理战斗校验次数 gsc后台 /clearCheck

  2. 关闭战斗校验自动封号 gsc后台 /setCloseAutoCheck true

  • 观察对外后外挂次数新增情况,比较集中的外挂是前几个服和后几个服,主要看人比较多的服务器是不是有
    异常的次数激增
  • 重要)对新增的次数玩家尤其是高等级玩家要确认一下,比如战斗类型,伤害的json 就是有一个观察期
    确保更新没带来战斗校验的问题而对玩家误抓的可能,哪怕就算不开自动封禁让外挂跑一段时间也不能大面
    积误封
  • 具体观察周期视情况而定,开服后不能少于一小时,如果有任何疑虑和问题及时反馈东方和亮亮排查。等确
    认稳定后开始自动封禁,完成更新。
  • 期间外挂群内告警确定是外挂需要手动封榜封号
  1. 开启战斗校验自动封号 /setCloseAutoCheck false

对比数据:

  1. 打龙会输出如下信息 自上线起 打龙未出现误封 可以判定外挂

image-20230129180106309

  1. 外挂使用日志查看战斗数据 server. log 查看并对比客户端和服务器伤害值 做成json文件发给客户端

  2. 对应的二进制文件mtgl_server/battle_check_input 下文件

    battle_check_input

  3. 历史封禁数据在logs的error*.log查看

  4. 警告信息监听的是xdb.log 10分钟内外挂数据

战斗校验计次规则

  1. 服务器胜负结果不一致即认定外挂并记录次数
  2. 次数记录在游戏服 通过网关后台 查看admin
  3. 页面显示的封禁数据是5天内的热数据 可以以通过查询角色按钮查询过期数据

封禁规则

OB首周试封禁外挂规则:

  1. 程序在服务器运行时自动识别外挂,对于识别出认定为外挂的玩家进行第一步封禁:拉黑排行榜(所有榜单),如果在推图阵容推荐,即刻删除(后续通关的玩家补位)。
  2. 对于(1)步骤,随即输出Log,通过企业微信机器人发送消息,外挂玩家服务器,角色名,角色ID,战力,等级,战斗校验失败次数输出。
  3. 运营同学根据(2)的告警信息,对玩家进行人工识别,充值信息,等级,战力,阵容,养成
    情况等,如果确认,随即进行封号处理,如果觉得误封通知研发进行排行榜黑名单恢复。
    识别外挂的原则:玩家对于配置表里的战斗关卡通关结果,服务器校验失败超过30次(次数随近几
    天观察可以随时调整)

OB第二周自动封禁外挂规则:

  1. 自动封禁一个用户 输出以下信息:耍外挂的战斗类型和对应次数,充值总额,爬塔层数,推图进度,等级,战力,VIP等级
  2. 打龍一次即封榜,作弊10次自动封榜,作弊15次自动封号

针对外挂的处理方案

会按照充值额度区分处罚力度,详细信息如下:

image-20230129180731539

服务器回档记录

**image-20230129180709866

备注:

备注

修改一下1001服的战斗校验连接数配置在/home/ltgame/apps/mtgl_server/config/battlecheck.properties里面的
server.connection.num=3
改成:server.connection.num=7

常用指令

cat error*.log | grep 5013615 | grep BATTLECHECK | grep ERROR | grep resSucc=false

cat server.log | grep GUILD_WAR | grep 5013615