我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上.

回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏上线之后搞得我焦头烂额的.

之前一直没碰过web相关的技术,最近几天猛看了下php和javascript相关的东西,逐决定用web的方式实现一套游戏服务器的运维和gm管理工具.

这个系统的目标:

  • 按逻辑和物理机器的方式管理服务(包括监控,启动,关闭等)
  • 当机器或服务出现异常的时候自动向预先设定的邮件地址发送邮件
  • 控制目标机器执行版本升级任务
  • 提供gm管理工具以方便运维人员查看游戏的运行状况,发送游戏公告等.

下面是这套系统雏形的两个截图:

这两张截图展示的是服务器的管理界面.左边是一个有两个标签的树形控件.第一个标签是物理视图,第二个是逻辑视图.右边是监控界面和3个控制按扭.

监控界面按用户在左边选择的节点来展示监控信息.例如如果用户选择的是物理视图中的一个根节点,如192.168.0.87.则右边的界面上就会显示目标机器的状态以及运行在目标机器上进程的状态.而控制按扭则分别用于启动/关闭/强杀一个或一组服务.

下面简单的介绍下系统的实现.

首先所有的监控数据,管理系统的用户及权限数据,服务器配置数据都被保存到一台中央ssdb服务上.

每台物理机器运行一个daemon服务,每隔一秒收集机器状态信息和上面运行的服务信息并将信息发送到中心ssdb服务上.同时daemon上启动一个简单的http服务,用于处理发送到这台机器上的操作请求.

下面是daemon的代码:

local Sche = require "lua.sche"
local Redis = require "lua.redis"
local Cjson = require "cjson" local deployment={
{groupname="central",service={
{type="ssdb-server",logicname="ssdb-server",conf="ssdb.conf",ip="192.168.0.87"},
}
},
{groupname="group1",service={
{type="groupserver",logicname="groupserver",ip="192.168.0.87",port="8010"},
{type="gameserver",logicname="gameserver",ip="192.168.0.87",port="8011"},
{type="gateserver",logicname="gateserver",ip="192.168.0.87",port="8012"},
}
},
{groupname="group2",service={
{type="groupserver",logicname="groupserver",ip="192.168.0.88",port="8010"},
{type="gameserver",logicname="gameserver",ip="192.168.0.88",port="8011"},
{type="gateserver",logicname="gateserver",ip="192.168.0.88",port="8012"},
}
},
} local function split(s,separator)
local ret = {}
local initidx = 1
local spidx
while true do
spidx = string.find(s,separator,initidx)
if not spidx then
break
end
table.insert(ret,string. sub(s,initidx,spidx-1))
initidx = spidx + 1
end
if initidx ~= string.len(s) then
table.insert(ret,string. sub(s,initidx))
end
return ret
end local err,toredis = Redis.Connect("127.0.0.1",6379,function () print("disconnected") end)
if not err then
toredis:Command("set deployment " .. Cjson.encode(deployment))
AddTopFilter("distrilua")
AddTopFilter("ssdb-server")
while true do
local machine_status = Top()
print(machine_status)
local tb = split(machine_status,"\n")
local machine = {}
local i = 1
while i <= #tb do
if tb[i] ~= "process_info" then
table.insert(machine,tb[i])
else
i = i + 1
break
end
i = i + 1
end
local process = {}
while i <= #tb do
if tb[i] ~= "" then
local tmp = {}
local cols = split(tb[i],",")
for k,v in pairs(cols) do
local keyvals = split(v,":")
tmp[keyvals[1]] = keyvals[2];
end
table.insert(process,tmp)
end
i = i + 1
end local str = string.format("hmset MachineStatus 192.168.0.87 %s",CBase64.encode(Cjson.encode({machine,process})))
toredis:Command(str)
--toredis:Command("set machine " .. CBase64.encode(Cjson.encode(machine)))
--toredis:Command("set process " .. CBase64.encode(Cjson.encode(process)))
Sche.Sleep(1000)
end
else
Exit()
end

daemon服务运行在distri.lua环境之上,所以是用lua编写的.

这段代码首先定义了一个叫做deployment的lua表,这个表就是服务器组的逻辑和物理配置信息.这个配置表将会被转换成json字符串并保存到ssdb的deployment字段中.之后尝试连接ssdb服务,如果连接成功则添加两个信息收集的过滤器ssdb-serverdistrilua添加了这两个过滤器之后每轮循环调用Top函数收集信息的时候就只会收集进程名为ssdb-serverdistrilua的进程的信息.收集到数据之后经过一些处理然后转换成json字符串接着保存到ssdb的MachineStatus相关对象的ip下面.

http相关的处理在这里尚未实现所以暂时不介绍.

