虚拟设备(appliance)是预先构建的软件解决方案,它们由一个或多个虚拟机组成,作为一个单元进行打包、更新、维护和管理。与传统的硬件设备不同,这些软件设备让客户能够轻松地购买、部署和管理预先集成的软件组合。这可以缩短实现价值的时间,简化软件的开发、分发和管理。
虚拟设备正在改变软件的分发模式,因为它们让应用程序构建者能够针对应用环境优化软件组合,向最终用户提供可立即使用的软件服务。
但是,当前的虚拟设备只包含一个虚拟机(VM),而现代的企业应用程序采用面向服务架构(SOA)其中包含多个层,每个层包含一个或多个机器。单一 VM 模型对于这种应用程序是不够的。要想以软件设备的形式分发多层的服务,就需要由多个 VM 组成的复杂的虚拟设备,其中的 VM 应该能够互操作。
例如,请考虑一个由三层组成的典型的 web 应用程序。web 层实现表示逻辑,应用服务器层实现业务逻辑,后端数据库层存储数据。简单的实现方法是把这个应用程序分为三个虚拟机,每层一个。这样,应用程序可以从占用一个物理主机的一部分扩展到占用三个物理主机。
在虚拟化数据中心中,复杂设备的部署和移除需要执行多个配置步骤,然后才能运行虚拟设备:
- 通过重新配置分配与 OS 相关的参数,比如 IP、主机名、密码等网络信息。
- 通过重新配置在以下组件和产品之间建立/中断通信:
- 在不同虚拟机中运行的相同产品的不同组件
- 在不同虚拟机中运行的不同产品
上面列表中的第一个问题由激活引擎技术解决;激活引擎是嵌入在虚拟设备中的软件,部署之后设备第一次引导时激活它。可以编写并提供激活引擎和定制插件,从而在目标系统上配置虚拟设备。
第二个问题还没有解决。目前,重新配置需要手动执行,或者通过用静态输入值调用预定义脚本来完成。我们建议通过在虚拟化数据中心中实现复杂虚拟设备的即插即用支持来解决这个问题。这样就可以自动地发现虚拟机并根据一些预定义的但比较灵活的连接策略把它们连接起来;StereoCable 对激活引擎起补充作用,可以与它同时存在。实际上,可以使用激活引擎在引导时自动地配置 StereoCable。
在讨论系统架构和工作流之前,我们先来介绍本文的关键概念 StereoCable。
StereoCable 是一种工件,描述如何在不同虚拟机中运行的两个实体之间建立基于角色的协作关系,例如:
(PRODA_UI,PRODA_SERVER) ... (PRODA_SERVER,PRODB_SERVER) ... (PRODA_UI,PRODB_SERVER)
一个 StereoCable 工件由两部分(我们称之为角色)组成:
- 插座角色(socket role)。插座描述一个实体为了与另一个实体建立协作关系需要提供的信息。如果在环境中给一个 VM 分配插座角色,那么它就要发布插座定义指定的信息。
- 插头角色(plug role)。插头描述一个实体为了与另一个虚拟机中运行的另一个实体建立协作关系需要执行的操作。如果在环境中给一个 VM 分配插头角色,那么它:
- 在同一环境中寻找作为相应的插座的 VM
- 获取发布的插座信息
- 执行插头定义中描述的操作
为了表示 StereoCable 工件,已经定义了一个 XML 模式。清单 1 是 StereoCable 信息的示例:
清单 1. XML 格式的 StereoCable 信息
<StereoCable>
<StereoCableID>StereoCableID1</StereoCableID>
<Description>PRODA UI Automatic Reconfiguration</Description>
<PlugSection>
<Description>PRODA UI Server</Description>
<PlugID>PRODA_UI</PlugID>
<ConfigurationActions>
<ConfigurationAction>
<Description>Description</Description>
<ID>ID</ID>
<Trigger>Deployment</Trigger>
<Action>
<ActionType>script</ActionType>
<ActionDetail>
<ConfigurationParameters>
<ConfigurationParamter>
<ConfigurationName>host</ConfigurationName>
</ConfigurationParamter>
<ConfigurationParamter>
<ConfigurationName>port</ConfigurationName>
</ConfigurationParamter>
<ConfigurationParamter>
<ConfigurationName>name</ConfigurationName>
</ConfigurationParamter>
<ConfigurationParamter>
<ConfigurationName>user</ConfigurationName>
</ConfigurationParamter>
</ConfigurationParameters>
<Operation>/pino/driver4/scripts/PRODAUI.sh</Operation>
</ActionDetail>
</Action>
</ConfigurationAction>
</ConfigurationActions>
</PlugSection>
<SocketSection>
<Description>PRODA Master</Description>
<SocketID>PRODA_SERVER</SocketID>
<PublishedParameters>
<ConfigurationParameter>
<ConfigurationName>host</ConfigurationName>
<ConfigurationValue>nc125050.romelab.it.ibm.com</ConfigurationValue>
</ConfigurationParameter>
<ConfigurationParameter>
<ConfigurationName>port</ConfigurationName>
<ConfigurationValue>31117</ConfigurationValue>
</ConfigurationParameter>
<ConfigurationParameter>
<ConfigurationName>name</ConfigurationName>
<ConfigurationValue>PRODA-istributed</ConfigurationValue>
</ConfigurationParameter>
<ConfigurationParameter>
<ConfigurationName>user</ConfigurationName>
<ConfigurationValue>PRODA85mdm</ConfigurationValue>
</ConfigurationParameter>
</PublishedParameters>
</SocketSection>
</StereoCable>
|
图 1 说明 StereoCable 系统的组件。
图 1. StereoCable 组件
StereoCable 系统由以下组件组成:
- StereoCable 引擎:它是在 VM 中装载的一个软件实体,它根据 XML 格式的 StereoCable 信息处理分配的角色。这个引擎还能够处理 VM 事件(例如部署新的 VM 或删除现有的 VM)以执行适当的配置操作。
- StereoCable 注册表:这个存储库记录可用的插座,并在收到请求时把它们提供给插头(根据预定义的约束)。这个组件不是必需的,因为在某些厂商的虚拟化实现中 VM 可以直接发布和共享这类信息。
- StereoCable 用户界面/命令行界面:这个软件实体用于操作 VM、插头和插座信息以及显示它们之间的关系。可以通过用户界面访问连接到 StereoCable 注册表和直接连接 VM 的信息。
(本文中提供的 StereoCable 实现支持 VMware;具体地说,支持 VMware ESX 3.5 和 vSphere 4。激活引擎使用 VMware VI SDK API 进行连接,StereoCable 注册表是 VMware VirtualCenter。支持的来宾操作系统是 SLES10。)
接下来,讨论 StereoCable 如何处理操作。
我们看看在使用 StereoCable 时会遇到的两类处理 — 引擎启动处理和 StereoCable 的动态处理(与传统的 VM 连接发现和重新配置过程相比,StereoCable 工件具有自动化优势)。对于本节,我们认为提供一系列步骤和流程图可以更清楚、简洁地说明处理过程。
引擎启动过程要执行以下步骤:
- StereoCable 引擎连接注册表以获取角色和 StereoCable。如果引擎使用的协议允许的话,这个步骤可以包含注册表自动发现,例如 SLP (service discovery protocol) 允许计算机和其他设备在 LAN 中寻找服务而不需要提前配置。
- 获取 VM 角色和 VM 所属的环境。
- 获取与 VM 相关联的 StereoCable。
- StereoCable 引擎处理 StereoCables.xml 文件中包含的 StereoCable。
- 对这个 VM 禁用全部 StereoCable 功能。
- 对于 StereoCables.xml 中的所有插座角色,如果插座角色与 VM 角色之一相同,那么:
- 检查依赖性是否是 OK。如果不是,就把这个插座放在工作队列中。
- 获取 XML 文件中描述的插座属性。
- 发布插座属性。
- 发布信息,说明这个插座现在已经激活。
- 发送一个发布插座的事件。
- 把插座放在 StereoCable 激活表中;还指定插头要连接到的信息。
- 对这个 VM 启用全部 StereoCable 功能。
- 对于 StereoCables.xml 中的所有插头角色,如果插头角色与 VM 角色之一相同,那么:
- 检查依赖性是否是 OK。如果不是,就把这个插头放在工作队列中。
- 获取 XML 文件中描述的相关插座信息(角色等)。
- 寻找属于同一环境的提供正确插座的 VM。
- 对于发现的所有 VM:
- 如果发现了多个 VM,根据 XML 文件中定义的规则决定选择哪个 VM。
- 如果插座的状态是激活的,获取发布的插座属性。
- 调用配置操作;作为参数传递获取的信息。
- 发布信息;表明这个插头现在已经激活,还描述它连接到哪个插座。
- 发送一个发布插头的事件。
- 把插头放在 StereoCable 激活表中,指定它连接到哪个插座。
- 如果没有 VM 可用,或者有 VM 可用但插座没有激活,就把这个 StereoCable 放在要处理的工作队列中,指定它需要的角色和环境。
下面是 StereoCable 动态处理的步骤(紧接前面的步骤):
- 定期收集 StereoCable 事件(创建插座、删除插座、更新插座)和与具有特定角色的 VM 相关的事件(VM 部署和 VM 移除)。
- 对于工作队列中的所有插头角色:
- 如果发现一个新的 VM,它发布所请求的激活的插座,那么:
- 如果插座的状态是激活的,获取发布的插座属性。
- 调用配置操作,作为参数传递获取的信息。
- 发布信息,表明这个插头现在已经激活,还描述它连接到哪个插座。
- 从 StereoCable 工作队列中删除此插头。
- 把插头放在 StereoCable 激活表中,还指定它连接到哪个插座。
- 发送一个发布插头的事件。
- 如果从数据中心中移除一个 VM,而 StereoCable 激活表中保存的一个插头正在使用它发布的插座,那么:
- 调用删除配置操作,作为参数传递与此插座相关的信息。
- 从 StereoCable 激活表中删除此插头。
- 把此插头放在工作队列中。
- 发布信息,说明此插头现在没有激活,连接中断。
- 发送一个取消发布插头的事件。
- 如果发现一个新的 VM,它发布所请求的激活的插座,那么:
下面的流程图描述这些步骤:
StereoCable 如何执行启动和动态处理
UI 和 CLI 显示数据中心中 VM 之间的 StereoCable 连接;它们还提供已经建立的连接以及相关插头和插座的详细信息。
建立 StereoCable 连接之后,由于引擎能够处理相关事件,这些连接是真正动态的:
- 引擎能够处理发布插座、删除插座等事件,从而激活、删除或取消激活连接。
- 在发布、更新或删除插座时,引擎还会生成事件,从而把变动通知用户。
图 2 说明引擎如何处理事件。
图 2. 处理事件
在本节中,介绍在不同的虚拟机中安装的两个产品(前一个产品作为代理,后一个产品作为服务器)之间创建、部署、建立和检查 StereoCable 连接的步骤。这是一个客户机-服务器连接示例,但是在复杂的集成场景中也可以使用 StereoCable 建立服务器-服务器连接。
StereoCable 连接由两部分(插头和插座)组成,用 XML 格式指定它。清单 2 给出 StereoCable 连接定义:
清单 2. XML 格式的 StereoCable 连接定义
<tns:StereoCablesxmlns:tns="http://ibm.com/stereocables"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/stereocables StereoCables.xsd ">
<StereoCable>
<StereoCableID>AGENT-SERVER</StereoCableID>
<Description>Agent Server Connection</Description>
<PlugSection>
<Description>Agent Plug</Description>
<PlugID>AGENT</PlugID>
<ConfigurationActions>
<ConfigurationAction>
<Description>Agent configuration</Description>
<ID>ConfigurationActionID1</ID>
<Trigger>Deployment</Trigger>
<Action>
<ActionType>script</ActionType>
<ActionDetail>
<ConfigurationParameters>
<ConfigurationParameter>
<ConfigurationName>hostname</ConfigurationName>
</ConfigurationParameter>
<ConfigurationParameter>
<ConfigurationName>port</ConfigurationName>
</ConfigurationParameter>
</ConfigurationParameters>
<Operations>
<Operation>agent_config.sh</Operation>
<OS>Linux</OS>
</Operations>
</ActionDetail>
</Action>
</ConfigurationAction>
</ConfigurationActions>
</PlugSection>
<SocketSection>
<Description>Server Socket</Description>
<SocketID>SERVER</SocketID>
<PublishedParameters>
<ConfigurationParameter>
<ConfigurationName>hostname</ConfigurationName>
<ConfigurationType>ActionBased</ConfigurationType>
<Action>
<ActionType>script</ActionType>
<ActionDetail>
<ConfigurationParameters>
<ConfigurationParameter>
<ConfigurationName>hostname</ConfigurationName>
<ConfigurationValue>hostname</ConfigurationValue>
<ConfigurationType>UserDefined</ConfigurationType>
</ConfigurationParameter>
</ConfigurationParameters>
<Operations>
<Operation>getNetworkConf.sh</Operation>
<OS>Linux</OS>
</Operations>
<Operations>
<Operation>getNetworkConf.sh</Operation>
<OS>AIX</OS>
</Operations>
</ActionDetail>
</Action>
</ConfigurationParameter>
<ConfigurationParameter>
<ConfigurationName>port</ConfigurationName>
<ConfigurationValue>2000</ConfigurationValue>
</ConfigurationParameter>
</PublishedParameters>
</SocketSection>
</StereoCable>
</tns:StereoCables>
|
在这个示例中,代理是插头,服务器是插座。
PlugSection 指定代理/插头为了连接服务器/插座需要执行的操作。在这个示例中,在部署时将执行脚本 agent_config.sh,以插座发布的主机名和端口作为输入参数。
SocketSection 描述插座发布的信息,也就是代理/插头所需要的主机名和端口。注意,主机名是通过运行脚本 getNetworkConf.sh 动态地获取的,而端口是在 XML 文件中静态地定义的。
包含 StereoCable 定义的 StereoCables.xml 文件将部署在代理和服务器机器上。
要想部署引擎,必须下载 StereoCable 引擎文件并解压到代理和服务器机器目录中,见图 3。
图 3. 部署引擎
在我们的示例中,引擎配置为使用 Java 目录下的 Java™ 运行时(在这里是用于 AMD64 架构上的 Linux® 的 Java 2 Technology Edition, Version 5.0, 64-bit Runtime Environment)。如果您使用不同的架构,应该在 conf/environment.properties 文件中指定路径。注意,已经使用用于 AMD64 架构上的 Linux 的 Java 2 Technology Edition, Version 5.0, 64-bit Runtime Environment 测试过这个引擎。
接下来,把 StereoCables.xml 文件复制到数据目录(图 4)。
图 4. 部署 StereoCable
在 conf/stereocables.properties 文件中指定每个机器的角色。
图 5. 定义角色
在服务器机器上,编辑插座键以反映 sockets=SERVER。在代理机器上,编辑插头键以反映 plugs=AGENT。
在代理和服务器机器上,指定同一环境:environment=TEST。
要想启动引擎,应该在运行它们之前注册它们。
注册服务器机器:
$./vEngine.sh -reg CTJES0003I Loading configuration. CTJES0004I The configuration has been successfully loaded. CTJES0001I Executing the operation: Registering the engine. CTJES0002I Operation successfully executed: Registering the engine. |
运行服务器机器:
$./vEngine.sh -run CTJES0003I Loading configuration. CTJES0004I The configuration has been successfully loaded. CTJES0001I Executing the operation: Run the engine. CTJES0001I Executing the operation: Cable processing. CTJES0005I Processing socket: SERVER. CTJES0011I Publishing information. CTJES0013I Sending event: Socket SERVER published. CTJES0019I Processing event's type: STEREOCABLES_SOCKET_PUBLISHED.SERVER. CTJES0020I Event processed. CTJES0006I Socket SERVER successfully processed. Socket processed: SERVER: Success Plug processed: CTJES0002I Operation successfully executed: Cable processing. |
注册代理机器:
$./vEngine.sh -reg CTJES0003I Loading configuration. CTJES0004I The configuration has been successfully loaded. CTJES0001I Executing the operation: Registering the engine. CTJES0002I Operation successfully executed: Registering the engine. |
运行代理机器:
$$./vEngine.sh -run CTJES0003I Loading configuration. CTJES0004I The configuration has been successfully loaded. CTJES0001I Executing the operation: Run the engine. CTJES0001I Executing the operation: Cable processing. CTJES0005I Processing plug: AGENT. CTJES0011I Publishing information. CTJES0013I Sending event: plug AGENT published. CTJES0019I Processing event's type: STEREOCABLES_PLUG_PUBLISHED.AGENT. CTJES0020I Event processed. CTJES0006I Plug AGENT successfully processed. Socket processed: Plug processed: AGENT: Success CTJES0002I Operation successfully executed: Cable processing. |
通过运行 $script/Cli.sh -list 命令,列出环境中发布的信息和可用的 StereoCable 连接。
CTJES0003I Loading configuration. CTJES0004I The configuration has been successfully loaded. CTJES0001I Executing the operation: Discovery machines. CTJES0002I Operation successfully executed: Discovery machines. ------------------------------------------------------------------- srv.ivm.com ------------------------------------------------------------------- guestInfo.stereocables.env = TEST guestInfo.stereocables.status = Enabled guestInfo.stereocables.sockets = SERVER guestInfo.stereocables.socket.SERVER.status=Active guestInfo.stereocables.socket.SERVER.hostname=srv.ivm.com guestInfo.stereocables.socket.SERVER.port=2000 guestInfo.stereocables.plugs = ------------------------------------------------------------------- ------------------------------------------------------------------- agt.ivm.com ------------------------------------------------------------------- guestInfo.stereocables.env = TEST guestInfo.stereocables.status = Enabled guestInfo.stereocables.sockets = guestInfo.stereocables.plugs = AGENT guestInfo.stereocables.plug.AGENT.status=Active guestInfo.stereocables.plug.AGENT.connected=srv.ivm.com:SERVER ------------------------------------------------------------------- |
可以看到在 TEST 环境中机器 agt.ivm.com 被插入 srv.ivm.com。
我们很高兴向您展示了一个新概念 — 自动地发现虚拟化数据中心中的虚拟机并根据预定义的连接策略把它们相互连接起来,还介绍了我们正在开发的一个项目,您可以使用它实现这样的系统。
请记住,虚拟设备有能力改变软件的分发模式,因为它们让应用程序构建者能够针对应用环境优化软件组合,向最终用户提供可立即使用的软件服务。在云应用程序中实现这种服务水平的关键一步是自动化和增强虚拟机连接。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 本文的示例代码 | stereocable.zip | 10KB | HTTP |
学习
-
访问 IBM Smart Business Development and Test on the IBM Cloud site,了解如何为云开发应用程序。
-
查看 growing list of of software images available on the IBM Cloud。
-
在 developerWorks 云开发人员参考资料 中,寻找应用程序和服务开发人员构建云部署项目的知识和经验,并分享自己的经验。
讨论
-
加入 My developerWorks 上的云计算组。
-
阅读 My developerWorks 上所有精彩的云博客。
-
加入 My developerWorks 中文社区,这是一个专业网络,是一个连接、共享和协作的统一社区工具集合。
Giuseppe Ciano 于 1997 年加入 IBM,担任 Rome SWG Tivoli Lab 的软件工程师。他作为 Tivoli 组合中不同产品的开发人员和设计师工作了 11 年。他目前是 IBM Service Delivery Manager 等 Tivoli Cloud Solutions 产品的首席设计师。他还是 StereoCable 的设计师。
Maurizio Simeoni 毕业于 University of Roma "La Sapienza" 的电信工程专业。他是 IBM Rome Tivoli 的高级工程师。他目前从事 IBM Service Delivery Manager。他在开发和支持软件应用程序方面有超过 10 年经验。他对 StereoCable 的设计和开发做出了贡献。
Alessio D'Amico 于 1999 年加入 IBM,担任 Rome SWG Lab 的软件工程师。在他的职业生涯里,他参与过从项目管理、业务分析、设计和构建直至实现的整个项目生命周期。目前,他负责基于 Tivoli 产品组合的服务管理和云计算解决方案的设计和实现。他擅长的主要领域包括系统管理、供应、服务管理、虚拟化和云计算。
Antonio Perrone 于 1989 年以优异的成绩从意大利 University of Bari 的信息科学专业毕业。他于 1990 年加入 IBM,担任过多个开发和支持职位。他从 1996 年起在 IBM Tivoli 部门工作,目前担任网络性能管理方面的架构师。他感兴趣的领域包括系统管理、性能和可用性、知识表达、数据集成、事务和过程建模及软件开发。