提高云中的文件共享和文件锁定

修改块存储以提供更高效的 Infrastructure-as-a-Service

块存储是很多文件系统的核心功能。文件共享和文件锁定是共享云数据资源中非常重要的流程,用于消除竞态条件。高效的实现可对系统和应用程序的性能级产生显著影响。本文将使用一个开源示例 — 云平台 Eucalyptus 及其存储组件 Walrus — 来演示如何修改块存储来改进文件分享和锁定机制。学习如何安装 Eucalyptus 以便能发布一个顶级的 Infrastructure-as-a-Service 平台。

Ramanathan Sundarrajan, 系统运行高级专家, IBM

Ramanathan Sundarrajan(MydW Profile)是 IBM 的 Cloud Computing 工作小组中表现活跃的一位成员,曾在云创新方面进行过大量研究。Ramanathan 指导安娜大学 Guindy 工程学院应届生实习;本文即此项目成果之一。



Kishorekumar Neelamegam, 系统工程师/IT 架构师, IBM

Kishorekumar Neelamegam 是 IBM Global Business Service 的 IT 架构师。他有超过 13 年的软件开发经验,专注于将软件集成到 Rational 平台。Kishor 对云计算有很高的热情,积极参与 developerWorks 上的相关主题。您可以通过他的 MydW 简介博客 关注他的活动。



V. T. Prabagaran, 实习生, IBM

V.T. Prabagaran 是印度钦奈的安娜大学 Guindy 工程学院应届生。



2010 年 8 月 30 日

本文包括了一些 Walrus 的源代码的修改,Eucalyptus 开源框架中的存储服务组件,该框架用于实现 IaaS 环境(Infrastructure-as-a-Service)的云计算。学习如何修改 Walrus 源代码,以及如何重编译及运行,以改进 Eucalyptus 环境中的文件共享和文件锁定机制。

考虑这么做的根本原因,是对于云服务的使用者或云应用程序和服务的开发者和设计者,特别是如果他们采用文件共享或锁定,这将可以改善应用程序或服务的功能,改善资源的性能,从而减少时间、带宽及机器电能等资源的开销。这可能会降低成本。

我们将向您演示如何在集群中安装 Eucalyptus:本例中,是一台 IBM® 刀片服务器;此技术也可用于个人或笔记本电脑。

想要从文本获取更多知识,您应深刻理解云计算概念、Java™ 技术和 UNIX® 编码命令,并简单了解如何使用集群。为了能使用示例代码,需要简单了解 Eclipse 框架。在 参考资料 一章中有这些技术的背景资料。

在集群中安装 Eucalyptus

本文使用 Eclipse 3.4.2 和 Cent OS 5.4 作为操作系统。

安装之前

IBM 刀片服务器支持多种处理器技术和操作系统,以允许用户在单一架构中完成多项不同工作。IBM 刀片服务器降低复杂性、改进系统管理、提高能源效率,同时降低总体拥有成本。我们使用的是 IBM LS20 BladeCenter® Server(参考资料)。

