本文是原创,作者的微信公众号为:Moehoo猛虎
【摘要】问题的提出:根据XenServe服务器中虚拟机的性能情况,实时且自动地做出启动新虚拟机、关闭已启动虚拟机的动作。本文简要叙述了基本思路和方法,在具体进行开发时,需要参考《XenServer 软件开发工具包指南》,其中含有:如何编写与XenServer 主机交互的应用程序的精选代码示例。
【目标简述】
根据XenServe服务器中虚拟机的性能情况,实时且自动地做出启动新虚拟机、关闭已启动虚拟机的动作。
甲、XenServer SDK环境的搭建
(1)XenServer 6.0 SDK的下载网址
http://community.citrix.com/display/xs/Download+SDKs
注:下载时,找到如下部分:
XenServer SDK VM
点击“Download SDK”下载,这是一个完整的基于Linux的开发环境。
(2)服务器配置建议
Ⅰ)先在一台服务器上搭建开发环境,建议配置如下:
CPU:酷睿i5以上(支持Intel VT 和AMD-V)
内存:16GB
硬盘:500GB×2
网卡:4块千兆以太网卡
Ⅱ)完成初步目标后,再搭建一台服务器,在XenServer的HA(高可用性)和Failover(故障转移)环境中进行进一步调整。
乙、基本思路
(1)在XenServer上创建Daemon:XS_InfoGet
XS-InfoGet用于:使用 HTTP 与 XenServer 交互以获取 XenServer性能统计信息并进行传递。
XenServer的各项目统计信息(包括XenServer和各个虚拟机的相关数据)均存储在RRD(Round Robin Databases,循环数据库)中,可使用HTTP从XenServer中获取这些数据,然后将数据传递给后台的监控Daemon。
具体说明可见附件的相关说明部分。
参考资料一 Using XenServer RRDs:
http://community.citrix.com/display/xs/Using+XenServer+RRDs
参考资料二 Getting the Last RRD Datapoints:
http://community.citrix.com/display/xs/Getting+the+Last+RRD+Datapoints
参考资料三 一个完整的Python脚本:
http://community.citrix.com/display/xs/RRD+Example+Script
(2)在XenServer上创建Daemon:XS_CoreDecision
用C在XenServer上编写Daemon:XS_CoreDecision,运行在XenServer后台上,实时地接收来自XS_InfoGet的数据,并且,做出性能分析和相应动作:
Ⅰ)一旦一些数据(如内存占用率)超过阈值,即将参数(比如,需要启动的虚拟机名称等)传递给相关函数,启动新的虚拟机;
Ⅱ)一旦某些数据低于阈值,即将参数(比如,需要关闭的虚拟机名称等)传递给相关函数,关闭现有的某些虚拟机;
比如,启动虚拟机:
static int start_vm(xen_session *session,xen_vm vm)
{
printf("Startingnew Virtual Machine now...\n");
xen_vm_start(session,vm, false, false);
print_vm_power_state(session, vm);
return 0;
}
关闭虚拟机:
static int shut_vm(xen_session *session,xen_vm vm)
{
printf("Shuttingdown Virtual Machine now...\n");
xen_vm_hard_shutdown(session, vm,false,false);
print_vm_power_state(session, vm);
return 0;
}
同样地,也可以执行克隆虚拟机、挂起虚拟机和恢复虚拟机等操作。
Ⅲ)也可以由此Daemon(XS_CoreDecision)去启动一个bash脚本(先要将虚拟机的UUID传递给此脚本),用脚本去控制虚拟机的启动和关闭。
比如,关闭一个虚拟机:
# Get name and state of the vm
name=$(${XE} vm-list uuid=${vmuuid}params=name-label --minimal)
state=$(${XE} vm-list uuid=${vmuuid}params=power-state --minimal)
wasrunning=0
# If the VM state is running, shutdown thevm
if [ "${state}" ="running" ]; then
${XE}vm-shutdown uuid=${vmuuid}
${XE}event-wait class=vm power-state=halted uuid=${vmuuid}
wasrunning=1
fi
需要说明的是,如果使用了HBA卡,那么,通过XenServer的SDK是无法访问HBA卡的相关信息的,只能通过HBA的工具软件获取相关信息。