Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1902656
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2011-04-09 17:48:19

虚拟机调度第四次任务总结
时间: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...

 
阅读(1611) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~