接下来是manage.php,这个是用户控制界面的文件.这个文件使用了名为webix的js ui库.

		function fetchdata(){
createXMLHttpRequest();
var url="info.php";
xmlHttp.open("GET",url,true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
xmlHttp.onreadystatechange = callback;
xmlHttp.send(null);
} function callback(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
var info = JSON.parse(xmlHttp.responseText);
var deploydata = info.deployment;
var machinedata = info.machine_status;
if(firstrun){
webix.message("first");
buildDeployPhyTree(deploydata);
buildPhyTree(machinedata);
buildPhyView();
buildDeployLogTree(deploydata);
buildLogicalTree();
buildLogView();
}else{
buildPhyTree(machinedata);
buildLogicalTree();
updatePhyView();
updateLogView();
}
ShowStatus();
firstrun = false;
setTimeout("fetchdata()",1000);
}
}
}

这个文件的关键部分是这两个函数,fetchdata用于向服务器请求数据.这个请求被发往info.php页面.数据受到之后在callback中将数据转换成json对象然后根据数据构建视图.最后设置一个1秒钟的超时,超时之后继续向服务器请求数据.

接下来我们看下info.php:

<?php
header("cache-control:no-cache,must-revalidate");
header("Content-Type:text/html;charset=utf8"); function split_line($input,$separator){
$ret = array();
$line = strtok($input,$separator);
while($line != ""){
array_push($ret,$line);
$line = strtok($separator);
}
return $ret;
}
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$deployment = $redis->get('deployment');
$machine_status = $redis->hGetAll('MachineStatus');
$outputstr = "{\"deployment\":$deployment,\"machine_status\":[";
$first = true;
while(list($ip,$info) = each($machine_status)){
if($first){
$first = false;
}else{
$outputstr = $outputstr + ",";
}
$outputstr = $outputstr . "{\"ip\":\"$ip\",\"status\":" . base64_decode($info) . "}";
}
$outputstr = $outputstr . "]}";
echo $outputstr;
?>

处理相当简单,受到请求后向ssdb请求数据,然后将数据组合成一个json字符串返回给客户端.

感兴趣的朋友可以关注https://github.com/sniperHW/distri.lua,在examples目录下找到相关的文件.

distri.lua的web运维工具的更多相关文章

  1. CheungSSH国产自动化运维工具开源Web界面

    CheungSSH web2.0 发布文档 CheungSSH 简介 CheungSSH是一款国人自主研发的Linux运维自动化管理服务器软件,秉着为企业降低运营成本,解放管理员双手和自动化生产的理念 ...

  2. 【运维工具】Git代码发布系统

    引言 代码发布系统是互联网公司必备的运维系统,作用主要用户发布业务代码 到 业务服务器 为什么需要代码发布系统 有的同学可能说,我们公司服务器就那么一台,做个发布系统太麻烦了? 不认同这说法 发布系统 ...

  3. Linux实战教学笔记25:自动化运维工具之ansible (一)

    第二十五节 ansible之文件的批量分发 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转 ...

  4. 自动化运维工具——ansible详解(一)

    ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...

  5. 企业级自动化运维工具应用实战-ansible

    背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...

  6. 项目实战10.1—企业级自动化运维工具应用实战-ansible

    实战环境: 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测 ...

  7. Ansible自动化运维工具-上

    [Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要 ...

  8. 自动化运维工具——ansile详解

    自动化运维工具——ansible详解(一) 目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ...

  9. Python自动化运维工具-Fabric部署及使用总结

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

随机推荐

  1. java servlet 代码样例 (demo)

    今天又搞了下jsp +servlet 的代码样例,感觉虽然搭了好多次,可是每次还是不记得那些参数,都要去网上搜索,索性自己把这次的简单demo给记录下来,供下次使用的时候直接复制吧. 这个web逻辑 ...

  2. SQL语句汇总(一)——数据库与表的操作以及创建约束

    首先,非常感谢大家对上篇博文的支持,真是让本菜受宠若惊,同时对拖了这么久才出了此篇表示抱歉. 前言:此文旨在汇总从建立数据库到联接查询等绝大部分SQL语句.SQL语句虽不能说很多,但稍有时间不写就容易 ...

  3. 设计模式之美:Facade(外观)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...

  4. 真实世界:使用WCF扩展记录服务调用时间

    WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...

  5. Nginx运行Mono Web (ASP.NET)

    Mono Web除了可以使用Apache/mod_mono方式承载运行外,还可以使用Nginx/FastCGI方式运行. Nginx配置asp.net更简单方便,用处也多,可以通过FastCGI运行a ...

  6. mongodb(一) NoSQL简介

    NoSQL简介   写在前面,本文就是学习的记录笔记,大部分内容都属于参考,分享给大家 关系与非关系数据库      那么应该了解下影响关系数据库性能的主要原因: 在关系型数据库中,导致性能欠佳的最主 ...

  7. 转载:APP的上线和推广——线上推广渠道

    本文版权归个人所有,如需转载请注明出处http://www.cnblogs.com/PengLee/p/4637080.html 目录 应用商店 互联网开放平台 软件下载中心 媒体社交平台 刷榜推广 ...

  8. struts2学习笔记之一:基本简介

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个Servlet,在MVC设计模式中,Struts2作为控制器来建立模型与视图的数据交互(所有的访问都会被控制器操作控制)   ...

  9. GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验

    平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesB ...

  10. Maven学习总结(四)——Maven核心概念--转载

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...