符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
本篇内容主要讲解“CloudStack怎么添加KVM主机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CloudStack怎么添加KVM主机”吧!
主要流程
10年的遂溪网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整遂溪建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“遂溪网站设计”,“遂溪网站推广”以来,每个客户项目都认真落实执行。
一、添加主机的代码入口是AddHostCmd的execute方法
接着调用LibvirtServerDiscoverer类的find方法
而在find方法中先通过SSH连接到对应的主机(我这里agentIp是172.16.65.135)sshConnection = new com.trilead.ssh3.Connection(agentIp, 22);
然后利用刚刚建立的连接在主机上执行启动agent命令SSHCmdHelper.sshExecuteCmd(sshConnection, setupAgentCommand + parameters, 3);
setupAgentCommand = "cloudstack-setup-agent"
该命令在135主机上执行完之后会启动一个相应的JAVA进程
二、稍微分析一下该进程的启动命令:关于jsvc.exec可以参考官方的解释http://commons.apache.org/proper/commons-daemon/jsvc.html
一句话概况jsvc就是让你非常方便简单的Linux环境下启动JAVA应用,跟我们一般用java xxx启动应用的效果是一样的,而后面的-cp很容易联想到是classpath的意思
再仔细看一下后面classpath中的jar包中包含了cloud-agent-4.3.2.jar,所以该进程的启动入口也就是com.cloud.agent.AgentShell的main方法
三、 我们稍微离开主机上发生的事情再回到管理节点来看
通过SSH执行完启动agent命令之后CS执行的是HostVO connectedHost = waitForHostConnect(dcId, podId, clusterId, guid);
注意此时数据库的host表中还没有关于该主机的记录
而waitForHostConnect方法中是一个_waitTime*2也就是10次的循环,每次循环中间让线程sleep30秒,
也就是总共5分钟来等待其他线程来将该主机的记录插入host表中,如果超过5分钟都没有拿到connectedHost就直接返回Null
四、 接下来我们关心的就是数据是怎样插入host表的
让我们把目光再次回到主机agent身上,看看JAVA进程启动之后发生了什么事情
通过查看日志文件/var/log/cloudstack/agent/agent.log(此处是在主机172.16.65.135上的文件)
再结合AgentShell这个类的代码总结一下agent进程在启动之后的运行流程如下:
创建一个Agent对象Agent agent = new Agent(this, localAgentId, resource); 注意 Agent 中有一个NioConnection _connection;实例化为一个NioClient
然后就是NioClient的初始化init方法
这里利用的是JAVA的NIO来进行通讯,具体的解释可以参考我的另一篇文章https://my.oschina.net/abelgroup/blog/849680
第一步就是建立跟管理节点也就是172.16.60.197的连接,如日志所示
连接上之后就是创建一个ServerHandler的Task放到线程池来执行
接着执行sendStartup(link)方法,该方法主要就是利用link来发送一个StartupRoutingCommand到管理节点
五、现在我们又回到管理节点来继续处理刚刚从agent中发送过来的StartupRoutingCommand这个命令
我们知道在CS中有一个AgentManagerImpl的实例对象,该对象持有一个NioServer,监听的端口8250正好是agent建立连接的端口
NioServer通过一个死循环来监听事件,当agent发送数据过来之后会执行NioConnect的read方法protected void read(final SelectionKey key)
接着创建一个AgentHandler的Task,然后执行它的processRequest方法
然后通过一个HandleAgentConnectTask的Task来执行handleConnectedAgent方法
该方法主要做的事情包括:createHostVOForConnectedAgent创建一个HostVo,host数据的插入也是在这个方法中执行
然后是createAttacheForConnect也就是为这个主机创建一个attach并交给attachManagerImpl来管理
接着是方法notifyMonitorsOfConnection,就是通知主机所有的Monitor来processConnect
其中包括StoragePoolMonitor,这个Monitor处理的是将所有该新主机可以利用的存储池跟该主机进行连接,此处不展开
所有这些处理完之后就执行agentStatusTransitTo(host, Event.Ready, _nodeId);将主机状态改为UP
当主机状态为UP之后前面第三步中的waitForHostConnect方法就能顺利的拿到数据了
到这里添加主机的任务基本上也算成功了