虚拟机调度第四次任务总结
时间:2011-4-2->2011-4-9
程序说明文档
先看一下我们的“请求处理模型图”:
我们现在完成的情况是,1->2完成了,由于虚拟机启动的脚本有些问题,目前还不能从nc节点得到返回值,这个问题我们会尽快解决的。另外,已经写的代码当把要关闭虚拟机的情况和nc节点返回值情况都有涉及,只要脚本调试好了,剩下的几步也就很容易了。
接下来,看一下代码。
一)master节点的代码:
目前有三个文件:
master.erl (gen_server模型)
master_pro_req.erl (gen_fsm模型)
record.hrl (包含一些记录,这个文件与nc端的记录文件是一样的)
说明:
在master模块中,外部输出现有三个函数
start/0开启gen_server(创建的这个进程用来接收用户的请求信息,自己不对请求处理,要处理的话,启用状态机----master_pro_req中)
stop/0关闭gen_server :master将不会响应客户端发过来的请求。
user_request/4 用来模拟客户端发过来的请求(由于没有数据库,从数据库当中选择nc节点还没有实现,现在只能手动模仿选择nc节点和要启动的虚拟机)。
这几个函数当中user_request较复杂些,下面详解一下:
user_request(FsmName, Command, Nc, VM_num)
FsmName 是给状态机起的名字,暂时模拟,到时候可以以用户的某一属性作为此,不过不能重名,这个我研究了好久,这个原来是状态机本身自己规定的,也许gen_fsm就是通过状态机的名字来辨别不同的状态机的。
Command是用户想要实现的操作,目前的操作当中只有一个”start”命令,其他命令待续……
Nc前面已经说过,这个Nc暂时由自己手动设定,其代表的是要启动的那个虚拟机所在的nc宿主机
VM_num 表示虚拟机编号,要对VM_num号虚拟机进行Command操作
二)nc端的代码
目前也有三个文件
record.hrl (前面已经提及)
nc_operation.erl (gen_fsm模式)
nc_start.erl
nc_operation模块当中,不仅仅是对start命令处理,后面可能还会处理很多命令的,处理其他命令时,只需修改此文件即可。
其中master通过远程过程调用的是nc_start,如果后来有其他命令,那么只需修改nc_start.erl和nc_operation.erl文件即可。
在本次实现过程中,遇到了许多的gen_server和gen_fsm模型处理的细节问题,庆幸的是一一都被攻克,对这两个模型又有了新的认识,至于那些细节问题,我都会总结的,这里不再累赘。
最后是我们的测试。
测试环境:
两台宿主机,一台作为master(IP:222.24.10.50),另外一台作为nc(IP:222.24.10.55)节点。
将上面所说代码放到相应机子上。
master端
root @ centos-one ~/sun_cloud 75: erl -name root@222.24.10.50 -setcookie 123
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.3 (abort with ^G)
(root@222.24.10.50)1> c(master).
./master.erl:63: Warning: variable 'From' is unused
./master.erl:66: Warning: variable 'From' is unused
{ok,master}
(root@222.24.10.50)2> c(master_pro_req).
{ok,master_pro_req}
(root@222.24.10.50)3> master:start().
{ok,<0.51.0>}
(root@222.24.10.50)4>
注意:Warning暂时不要管
nc端
root @ centos-two ~/sun_cloud 86: xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 983 2 r----- 1044.4
root @ centos-two ~/sun_cloud 87: erl -name root@222.24.10.55 -setcookie 123
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.3 (abort with ^G)
(root@222.24.10.55)1> c(nc_operation).
{ok,nc_operation}
(root@222.24.10.55)2> c(nc_start).
{ok,nc_start}
(root@222.24.10.55)3>
下面又转到master端
(root@222.24.10.50)5> master:user_request(sunn, start, 'root@222.24.10.55', 20).
This is do_start function
ok
The vm is starting...[{nc_vm_start,start,20}]
The vm has been started successfully...
Your request has been processed.
(root@222.24.10.50)6> master:user_request(sunn, start, 'root@222.24.10.55', 21).
This is do_start function
ok
The vm is starting...[{nc_vm_start,start,21}]
The vm has been started successfully...
Your request has been processed.
(root@222.24.10.50)7>
又转到nc
(root@222.24.10.55)4> xm root @ centos-two ~/sun_cloud 88: xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 983 2 r----- 1052.3
centos-20 11 399 2 -b---- 18.5
centos-21 12 299 2 r----- 13.6
root @ centos-two ~/sun_cloud 89:
可以看出20和21号虚拟机成功启动。
以上的过程是在实际搭建的环境当中测试的。
附录:master和nc端的代码。
代码当中可能会有许多问题,希望大家能够为我们指出错误,谢谢o(∩∩)o...