您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“CloudStack怎么添加KVM主機(jī)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“CloudStack怎么添加KVM主機(jī)”吧!
一、添加主機(jī)的代碼入口是AddHostCmd的execute方法
接著調(diào)用LibvirtServerDiscoverer類的find方法
而在find方法中先通過SSH連接到對應(yīng)的主機(jī)(我這里agentIp是172.16.65.135)sshConnection = new com.trilead.ssh3.Connection(agentIp, 22);
然后利用剛剛建立的連接在主機(jī)上執(zhí)行啟動agent命令SSHCmdHelper.sshExecuteCmd(sshConnection, setupAgentCommand + parameters, 3);
setupAgentCommand = "cloudstack-setup-agent"
該命令在135主機(jī)上執(zhí)行完之后會啟動一個相應(yīng)的JAVA進(jìn)程
二、稍微分析一下該進(jìn)程的啟動命令:關(guān)于jsvc.exec可以參考官方的解釋http://commons.apache.org/proper/commons-daemon/jsvc.html
一句話概況jsvc就是讓你非常方便簡單的Linux環(huán)境下啟動JAVA應(yīng)用,跟我們一般用java xxx啟動應(yīng)用的效果是一樣的,而后面的-cp很容易聯(lián)想到是classpath的意思
再仔細(xì)看一下后面classpath中的jar包中包含了cloud-agent-4.3.2.jar,所以該進(jìn)程的啟動入口也就是com.cloud.agent.AgentShell的main方法
三、 我們稍微離開主機(jī)上發(fā)生的事情再回到管理節(jié)點(diǎn)來看
通過SSH執(zhí)行完啟動agent命令之后CS執(zhí)行的是HostVO connectedHost = waitForHostConnect(dcId, podId, clusterId, guid);
注意此時數(shù)據(jù)庫的host表中還沒有關(guān)于該主機(jī)的記錄
而waitForHostConnect方法中是一個_waitTime*2也就是10次的循環(huán),每次循環(huán)中間讓線程sleep30秒,
也就是總共5分鐘來等待其他線程來將該主機(jī)的記錄插入host表中,如果超過5分鐘都沒有拿到connectedHost就直接返回Null
四、 接下來我們關(guān)心的就是數(shù)據(jù)是怎樣插入host表的
讓我們把目光再次回到主機(jī)agent身上,看看JAVA進(jìn)程啟動之后發(fā)生了什么事情
通過查看日志文件/var/log/cloudstack/agent/agent.log(此處是在主機(jī)172.16.65.135上的文件)
再結(jié)合AgentShell這個類的代碼總結(jié)一下agent進(jìn)程在啟動之后的運(yùn)行流程如下:
創(chuàng)建一個Agent對象Agent agent = new Agent(this, localAgentId, resource); 注意 Agent 中有一個NioConnection _connection;實(shí)例化為一個NioClient
然后就是NioClient的初始化init方法
這里利用的是JAVA的NIO來進(jìn)行通訊,具體的解釋可以參考我的另一篇文章https://my.oschina.net/abelgroup/blog/849680
第一步就是建立跟管理節(jié)點(diǎn)也就是172.16.60.197的連接,如日志所示
連接上之后就是創(chuàng)建一個ServerHandler的Task放到線程池來執(zhí)行
接著執(zhí)行sendStartup(link)方法,該方法主要就是利用link來發(fā)送一個StartupRoutingCommand到管理節(jié)點(diǎn)
五、現(xiàn)在我們又回到管理節(jié)點(diǎn)來繼續(xù)處理剛剛從agent中發(fā)送過來的StartupRoutingCommand這個命令
我們知道在CS中有一個AgentManagerImpl的實(shí)例對象,該對象持有一個NioServer,監(jiān)聽的端口8250正好是agent建立連接的端口
NioServer通過一個死循環(huán)來監(jiān)聽事件,當(dāng)agent發(fā)送數(shù)據(jù)過來之后會執(zhí)行NioConnect的read方法protected void read(final SelectionKey key)
接著創(chuàng)建一個AgentHandler的Task,然后執(zhí)行它的processRequest方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
然后通過一個HandleAgentConnectTask的Task來執(zhí)行handleConnectedAgent方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
該方法主要做的事情包括:createHostVOForConnectedAgent創(chuàng)建一個HostVo,host數(shù)據(jù)的插入也是在這個方法中執(zhí)行
然后是createAttacheForConnect也就是為這個主機(jī)創(chuàng)建一個attach并交給attachManagerImpl來管理
接著是方法notifyMonitorsOfConnection,就是通知主機(jī)所有的Monitor來processConnect
其中包括StoragePoolMonitor,這個Monitor處理的是將所有該新主機(jī)可以利用的存儲池跟該主機(jī)進(jìn)行連接,此處不展開
所有這些處理完之后就執(zhí)行agentStatusTransitTo(host, Event.Ready, _nodeId);將主機(jī)狀態(tài)改為UP
當(dāng)主機(jī)狀態(tài)為UP之后前面第三步中的waitForHostConnect方法就能順利的拿到數(shù)據(jù)了
到這里添加主機(jī)的任務(wù)基本上也算成功了
到此,相信大家對“CloudStack怎么添加KVM主機(jī)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。