我们在本文中一般只提及单个集群;所有组件,除了节点控制器,都位于我们所说的前台终端上。(换句话说,云控制器集群控制器存储控制器前台 机器上运行。只运行节点控制器 的机器称作 “节点”。

作为管理员进行安装

在 CentOS 中安装 Eucalyptus 1.6.1 相当简单。作为管理员:

  1. 提取(解压缩)eucalyptus-1.6.1-centos-i386.tar.gz 文件。
  2. 以任意非 root 用户登录,并按照 developerWorks 维基 所示进行安装。

执行完这些步骤后,Eucalyptus 就安装成功。Eucalyptus 网站中还有其他安装方式说明。接着,下载 Eucalyptus 管理工具来管理虚拟镜像。维基中解释了打包镜像用法。

图 1 中显示了四个高级组件,每个都有自己的 web 服务接口,其中包含 Eucalyptus 安装:

图 1. Eucalyptus 四个高级组件
Eucalyptus 四个高级组件

这些组件是节点控制器、集群控制器、存储控制器(Walrus),以及云控制器。

  • 节点控制器 控制执行、检测、结束其所运行主机上的 VM 实例。
  • 集群控制器 收集关于特定的节点控制器上的 VM 运行的信息,并调度其运行计划,以及管理虚拟实例网络。
  • 存储控制器(Walrus)是一个 put/get 存储服务,它实现了 Amazon 的 S3 接口,并提供存储和访问虚拟机器镜像和用户数据的机制。
  • 云控制器 是用户和管理员的云入口。它向节点管理员询问资源信息,做出高级计划决策,并通过向集群控制器发出请求来实现。

关于 Walrus 这一存储组件

Walrus 是包含在 Eucalyptus 中的存储服务,其接口与 Amazon 的 S3 兼容。Walrus 可以存储永久数据,以存储桶(buckets)对象(objects) 的结构进行组织。

Walrus 不提供对象的写锁定;但是由于它与 S3 一样,因此要保证如果对同一个对象并发写入,保存的是一致的对象副本。如果对象写入时遇到前一个对相同对象的写入正在进行,发生这种情况时,前一个写入是无效的。

Walrus 现在如何工作

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 的文件锁定

为了弥补 Walrus 的缺点,我们引入一种文件锁定机制:为了保持数据一致性,提供以读/写模式访问文件的功能。

当 user1 想要以写模式访问任一文件,相应的对象将被锁定,这样其他用户无法访问,直到它被 user1 释放。但其他用户能以读模式访问文件。

我们设计了一个单独队列,根据请求对象的顺序来放置每个用户的写请求,并允许系统处理对应请求。

Walrus 中的镜像管理

在 Eucalyptus 中运行 VM 实例前,应当将下载的或生成的 VM 镜像与 Eucalyptus 证书打包,然后添加这些镜像,然后上传镜像并注册。

为了让 VM 镜像成为可运行实体,Eucalyptus 管理员必须添加根文件系统镜像以及 kernel/ramdisk 组到 Walrus(桶存储),并用 Eucalyptus 注册上传的数据。每个镜像都单独添加到 Walrus 并在 Eucalyptus 注册,这要用到以下的 EC2 兼容的命令:

  • 要添加根文件系统镜像到 Walrus:
    1. 打包镜像:
      $ euca-bundle-image -i <vm image file>
    2. 上传镜像:
      $ euca-upload-bundle -b <image bucket> -m /tmp/<vm image file>.manifest.xml
    3. 注册镜像:
      $ euca-register <image bucket>/<vm image file>.manifest.xml
  • 添加 kernel 到 Walrus 并用 Eucalyptus 注册:
    1. 打包 kernel:
      $ euca-bundle-image -i <kernel file> --kernel true
    2. 上传包:
      $ euca-upload-bundle -b <kernel bucket> -m /tmp/<kernel file>.manifest.xml
    3. 注册 kernel:
      $ euca-register <kernel-bucket>/<kernel file>.manifest.xml

修改机制的背后

现在 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 架构是的文件修改保持一致。


修改机制

让我们看看云及其虚拟网络的架构。

图 2. 云及其虚拟网络的架构
云及其虚拟网络的架构

组件有:

  • CLC,或是云控制器,它是用户接口,进行高级调度;它组成了管理平台。
  • ccX 是集群控制器,它将进入的请求安排到具体节点控制器,并收集/报告一组节点控制器的信息。
  • ncX 是节点控制器,即承载 VM 实例的机器。
  • Walrus 是永久的二级存储,它被节点控制器用于保存 VM 镜像,有时也存储数据。

图 3 显示一个用户如何与其他用户共享文件。

图 3. 用户共享文件的流程图
用户共享文件的流程图

在此流程图中(顺着数字):

  1. 用户用登录 ID 和密码登录。
  2. CLC 检查数据库中的用户 ID 并为合法用户创建一个新的会话。
  3. CLC 将状态信息返回给用户。
  4. 用户共享其文件。
  5. CLC 现在检查用户是否真正拥有这个文件,认证成功后,添加新的用户标识到共享文件访问列表。
  6. CLC 将此信息发送给对应的 CC。
  7. CC 找到承载用户所需的虚拟机实例,并发送此消息。
  8. NC 将此文件转移成永久共享媒介(Walrus)以保证用户间共享。
  9. 文件通过 CC 和 CLC 转移到 Walrus。
  10. 文件转移到 Walrus。
  11. CLC 将成功消息发布给用户。

图 4 显示用户如何请求访问文件。

图 4. 用户请求访问文件的流程图
用户请求访问文件的流程图

在此流程图中(顺着数字):

  1. 用户使用登录密码登录进系统。
  2. CLC 检查用户数据库并为合法用户创建一个新的对话。
  3. CLC 向用户返回登录状态信息。
  4. 用户请求文件。
  5. CLC 向用户目录发送请求来确认用户对文件的访问。用户目录保存文件细节和用户访问数据。
  6. CLC 将请求发送给相应的 CC。
  7. CC 查找承载用户的虚拟机实例的 NC。

在第 8、9 和 10 步中,NC 使用安全通道通过 CC 和 CLC 将数据传输到用户。

现在该看看节点控制器内部工作原理了。每个节点控制器中,都有管理程序运行。管理程序是一个平台虚拟化软件。我们使用类型 1 管理程序与承载硬件直接交互,运行管理程序上层的客户操作系统,分配 LPAR 之间的系统资源,以分享物理资源,如 CPU、直接访问存储设备和内存。(类型 1 管理程序是 IBM 早在 1970 年在 IBM System 370 处理器中引入的。)图 5 演示了 NC 及其管理程序工作流程。

图 5. 节点控制器内部工作原理
节点控制器内部工作原理

在此流程图中(顺着数字):

  1. 请求从 CC 到 NC。
  2. 节点上运行的节点控制器模块将它发送到管理程序。
  3. 管理程序在客户操作系统的帮助下完成工作。
  4. 客户 OS 指示管理程序如何做。
  5. 管理程序与硬件交互,完成工作。

我们看到了引入 Eucalyptus 的文件共享如何提供帮助;现在我们看看如何通过读/写模式概念保证数据一致性。

图 6 显示了文件访问的写模式时间队列如何改善数据一致性:

图 6. 使用写模式时间队列改善一致性
使用写模式时间队列改善一致性

图 6 将用户 B 在时间 t 以写模式请求文件 F1 与用户 C 在时间 t+1 以写模式请求同一文件进行对比。为保持文件一致性,我们设计了一个队列,用于放置请求,并按照先到先服务的原则。

由于 B 先于 C 请求文件,B 放在队列顶部,C 放在 B 下面。

一般来说,如果用户以写模式请求访问任何文件,请求都是按照其生成 时间的顺序放置。第一个请求的用户放在队列头部。下一个放在毗邻位置,依此类推。

图 7 显示添加了用户请求 函数(写或读)决定因素来确定共享/锁定级别以提高数据一致性。

图 7. 使用读/写决定因素来提高一致性
使用读/写决定因素来提高一致性

图 7 中,我们在时间框架中额外添加了一个用户访问文件来表示所提供的文件访问模式 — 用户以读模式还是以写模式访问。

在写访问队列中,用户 B 在队列顶部,这是因为 B 先于 C 以写模式请求访问文件。用户 B 得到写访问。用户 C 将在用户 B 释放文件锁后得到写访问。但用户 C 可以在用户 B 写模式锁定时以读模式访问文件。

一般来说,如果两个或多个用户以写模式并发访问文件,第一个用户保证能以写模式访问文件,其他用户的写模式访问请求将排队。但给所有用户读模式访问。当第一个以写模式访问的用户释放文件后,队列顶部的用户就能以写模式访问。


修改、重新编译和运行修改后的代码

我们知道已经根据所有概念,完成了这些内容 — 实际修改步骤。这相当简单。

  1. 创建工作区,从 Eucalyptus 源复制 clc 文件夹。
    图 8. 选择工作区文件夹
    选择工作区文件夹
  2. 单击 File > Import 导入源。
    图 9. 选择导入源
    选择导入源
  3. 选择 General > Existing Projects 到工作区。
    图 10. 选择现有项目
    选择现有项目
  4. 选择根目录路径,为 root/java/workspace/clc。
    图 11. 选择根目录路径
    选择根目录路径
  5. 单击 Finish
    图 12. 但根目录和项目成功添加后,单击 Finish
    这样以后,单击 Finish
  6. 左边是一个名为 “package” 的选项卡,其中列着项目内容。现在右键单击 build.xml
    图 13. 准备构建 ...
    准备构建 ...
  7. 运行 Ant 构建
    图 14. ... 成功了!
    ... 成功了!

应该能看到构建成功。很容易。


实现应用程序

应用程序本身有一些文件,但我们只关注其中重点,让您自己构建创、建自己的应用程序。

为了实现文件共享和锁定机制,我们创建了一个名为 WalrusVirtualBlockManager 的类。代码实现了 Eucalyptus 中的文件锁定机制。清单 1 是源代码。

清单 1. WalrusVirtualBlockManager
package edu.ucsb.eucalyptus.cloud.ws;
import org.apache.log4j.Logger;
import edu.ucsb.eucalyptus.cloud.entities.ObjectInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.*;
import edu.ucsb.eucalyptus.cloud.entities.ObjectInfo;
public class WalrusVirtualBlockManager
{
    private static Logger LOG = Logger.getLogger(WalrusVirtualBlockManager.class);
    public static Map<ObjectInfo,ReentrantLock> 
           storagelockMap = new HashMap<ObjectInfo,ReentrantLock>();
    private static WalrusVirtualBlockManager virtualBlockMgr;
    private WalrusVirtualBlockManager()
    {
    
    }
    public static WalrusVirtualBlockManager getInstance()
    {
        VirtualBlockMgr = new WalrusVirtualBlockManager();
        return virtualBlockMgr;
    }
    public ReentrantLock lock(ObjectInfo info)
{
ReentrantLock lck = new ReentrantLock();
storagelockMap.put(info,lck);
return lck;
}
  public void unlock(ObjectInfo info)  
  {
    ReentrantLock lck = storagelockMap.get(info); 
    lck.unlock();
    clear(info);
  }
  public void clear(ObjectInfo info)
  {
    storagelockMap.remove(info);    
  }
  public void clearAll()
  {
      for(Map.Entry<ObjectInfo,ReentrantLock> entry : storagelockMap.entrySet())
      {
       unlock(entry.getKey());       
  }
      storagelockMap.clear();
}
}

如果不使用 Walrus 那怎么做?

已修改的块存储技术也可用于其他云平台。例如,在 Cassandra 中,数据被复制。这就是说,数据资源最新版本在集群的某个节点上,旧的版本在其他节点上。最终目标是,所有节点将访问最新版本。文件对象锁定不可用,但已修改的块存储技术可在此引入,按照本文介绍的方式保持数据一致性。在 Digg、Facebook、Twitter 及其他网站能看到 Cassandra。


结束语

现在您已了解如何在集群中安装 Eucalyptus,以及如何修改 Walrus 源代码来实现或改进云中的文件共享和文件锁定机制。

参考资料

学习

获得产品和技术

讨论

  • My developerWorks 上的 Developer Cloud 小组 是 IBM Cloud 上进行智能业务开发和测试的社区。
  • 通过 My developerWorks,加入 developerWorks 社区(开发人员博客、小组、论坛、播客、配置文件、通讯、维基和社区主题)这一具有很多连接、共享和协作工具的专业网络。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Open source, Java technology
ArticleID=513943
ArticleTitle= 提高云中的文件共享和文件锁定
publish-date=08302010