亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CloudStack怎么添加KVM主機

發布時間:2021-08-16 17:32:48 來源:億速云 閱讀:246 作者:chen 欄目:云計算

本篇內容主要講解“CloudStack怎么添加KVM主機”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“CloudStack怎么添加KVM主機”吧!

主要流程

一、添加主機的代碼入口是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進程

CloudStack怎么添加KVM主機

二、稍微分析一下該進程的啟動命令:關于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上的文件)

CloudStack怎么添加KVM主機

再結合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方法

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;

    }

然后通過一個HandleAgentConnectTask的Task來執行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創建一個HostVo,host數據的插入也是在這個方法中執行

然后是createAttacheForConnect也就是為這個主機創建一個attach并交給attachManagerImpl來管理

接著是方法notifyMonitorsOfConnection,就是通知主機所有的Monitor來processConnect

其中包括StoragePoolMonitor,這個Monitor處理的是將所有該新主機可以利用的存儲池跟該主機進行連接,此處不展開

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

當主機狀態為UP之后前面第三步中的waitForHostConnect方法就能順利的拿到數據了

到這里添加主機的任務基本上也算成功了

到此,相信大家對“CloudStack怎么添加KVM主機”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂南县| 苍溪县| 澳门| 绩溪县| 麻城市| 沙坪坝区| 蒙城县| 都江堰市| 铜梁县| 泽州县| 商河县| 正宁县| 遵化市| 翼城县| 永泰县| 泉州市| 枣阳市| 吴川市| 峡江县| 鹰潭市| 珲春市| 伊川县| 屏南县| 永吉县| 乳源| 清镇市| 无锡市| 前郭尔| 海南省| 靖江市| 白玉县| 申扎县| 三明市| 壤塘县| 西青区| 富宁县| 清原| 准格尔旗| 大方县| 天祝| 原平市|