我们开发的页游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. IOS开发基础知识--碎片45

    1:iOS SEL的简单总结 SEL就是对方法的一种包装.包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法 a.方法的存储位置 在内存中每个类的方法都存储在类对象中 每个方法都有一 ...

  2. 1、软件工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件工程师要阅读的书籍估计是项目组内最多的.软件工程师处于项目组中最基础的人员储备阶层,与项目的关系最密切.当然,现在是大数据时代,我们无法全部看完所有相关的书籍,只能够先学习工作需要的知识,然后在项 ...

  3. You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1

    今天在Windows Server 2008 下安装SQL SERVER 2008时,碰到如下错误: You must use the Role Management Tool to install ...

  4. 深度解析mysql登录原理

    使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...

  5. Java 堆

    特性: 虚拟机启动时创建的线程共享的内存区域,所有实例对象和数组对象分配内存的区域 GC垃圾手机管理器管理的主要区域,GC堆 容量可以固定,也可以动态扩展,自动收缩 -Xmx最大堆大小 -Xms最小. ...

  6. W3School-CSS 内边距 (padding) 实例

    CSS 内边距 (padding) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CS ...

  7. javax.el.PropertyNotFoundException 出错

    之所以是把他记下来,是因为这个低级错误 害的我找了老半天. 后台传了对象到页面,在页面中循环遍历获得对象某个属性值 如下: <c:forEach items="${resultMap. ...

  8. CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU ...

  9. Ubuntu下的生活--安装

    概要 整个安装过程是通过离线包安装,而非在线安装. 目录 JDK安装与配置 Eclipse安装与配置 Apache安装与配置 MySQL的安装 JDK安装与配置 版本:jdk-7u71-linux-i ...

  10. 【转】根据中国气象局提供的API接口实现天气查询

    本文转载自 老三 的 三叶草 中国气象局提供了三个天气查询的API接口: [1]http://www.weather.com.cn/data/sk/101190101.html [2]http://w ...