我们开发的页游General War(http://gw.gamebox.com)上线运营也有半年多了,服务器的开发到运维基本都由我一手包办,在服务器上线之后我们又招了一个程序员接手后续功能的开发,而我则主要转到后台工具开发和服务器运维上。说到服务器的运维,我的全部经验就是维护过几台小型企业的域控,在linux上部署过几个web服务,以前做游戏的时候运维都是交给运营方去打点,而这次我是主动承担了这部分的工作。

由于我们的游戏服务器框架(EasyGame)是基于.net技术开发的,所以选择windows服务器来部署是比较自然的事情,虽然借助mono也可以在linux上部署,但毕竟不如windows的成熟。而一说到windows服务器,很多人会跟我说windows如何低效运维如何麻烦如何的不专业,我个人认为这只是观念问题罢了。由于linux的学习曲线比windows的高,过滤掉了一大批小白用户,所以给人感觉linux的运维更加高效更加专业。但实际上,不管是linux还是windows重要的还是看你如何去用。我个人是不太喜欢命令行方式的,因为使用命令行会带来记忆的负担,要记住那么多命令和参数实在是一件麻烦事,命令行的输出信息缺乏有效的组织和排版,阅读起来也是低效的。但是windows的图形管理界面也是让我想吐槽的地方,大部分系统设置的界面都没有经过良好的组织和设计从而变得极其难用而且低效(比如注册表,组策略,服务管理等等),windows的配置修改就像魔法一般的存在,经常让人摸不着头脑。因此我自己开发了一套自动化运维部署工具来帮助我管理服务器。

我的部署工具的设计目标是这样的:

  1. 支持分布式的服务部署和管理,能够动态的管理多台宿主服务器
  2. 不用登陆服务器来进行管理,所有对服务器的操作可以在GUI控制台程序上完成
  3. 用GUI来降低使用难度,用友好的图表来组织服务器log数据和监控数据,便于阅读
  4. 尽可能的降低配置的复杂度
  5. 使用脚本来灵活的扩展工具以适应不同的需求

我们的服务器程序本身是分布式的,需要能够部署在多台服务器上,因此部署工具本身也是分布式的,我们有一个主控服务(ServiceManager)用于管理所有的宿主机以及宿主机上运行的服务,每台宿主机上有一个宿主机守护进程(ServiceHost)来对宿主机进行管理并向ServiceManager注册,从而组成一个服务器集群,然后用户通过一个GUI控制程序连接到ServiceManager上就可以管理和操作了。对于服务的配置,我采用的原则是约定优于配置,能不配置的东西尽可能做到免配置,对经常修改的配置和不太需要改动的配置分开处理,分成静态配置和动态配置。比如后端服务经常需要配置服务端口来暴露他的服务,端口的配置是相当麻烦的,搞不好就会出现端口占用冲突,所以这一块我们就使用动态端口来进行免配置,服务在ServiceManager上注册自己所开的端口,别的服务就可以得到服务端口。分布式服务会有多种服务类型,服务之间的互连,动态扩容等如果都通过配置文件来做也会非常麻烦,因为这一块我们使用服务名字约定来实现免配置,每一种服务使用一套名字约定来命名,比如前端代理服务器(AgentServer)就使用Agent.id来命名,当一个AgentServer在ServiceManager上注册之后就会广播给后端服务,后端服务在得到这个消息后决定是否要连接Agent来提供对外服务,一个后端服务在启动之后也可以查看当前集群中有哪些服务,然后决定是否要去建立连接。这样整个集群上的服务之间的连接就做到了免配置、启动顺序无关并且可以动态扩容。

对于GUI控制程序来说,GUI是对用户友好的,但缺点是开发成本较高而且不容易扩展,而命令行是天然的程序接口,对于程序本身十分友好,因此我的目标是要结合2者的优点,实现一个即容易使用又容易扩展的GUI程序。我的设计是这样的:首先,每个服务程序使用标准输入来接收运行命令,实现服务的启动、设置、管理和关闭,使用标准输出来输出格式化的log数据,这样的好处就是我的服务本身不依赖于服务容器,可以在命令行里可以当作一个普通的程序来运行和调试,整个设计是非侵入式的而且十分的KISS。然后,由ServiceHost作为服务容器来运行服务,ServiceHost接管服务的输入输出流,这样控制台程序就可以向服务发送命令了。每个服务所支持的命令及参数都是由服务自己决定的,在控制台程序上我们可以通过一个配置文件来告诉控制台程序这个服务支持哪些命令和参数,然后控制台程序会根据配置自动生成出对应的图形命令按钮和参数输入面板。通过配置就可以生成不同服务的管理控制界面,使得GUI有了很好的灵活性。最后,使用按钮虽然降低了使用难度,但是不利于批量操作,如果我一次有很多服务需要管理,那么通过点击按钮就是低效的,所以我集成了JavaScript来支持自动化脚本,这样就可以实现自动化的批量操作。

对于服务的更新,我集成了svn来实现资源文件的上传和分发,对小规模的集群来说,svn分发速度不是问题。如果是大规模集群的话,用svn作为资源分发源就有点捉襟见肘了,可以考虑集成p2p服务来实现资源的分发。服务本身支持多版本管理,在服务发布的时候可以选择不同的服务版本,来实现AB测试和灰度发布。

最后,整套部署工具的开发只用了不到8000行代码,2周的时间开发完成。目前我们架设了5台物理服务器来运行近40组游戏服,2台linux服务器装mysql做存储,2台做游戏应用服务器,1台做web资源下载和后台游戏管理工具。有了这套部署工具后,停服更新重启40组服务,最快只需要不到10分钟,运行也十分稳定,没有出现过crash事故。游戏从上线到现在,我们基本保持每周发布一个新版本的频率,这样高频率的版本更新导致游戏逻辑上难免存在很多bug,好在有部署工具的帮助使得查询log非常方便,对我们快速的定位和分析bug起到了很大的帮助。

总体而言,windows服务器的运维管理其实也不难做,懒惰的程序员会让运维变成一项适合懒人的工作。

谈谈我的windows服务器运维管理的更多相关文章

  1. windows服务器运维日常--防火墙打开后ping不通

    1. 打开防火墙,有利于安全 2. 添加80端口,支持互联网访问:添加3389端口,以支持远程桌面连接 3. 发现开了防火墙之后,ping不通网址www.mjywxy.xin 4. 查找资料和测试发现 ...

  2. 【转载】网站服务器运维记实:阿里云1核2G突发性能t5服务器突然变得卡顿

    阿里云突发性能服务器1核2G的t5服务器在高资源利用率的情况下运行一段时间后,发现服务器反应变得很慢,通过windows远程桌面连接上服务器后查看到CPU性能一直在90%到100%之间,无法降下来.前 ...

  3. 线上Linux服务器运维安全策略经验分享

    线上Linux服务器运维安全策略经验分享 https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&a ...

  4. 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记

    首先,这本书是Linux.CN赠送的,多谢啦~ http://linux.cn/thread-12733-1-1.html http://linux.cn/thread-12754-1-1.html ...

  5. Linux服务器运维安全策略经验分享

    http://jxtm.jzu.cn/?p=3692 大家好,我是南非蚂蚁,今天跟大家分享的主题是:线上Linux服务器运维安全策略经验.安全是IT行业一个老生常谈的话题了,从之前的“棱镜门”事件中折 ...

  6. 【微学堂】线上Linux服务器运维安全策略经验分享

      技术转载:https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&sn=6d403ab4 ...

  7. 企业该如何进行高效IT运维管理

    企业该如何进行高效IT运维管理 在企业内部也是一样,当大量的生产和经营数据集中在数据中心,一旦人们与数据中心因为IT故障而失去联系,停滞的也许不是个人应用受阻这样简单的后果.我们谁也不想看到自己企业的 ...

  8. 系统批量运维管理器Fabric详解

    系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...

  9. 工作中常用Linux命令--服务器运维

    工作中常用Linux命令--服务器运维 lsof查看端口使用情况 lsof -i:8080更多lsof命令使用说明:http://www.cnblogs.com/peida/archive/2013/ ...

随机推荐

  1. jquery管理ajax异步-deferred对象

    今天跟大家分享一个jquery中的对象-deferred.其实早在jquery1.5.0版本中就已经引入这个对象了.不过可能在实际开发过程中用到的并不多,所以没有太在意. 这里先不说deferred的 ...

  2. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  3. js自建方法库(持续更新)

    1.得到一个数,在一个有序数组中应该排在的位置序号: function orderInArr(num,arr) { if(num > arr[0]){ return 1 + arguments. ...

  4. Android自定义对话框

    在android中有自带的对话框,为了美观,很多开发者会使用自定义对话框,如下图: 点击“弹出自定义对话框按钮后”显示如图效果. 首先要自己定义一个xml文件定义自己对话框的样式: <?xml ...

  5. 一个3D ar打飞机的游戏iOS源码

    这是国内目前第一款集合了AR实景,3D游戏和人脸识别的射击游戏,通过旋转和改变手机的角度与位置,所有的射击操作都靠手势来完成,目前所有的源码全部都在这里.appStore地址:https://itun ...

  6. 72个可交付成果(PMBOK2008)

    成果名称 包括内容 来自 用于 事业环境因素 组织文化.政府法规.行业标准.市场条件.工作授权系统.商业数据库.项目管理信息系统 外部现有的 启动.规划.执行过程的输入 组织过程资产 流程与程序(模板 ...

  7. SqlServer--模糊查询-通配符

    查询所有姓张的同学Select * from student where left(sName,1)='张'   看上去很美,如果改成查询名字中带亮的学生怎么做?换一种做法 like  Select  ...

  8. 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查

    本文目录 使用EntityState枚举实现单个实体的增/删/改 增加:DbSet.Add = > EntityState.Added 标记实体为未改变:EntityState.Unchange ...

  9. FusionCharts参数说明 (中文)

    FushionCharts是把抽象数据图示化的套件,使用方便,配置简单.其相关参数中文说明如下. FusionCharts Free中文开发指南第二版.pdf 功能特性 animation       ...

  10. MongoDb 创建、更新以及删除文档常用命令

    mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...