分类: 服务器与存储
2016-06-06 09:37:20
盛大游戏是中国领先的网络游戏开发商、运营商和发行商,有着上万台的服务器,面对如此大量的服务器,盛大是如何做到远程服务器的自动管理的?
服务器一般是基于应用层的运维,硬件层面如何管理服务器?大部分公司的处理方式是通过操作系统的agent来做监管、监控。但是有些项目不希望被安装agent,比如盛大游戏,因为安装agent对应用是否会产生影响以及产生什么样的影响都不得而知,但是项目组为了监管可能会自己做一些agent放进项目中。
服务器硬件的自动化运维也是有一定的需求的。
硬件的健康情况,服务器处于什么状态,内存是否出现问题,电源有没有问题,这些在系统里都不好控制。
服务器出现问题后怎么去处理?通常是打电话给运营商,或者让现场的技术人员重装系统,重启机器。但是这种操作方式需要找人帮助,时效性较差,无法快速操作服务器。
远程的KVM。当系统宕掉,连接不上,无法确切判断服务器的状态时,就会用到远程KVM的功能。或者是系统自动部署,这是IDC全自动管理的很关键一环。全自动安装系统需要通过PXE启动,这之后通过IDC 匹配从而完成系统的自动安装。
基于这些问题,盛大使用了带外管理的方式。带外管理是IPMI智能管理的平台,基于IPMI的服务器管理及监控。IPMI最初是由英特尔、惠普、戴尔、NEC几家联合推出的一个跨平台的基于硬件的一个管理规范。从最早的1998年到2001年推出了1.5版本,到2004年推出了2.0版本,到现在也一直推出过更新的版本。最后一个版本是在2015年4月份有一个修订。盛大跟英特尔有着非常密切的合作,一直在考虑如何让IPMI的功能更加完善。
目前所提供的IPMI的功能,基本上是电源控制,可以开关机,还有硬件的监控,比如监控主板的情况和内存。再就是报警,可以设定阈值,提供一些报警的功能。还可以产生硬件层面的各种变化的日志。以及SOL串口的重定项,串口的重定项功能在早期的服务器都不支持目前新出服务器的扩展功能,所以我们看到的服务器屏幕上的信息是完全基于SOL做的。但是IPMI现在也还有很多问题,比如说不支持挂载虚拟介质等等。
IPMI基础的,对IPMI功能开发上会有些帮助。因为IPMI提供了一个标准的白皮书,虽然提出了一些工具,这些工具可能在某些场合下并不能完全达到开发者的要求,这时开发者要做一些基于硬件层面的,或者基于接口方面的开发。
硬件层面的架构图
其实带外管理就是一个单片机,可以理解成它是脱离服务器硬件的一块单片机,也就是说在服务器的主板上又集成了一个小的单片机系统。这个小单片机里面也有它自己的操作系统。这个小单片机我们叫做BMC,就是基板控制器,它是带外管理的主核心芯片。带外BMC完全是脱离开操作系统层面、服务器主板以及服务器硬件层面的。整个硬件的板卡只在电源层面上跟服务器有连接,所以即使不开机也是可以正常工作的。
带外所产生的一系列的信息,可以通过上面外部的接口和内部的接口访问所有的信息,就是System Interface。也就是说系统层面上带外是作为一个扩展的硬件的板卡,在操作系统上安装相应的驱动程序之后,通过系统可以访问整个带外系统所有提供的功能。
在BMC上有一个非实际性的存储器,存储器里保存了一个像IDL、SED、FIU这类的信息。IDL就是传感器的仓库记录,传感器所产生的信号都放在IDL里面,可以通过命令来获取IDL的信息,检查传感器的情况和状态。SEL是事件日志,硬件层面的事件会记录到SEL里面,通过获取SEL事件记录,能查到机器在什么时间出现过什么问题。再者是FIU可替换的管理单元,记录了整个服务器硬件系统的各板卡硬件的信息。通过获取FIU的信息,来识别板卡,服务器的厂家,SN号、资产号等。
BMC与外界的通讯是通过IPMB数据总线与外部数据进行交互。像惠普、戴尔、浪潮、联想这些服务商的服务器都有一块扩展器,扩展的带外卡里有一个MB芯片,在芯片上又加了一块板卡。这个板卡起到了对BMC的扩展功能。BMC是命令行的,没有外部接口,只能通过命令来完成一些操作,获取信息。如果想通过外部的方式更方便查看信息,就需要有一个扩展卡,这个扩展卡就是挂在IPMB总线上的。
服务器与服务器之间的通讯是通过ICMB总线去获取的。也可以通过外部的接口,像Lan接口、网络接口、串口、SL接口,来访问BMC,SL实际就是以前的电话拨号或者PPP协议,现在应用最多的还是Lan接口。图中上部叫out of Band(带外),下面我们叫in Band (带内)。上层是服务器外部,通过外部的接口来获取服务器的硬件信息。下层是通过操作系统内部来获取设备的信息。
软件站
软件站,上层是带内提供的一系列的访问功能,比如可以通过IPC,SNMP协议在系统内部获取带外的信息。还可以通过BMI、CIM、WMI获取接口,从带内获取它的信息。在windows很多信息都是可以通过WMI来获取的。
网络层的封装,它使用的是ICMP协议,2.0版本使用的ICMP+协议。这个协议在最外层,物理网卡上的封装。再往里使用的UDP623端口进行封装。再往里层就是IPM的信息传递的过程,包括它的NetFN、LUN,还有seq#、CMD、命令行,以及数据的封装。
关于信息传递的格式,分为请求和应答两部分。数据请求,IS、ADD是做请求响应的地址,有一个字节的长度。低位的表示地址码,最低位0表示一个地址码,为1的时候是一个软件的ID。高区位表示具体的地址码和软件的ID。CMD是命令代码,通过白皮书可以查到。完成代码,也就是CMD执行完之后,会返回一个代码,长度是一个字节。date是具体请求的数据,或者是响应的数据。LUN是它的逻辑单元码。NetFn是功能类别,功能类别后面会跟LUN。NetFn长度是一个字节,偶数为消息请求,奇数为消息的响应。LUN是高6位,请求的顺序号。有请求生成一个序列号,低两位是响应和接收消息的地址码。最后是检测盒,检测盒有一个算法,初始的时候检测盒是1,所有的被校验的字节和checksum相加后256取模,如果是0的话,就说明这个指令是正确的。
这些是在IPMI架构里面比较重要的几点,在实际开发中应用较多。