内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

CloudStack怎么添加KVM主機(jī)

本篇內(nèi)容主要講解“CloudStack怎么添加KVM主機(jī)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“CloudStack怎么添加KVM主機(jī)”吧!

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)松嶺,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

主要流程

一、添加主機(jī)的代碼入口是AddHostCmd的execute方法

接著調(diào)用LibvirtServerDiscoverer類的find方法

而在find方法中先通過(guò)SSH連接到對(duì)應(yīng)的主機(jī)(我這里agentIp是172.16.65.135)sshConnection = new com.trilead.ssh3.Connection(agentIp, 22);

然后利用剛剛建立的連接在主機(jī)上執(zhí)行啟動(dòng)agent命令SSHCmdHelper.sshExecuteCmd(sshConnection, setupAgentCommand + parameters, 3);

setupAgentCommand = "cloudstack-setup-agent"

該命令在135主機(jī)上執(zhí)行完之后會(huì)啟動(dòng)一個(gè)相應(yīng)的JAVA進(jìn)程

CloudStack怎么添加KVM主機(jī)

二、稍微分析一下該進(jìn)程的啟動(dòng)命令:關(guān)于jsvc.exec可以參考官方的解釋http://commons.apache.org/proper/commons-daemon/jsvc.html

一句話概況jsvc就是讓你非常方便簡(jiǎn)單的Linux環(huán)境下啟動(dòng)JAVA應(yīng)用,跟我們一般用java xxx啟動(dòng)應(yīng)用的效果是一樣的,而后面的-cp很容易聯(lián)想到是classpath的意思

再仔細(xì)看一下后面classpath中的jar包中包含了cloud-agent-4.3.2.jar,所以該進(jìn)程的啟動(dòng)入口也就是com.cloud.agent.AgentShell的main方法

三、 我們稍微離開(kāi)主機(jī)上發(fā)生的事情再回到管理節(jié)點(diǎn)來(lái)看

通過(guò)SSH執(zhí)行完啟動(dòng)agent命令之后CS執(zhí)行的是HostVO connectedHost = waitForHostConnect(dcId, podId, clusterId, guid); 

注意此時(shí)數(shù)據(jù)庫(kù)的host表中還沒(méi)有關(guān)于該主機(jī)的記錄

而waitForHostConnect方法中是一個(gè)_waitTime*2也就是10次的循環(huán),每次循環(huán)中間讓線程sleep30秒,

也就是總共5分鐘來(lái)等待其他線程來(lái)將該主機(jī)的記錄插入host表中,如果超過(guò)5分鐘都沒(méi)有拿到connectedHost就直接返回Null

四、 接下來(lái)我們關(guān)心的就是數(shù)據(jù)是怎樣插入host表的

讓我們把目光再次回到主機(jī)agent身上,看看JAVA進(jìn)程啟動(dòng)之后發(fā)生了什么事情

通過(guò)查看日志文件/var/log/cloudstack/agent/agent.log(此處是在主機(jī)172.16.65.135上的文件)

CloudStack怎么添加KVM主機(jī)

再結(jié)合AgentShell這個(gè)類的代碼總結(jié)一下agent進(jìn)程在啟動(dòng)之后的運(yùn)行流程如下:

創(chuàng)建一個(gè)Agent對(duì)象Agent agent = new Agent(this, localAgentId, resource); 注意 Agent 中有一個(gè)NioConnection _connection;實(shí)例化為一個(gè)NioClient

然后就是NioClient的初始化init方法

這里利用的是JAVA的NIO來(lái)進(jìn)行通訊,具體的解釋可以參考我的另一篇文章https://my.oschina.net/abelgroup/blog/849680

第一步就是建立跟管理節(jié)點(diǎn)也就是172.16.60.197的連接,如日志所示

連接上之后就是創(chuàng)建一個(gè)ServerHandler的Task放到線程池來(lái)執(zhí)行

接著執(zhí)行sendStartup(link)方法,該方法主要就是利用link來(lái)發(fā)送一個(gè)StartupRoutingCommand到管理節(jié)點(diǎn)

五、現(xiàn)在我們又回到管理節(jié)點(diǎn)來(lái)繼續(xù)處理剛剛從agent中發(fā)送過(guò)來(lái)的StartupRoutingCommand這個(gè)命令

