简介: 块存储是很多文件系统的核心功能。文件共享和文件锁定是共享云数据资源中非常重要的流程,用于消除竞态条件。高效的实现 可对系统和应用程序的性能级产生显著影响。本文将使用一个开源示例 — 云平台 Eucalyptus 及其存储组件 Walrus — 来演示如何修改块存储来改进文件分享和锁定机制。学习如何安装 Eucalyptus 以便能发布一个顶级的 Infrastructure-as-a-Service 平台。
本文包括了一些 Walrus 的源代码的修改,Eucalyptus 开源框架中的存储服务组件,该框架用于实现 IaaS 环境(Infrastructure-as-a-Service)的云计算。学习如何修改 Walrus 源代码,以及如何重编译及运行,以改进 Eucalyptus 环境中的文件共享和文件锁定机制。
考虑这么做的根本原因,是对于云服务的使用者或云应用程序和服务的开发者和设计者,特别是如果他们采用文件共享或锁定,这将可以改善应用程序或服务的功能,改善资源的性能,从而减少时间、带宽及机器电能等资源的开销。这可能会降低成本。
我们将向您演示如何在集群中安装 Eucalyptus:本例中,是一台 IBM® 刀片服务器;此技术也可用于个人或笔记本电脑。
想要从文本获取更多知识,您应深刻理解云计算概念、Java™ 技术和 UNIX® 编码命令,并简单了解如何使用集群。为了能使用示例代码,需要简单了解 Eclipse 框架。在 参考资料 一章中有这些技术的背景资料。
本文使用 Eclipse 3.4.2 和 Cent OS 5.4 作为操作系统。
IBM 刀片服务器支持多种处理器技术和操作系统,以允许用户在单一架构中完成多项不同工作。IBM 刀片服务器降低复杂性、改进系统管理、提高能源效率,同时降低总体拥有成本。我们使用的是 IBM LS20 BladeCenter® Server(参考资料 )。
我们在本文中一般只提及单个集群;所有组件,除了节点控制器 ,都位于我们所说的前台终端上。(换句话说,云控制器 、集群控制器 和存储控制器 在前台 机器上运行。只运行节点控制器 的机器称作 “节点”。
在 CentOS 中安装 Eucalyptus 1.6.1 相当简单。作为管理员:
- 提取(解压缩)eucalyptus-1.6.1-centos-i386.tar.gz 文件。
- 以任意非
root
用户登录,并按照 developerWorks 维基 所示进行安装。
执行完这些步骤后,Eucalyptus 就安装成功。Eucalyptus 网站中还有其他安装方式说明。接着,下载 Eucalyptus 管理工具来管理虚拟镜像。维基中解释了打包镜像用法。
图 1 中显示了四个高级组件,每个都有自己的 web 服务接口,其中包含 Eucalyptus 安装:
这些组件是节点控制器、集群控制器、存储控制器(Walrus),以及云控制器。
- 节点控制器 控制执行、检测、结束其所运行主机上的 VM 实例。
- 集群控制器 收集关于特定的节点控制器上的 VM 运行的信息,并调度其运行计划,以及管理虚拟实例网络。
- 存储控制器 (Walrus)是一个
put/get
存储服务,它实现了 Amazon 的 S3 接口,并提供存储和访问虚拟机器镜像和用户数据的机制。 - 云控制器 是用户和管理员的云入口。它向节点管理员询问资源信息,做出高级计划决策,并通过向集群控制器发出请求来实现。
Walrus 是包含在 Eucalyptus 中的存储服务,其接口与 Amazon 的 S3 兼容。Walrus 可以存储永久数据,以存储桶(buckets) 和对象(objects) 的结构进行组织。
Walrus 不提供对象的写锁定;但是由于它与 S3 一样,因此要保证如果对同一个对象并发写入,保存的是一致的对象副本。如果对象写入时遇到前一个对相同对象的写入正在进行,发生这种情况时,前一个写入是无效的。
Walrus 现有版本不提供一致数据和对象锁定。要在云中运行镜像,必须生成一个打包镜像并上传到云中。Walrus 担当存储管理器:它接收镜像,并以存储桶和对象形式保存。当要从云中访问镜像时,Walrus 受委托确认并解密用户上传的镜像。
但要保存镜像时,为每个用户生成一个单独的存储桶,并有着惟一的存储桶名。使用 S3cmd
来生成存储桶和存储桶名:
$ s3cmd mb s3://my-new-bucket-name |
存储桶创建完成,就可以上传文件,作为对象,在存储桶中引用:
$ s3cmd put filename s3://my-new-bucket-name/filename |
要了解更多 Walrus 内部工作原理,可以研究 Amazon S3 的 S3cmd
(参考资料 )。
为了弥补 Walrus 的缺点,我们引入一种文件锁定机制:为了保持数据一致性,提供以读/写模式访问文件的功能。
当 user1 想要以写模式访问任一文件,相应的对象将被锁定,这样其他用户无法访问,直到它被 user1 释放。但其他用户能以读模式访问文件。
我们设计了一个单独队列,根据请求对象的顺序来放置每个用户的写请求,并允许系统处理对应请求。
在 Eucalyptus 中运行 VM 实例前,应当将下载的或生成的 VM 镜像与 Eucalyptus 证书打包,然后添加这些镜像,然后上传镜像并注册。
为了让 VM 镜像成为可运行实体,Eucalyptus 管理员必须添加根文件系统镜像以及 kernel/ramdisk 组到 Walrus(桶存储),并用 Eucalyptus 注册上传的数据。每个镜像都单独添加到 Walrus 并在 Eucalyptus 注册,这要用到以下的 EC2 兼容的命令:
- 要添加根文件系统镜像到 Walrus:
- 打包镜像:
$ euca-bundle-image -i <vm image file>
- 上传镜像:
$ euca-upload-bundle -b <image bucket> -m /tmp/<vm image file>.manifest.xml
- 注册镜像:
$ euca-register <image bucket>/<vm image file>.manifest.xml
- 打包镜像:
- 添加 kernel 到 Walrus 并用 Eucalyptus 注册:
- 打包 kernel:
$ euca-bundle-image -i <kernel file> --kernel true
- 上传包:
$ euca-upload-bundle -b <kernel bucket> -m /tmp/<kernel file>.manifest.xml
- 注册 kernel:
$ euca-register <kernel-bucket>/<kernel file>.manifest.xml
- 打包 kernel:
现在 Eucalyptus 还不支持文件共享机制,但我们将向您演示如何实现 Eucalyptus 中的文件共享。我们重点关注保持数据一致性。
对每个用户都创建了独立的 Virtual Machine 实例。目前情况下,Eucalyptus 也不支持不同 VM 实例间的文件共享。如果两个或多个用户同时以写模式访问文件或修改文件,文件将更新为最后保存的内容。
首先,我们看看如何创建一个新卷,并添加到实例中。
创建一个新卷之前,先看看当前功能区的信息:
$ euca-describe-availability-zones |
创建一个新卷:
$ euca-create-volume --size <size of volume> -x <name of availability zone> |
--size
表示希望创建的卷的大小,-x
表示希望卷所在的功能区的名称。
使用如下命令给实例添加卷:
$ euca-attach-volume |
例如,要添加 vol-12345678
卷到 /dev/sdb 的实例 i-98765432
:
$ euca-attach-volume -i i-98765432 -d /dev/sdb vol-12345678 |
当 VM 实例开始运行时,可以看到分配给它的两个 IP 地址。使用 SSH 键登录到 IP 地址:
$ ssh -i mykey.private root@<ip-address> |
假设用户 A 和 B 登录到两个不同系统,比方 System 1 和 System 2,使用相同的用户名和密码,想要从两个系统中访问一个文件。
A 和 B 想要通过 Elastic Fox 以写模式并发(同时)访问 VM 实例。通过使用实例的 IP 地址,两个用户试图使用 ssh
命令访问实例。当 A 修改 B 访问的文件,B 的修改得到更新。文件写的状态就不一致。
被修改的 walrus 架构是的文件修改保持一致。
让我们看看云及其虚拟网络的架构。
组件有:
- CLC ,或是云控制器,它是用户接口,进行高级调度;它组成了管理平台。
- ccX 是集群控制器,它将进入的请求安排到具体节点控制器,并收集/报告一组节点控制器的信息。
- ncX 是节点控制器,即承载 VM 实例的机器。
- Walrus 是永久的二级存储,它被节点控制器用于保存 VM 镜像,有时也存储数据。
图 3 显示一个用户如何与其他用户共享文件。
在此流程图中(顺着数字):
- 用户用登录 ID 和密码登录。
- CLC 检查数据库中的用户 ID 并为合法用户创建一个新的会话。
- CLC 将状态信息返回给用户。
- 用户共享其文件。
- CLC 现在检查用户是否真正拥有这个文件,认证成功后,添加新的用户标识到共享文件访问列表。
- CLC 将此信息发送给对应的 CC。
- CC 找到承载用户所需的虚拟机实例,并发送此消息。
- NC 将此文件转移成永久共享媒介(Walrus)以保证用户间共享。
- 文件通过 CC 和 CLC 转移到 Walrus。
- 文件转移到 Walrus。
- CLC 将成功消息发布给用户。
图 4 显示用户如何请求访问文件。
在此流程图中(顺着数字):
- 用户使用登录密码登录进系统。
- CLC 检查用户数据库并为合法用户创建一个新的对话。
- CLC 向用户返回登录状态信息。
- 用户请求文件。
- CLC 向用户目录发送请求来确认用户对文件的访问。用户目录保存文件细节和用户访问数据。
- CLC 将请求发送给相应的 CC。
- CC 查找承载用户的虚拟机实例的 NC。
在第 8、9 和 10 步中,NC 使用安全通道通过 CC 和 CLC 将数据传输到用户。
现在该看看节点控制器内部工作原理了。每个节点控制器中,都有管理程序运行。管理程序是一个平台虚拟化软件。我们使用类型 1 管理程序与承载硬件直接交互,运行管理程序上层的客户操作系统,分配 LPAR 之间的系统资源,以分享物理资源,如 CPU、直接访问存储设备和内存。(类型 1 管理程序是 IBM 早在 1970 年在 IBM System 370 处理器中引入的。)图 5 演示了 NC 及其管理程序工作流程。
在此流程图中(顺着数字):
- 请求从 CC 到 NC。
- 节点上运行的节点控制器模块将它发送到管理程序。
- 管理程序在客户操作系统的帮助下完成工作。
- 客户 OS 指示管理程序如何做。
- 管理程序与硬件交互,完成工作。
我们看到了引入 Eucalyptus 的文件共享如何提供帮助;现在我们看看如何通过读/写模式概念保证数据一致性。
图 6 显示了文件访问的写模式时间队列如何改善数据一致性:
图 6 将用户 B 在时间 t 以写模式请求文件 F1 与用户 C 在时间 t+1 以写模式请求同一文件进行对比。为保持文件一致性,我们设计了一个队列,用于放置请求,并按照先到先服务的原则。
由于 B 先于 C 请求文件,B 放在队列顶部,C 放在 B 下面。
一般来说,如果用户以写模式请求访问任何文件,请求都是按照其生成 时间的顺序放置。第一个请求的用户放在队列头部。下一个放在毗邻位置,依此类推。
图 7 显示添加了用户请求 函数 (写或读)决定因素来确定共享/锁定级别以提高数据一致性。
图 7 中,我们在时间框架中额外添加了一个用户访问文件来表示所提供的文件访问模式 — 用户以读模式还是以写模式访问。
在写访问队列中,用户 B 在队列顶部,这是因为 B 先于 C 以写模式请求访问文件。用户 B 得到写访问。用户 C 将在用户 B 释放文件锁后得到写访问。但用户 C 可以在用户 B 写模式锁定时以读模式访问文件。
一般来说,如果两个或多个用户以写模式并发访问文件,第一个用户保证能以写模式访问文件,其他用户的写模式访问请求将排队。但给所有用户读模式访问。当第一个以写模式访问的用户释放文件后,队列顶部的用户就能以写模式访问。
我们知道已经根据所有概念,完成了这些内容 — 实际修改步骤。这相当简单。
- 创建工作区,从 Eucalyptus 源复制 clc 文件夹。
图 8. 选择工作区文件夹
- 单击 File > Import 导入源。
图 9. 选择导入源
- 选择 General > Existing Projects 到工作区。
图 10. 选择现有项目
- 选择根目录路径,为 root/java/workspace/clc。
图 11. 选择根目录路径
- 单击 Finish 。
图 12. 但根目录和项目成功添加后,单击 Finish
- 左边是一个名为 “package” 的选项卡,其中列着项目内容。现在右键单击 build.xml 。
图 13. 准备构建 ...
- 运行 Ant 构建
图 14. ... 成功了!
应该能看到构建成功。很容易。
应用程序本身有一些文件,但我们只关注其中重点,让您自己构建创、建自己的应用程序。
为了实现文件共享和锁定机制,我们创建了一个名为 WalrusVirtualBlockManager
的类。代码实现了 Eucalyptus 中的文件锁定机制。清单 1 是源代码。
清单 1. WalrusVirtualBlockManager
|
已修改的块存储技术也可用于其他云平台。例如,在 Cassandra 中,数据被复制。这就是说,数据资源最新版本在集群的某个节点上,旧的版本在其他节点上。最终目标是,所有节点将访问最新版本。文件对象锁定不可用,但已 修改的块存储技术可在此引入,按照本文介绍的方式保持数据一致性。在 Digg、Facebook、Twitter 及其他网站能看到 Cassandra。
现在您已了解如何在集群中安装 Eucalyptus,以及如何修改 Walrus 源代码来实现或改进云中的文件共享和文件锁定机制。
学习
- Eucalyptus 社区 提供了沙盒环境,社区成员可以在其中实习、测试 Eucalyptus。在那里可以找到所有演示。
- 查阅 有趣的 Eucalyptus 介绍 。
- “面向虚拟基础设施的云服务,第 1 部分: Infrastructure-as-a-Service (IaaS) 和 Eucalyptus ”告诉您两件事 — IaaS 云如何提供基本服务让您用于部署和运行应用程序,以及 Eucalyptus 如何用于基础架构来创建公共或私有云。(另一篇文章,“面向虚拟基础设施的云服务,第 2 部分: Platform as a Service (PaaS) 和 AppScale ”,介绍 Eucalyptus 和 Platform-as-a-Service。)
- developerWorks 上关于 Eucalyptus 的文章还有:
- “剖析开源云 。”
- “Linux 上的云计算 。”
- “在云中部署数据库应用程序和项目 。”
- 了解更多 Amazon S3 工具和命令 。
- developerWorks 上关于 Amazon S3 的文章还有:
- 要了解更多基本的 UNIX 命令,查阅 常用 UNIX 命令 和 UNIX 命令 。
- 探索 IBM BladeCenter 服务器 。了解更多关于本文中用到的 BladeCenter LS20 的知识。
- developerWorks 云计算专区 包含云计算方面的已更新资源,包括
- 云计算世界的 介绍 。
- 已更新的 技术文章、教程、播客和网络广播 ,让您开发更轻松,也是 专业研讨会和会议记录 的一扇窗口,让您成为高效的云开发人员。
- 连接用于云环境的 IBM 产品下载和信息 。
- 积极参与 社区热议主题 。
- developerWorks 开源网站 提供关于开源软件、开发和实现的已更新资源。
- developerWorks Java 技术网站 提供关于 Java 标准和技术的已更新资源。
- IBM Developer Cloud 博客 提供来自云计算专家的最新开发者云的细节。
- how-to 维基 有最新的开发者云的常用场景。
- 随时关注 developerWorks 技术活动和网络广播 。
获得产品和技术
- 下载 Eucalyptus 最新版本 。
- IBM Smart Business Development and Test on the IBM Cloud 是供您开始开发云应用程序的场所。
- 用直接从 developerWorks 下载的 IBM 试用软件 ,在云上构建您的下一个项目。
讨论
- My developerWorks 上的 Developer Cloud 小组 是 IBM Cloud 上进行智能业务开发和测试的社区。
- 通过 My developerWorks ,加入 developerWorks 社区(开发人员博客、小组、论坛、播客、配置文件、通讯、维基和社区主题)这一具有很多连接、共享和协作工具的专业网络。
Ramanathan Sundarrajan(MydW Profile )是 IBM 的 Cloud Computing 工作小组中表现活跃的一位成员,曾在云创新方面进行过大量研究。Ramanathan 指导安娜大学 Guindy 工程学院应届生实习;本文即此项目成果之一。