我們知道在CS中有一個(gè)AgentManagerImpl的實(shí)例對(duì)象,該對(duì)象持有一個(gè)NioServer,監(jiān)聽(tīng)的端口8250正好是agent建立連接的端口

NioServer通過(guò)一個(gè)死循環(huán)來(lái)監(jiān)聽(tīng)事件,當(dāng)agent發(fā)送數(shù)據(jù)過(guò)來(lái)之后會(huì)執(zhí)行NioConnect的read方法protected void read(final SelectionKey key) 

接著創(chuàng)建一個(gè)AgentHandler的Task,然后執(zhí)行它的processRequest方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

protected void processRequest(final Link link, final Request request) {

    final AgentAttache attache = (AgentAttache) link.attachment();

    final Command[] cmds = request.getCommands();

    Command cmd = cmds[0];

    boolean logD = true;

 

    if (attache == null) {

        if (!(cmd instanceof StartupCommand)) {

            s_logger.warn("Throwing away a request because it came through as the first command on a connect: " + request);

        else {

            // submit the task for execution

            request.logD("Scheduling the first command ");

            connectAgent(link, cmds, request);

        }

        return;

    }

然后通過(guò)一個(gè)HandleAgentConnectTask的Task來(lái)執(zhí)行handleConnectedAgent方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

private AgentAttache handleConnectedAgent(final Link link, final StartupCommand[] startup, final Request request) {

    AgentAttache attache = null;

    ReadyCommand ready = null;

    try {

        final HostVO host = _resourceMgr.createHostVOForConnectedAgent(startup);

        if (host != null) {

            ready = new ReadyCommand(host.getDataCenterId(), host.getId());

            attache = createAttacheForConnect(host, link);

            attache = notifyMonitorsOfConnection(attache, startup, false);

        }

    catch (final Exception e) {

        s_logger.debug("Failed to handle host connection: " + e.toString());

        ready = new ReadyCommand(null);

        ready.setDetails(e.toString());

    finally {

        if (ready == null) {

            ready = new ReadyCommand(null);

        }

    }

該方法主要做的事情包括:createHostVOForConnectedAgent創(chuàng)建一個(gè)HostVo,host數(shù)據(jù)的插入也是在這個(gè)方法中執(zhí)行

然后是createAttacheForConnect也就是為這個(gè)主機(jī)創(chuàng)建一個(gè)attach并交給attachManagerImpl來(lái)管理

接著是方法notifyMonitorsOfConnection,就是通知主機(jī)所有的Monitor來(lái)processConnect

其中包括StoragePoolMonitor,這個(gè)Monitor處理的是將所有該新主機(jī)可以利用的存儲(chǔ)池跟該主機(jī)進(jìn)行連接,此處不展開(kāi)

所有這些處理完之后就執(zhí)行agentStatusTransitTo(host, Event.Ready, _nodeId);將主機(jī)狀態(tài)改為UP

當(dāng)主機(jī)狀態(tài)為UP之后前面第三步中的waitForHostConnect方法就能順利的拿到數(shù)據(jù)了

到這里添加主機(jī)的任務(wù)基本上也算成功了

到此,相信大家對(duì)“CloudStack怎么添加KVM主機(jī)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站題目:CloudStack怎么添加KVM主機(jī)
網(wǎng)站鏈接:http://www.rwnh.cn/article10/gpogdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器關(guān)鍵詞優(yōu)化、用戶體驗(yàn)、定制開(kāi)發(fā)服務(wù)器托管、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
胶南市| 奈曼旗| 旬邑县| 卢湾区| 垣曲县| 双流县| 伊宁市| 鹿泉市| 沂南县| 海门市| 怀仁县| 屯昌县| 永福县| 苏尼特左旗| 大同县| 连南| 绥棱县| 固镇县| 密云县| 嘉义县| 江安县| 苍南县| 陵川县| 仁寿县| 合阳县| 彭阳县| 赤城县| 醴陵市| 抚顺县| 香格里拉县| 淳安县| 新竹县| 莱阳市| 梅州市| 祁门县| 册亨县| 金门县| 电白县| 鄂托克前旗| 伊通| 连云港市|