• YunTable 0.1版正式发布!!!(转载)


    源地址:http://peopleyun.com/?p=731

    经过两个星期的努力(如果刨去学习C语言的时间),YunTable终于走完一个从无到有的历程,今天,也就是2010年7月12日,YunTable正式对外发布其0.1版,在0.1版中YunTable虽然在特性,优化和内存管理这三方面还有很多的缺失,但是总体而言,已经实现了一个身为BigTable克隆的基本要求,也就是分布式查询和管理,以及以column为核心的存储。这是0.1版的下载链接(上次因为对Skydrive的存储机制不熟,导致部分博友没有第一时间拿到0.01版的源代码,在这里向大家表示我的歉意)。

    架构综述

    首先,请看下面是YunTable0.1版的架构图:

    YunTable Arch图1. YunTable架构(0.1版)

    接下来,将按从上往下的顺序给大家介绍YunTable的架构:

    1.  
      1. Console:用于让用户输入YunTable的命令,主要包括四种类型的命令(add,put,get和quit),并做一些简单的解析。
      2. Master:主要接收来自Console的请求,并将这个请求转发给相应的Region。
      3. Region:其作用主要是处理Master的请求,并存储和管理大量的数据,其主要包括多个store,而存储数据的目录名为”datastore“。Region也就是BigTable论文中所提到的Tablet的服务器。
        1. Store:每个Store对应一个相应的column family,系统在初始化的时候,会为默认的column_family(default_cf)创建一个store,store存储的形式为datastore下的一个目录,目录名为其所对应的column_family,并主要包括四类文件:Memstore,YFile,YFile_data和WAL。
          1. Memstore:其是缓存在内存的数据文件,主要存储最新更新和添加的数据,每隔一段时间,在Memstore上缓存的数据都将会flush到YFile和YFile_data这两个文件中,默认时间间隔应该为60分钟,但0.1版为了测试方便,所以把设定的时间间隔暂定为10秒钟。
          2. YFile:其是持久化的文件,主要用于存储数据的Index,系统会根据从YFile中得到的Index来访问用于存储数据的YFile_data文件中的相应部分,而且由于其体积比较小,所以会在系统运行的时候被载入至内存中。
          3. YFile_data:这就是真正存储数据的文件,由于其体积比较大,所以不大会被存入内存。YFile这个两个文件参考了HBase的HFile格式和Google的SSTable格式,并做了相应的简化。
          4. WAL:全称为“Write-Ahead Log”,用于暂存那些数据更新的请求,以避免当Memstore被意外关闭时所造成的数据丢失,当Memstore完成对数据的写入时,WAL也会清空已经写入的请求。

     

    一些限定

    为了使YunTable在合理的时间内达到其0.1版,我在一些方面做了相应的范围缩小,所以YunTable0.1版有下面一些限定:

    1.  
      1. column_name和column_family_name的大小都被限制在16字节之内,如果输入column_name或者column_family_name的大小超过16字节,系统会将多余的字节自动删去。同时假设在输入的时候,如果不为这个column设定相应的column_family,系统会认定其使用系统默认的column family,也就是default_cf。
      2. 在分布式方面,为了缩小开发范围,采用了伪分布式的方式,也就是将Master和Region绑定在一起,并且只有一个初始Region可供选择。
      3. 在查询方面,暂不支持基于column的查询,但是支持基于row key的查询,具体可以看下面使用教程中的”Get“命令。
      4. 在内存管理方面和性能优化方面,由于这两方面在短期内并不关键,而且”过早的优化“也不是业界所推崇的,所以在0.1版中,没有在这两方面发力。

    使用教程

    首先,使用make来编译生成执行文件YunTable,可通过“./yuntable”来启动YunTable,并进入YunTable的Console,也可使用make clean来清空之前生成的数据库文件。

    接下来,将介绍YunTable Console所支持四种命令:

    1.  
      1. add:这个命令,是为了创建新的Column Family存在的,格式是“add column_family:column_family_name”,在这里”column family”是关键词,不可更改,而“column_family_name”则是等待用户输入的占位符,如果输入的Column Family已经存在的了,Console会显示相应的错误信息。例子:add column_family:address 。
      2. put:主要是用于添加数据,其格式是”put  row:row_key column_name:column_name_value column_family_name.column_name:column_name_value“,在这里”row”是关键词,在其冒号后输入相应的row_key,比如在后面例子里面提到的”me“,在row之后那些,都不是关键字,只要按照那些占位符输入相应参数就可以,具体也可以参看后面的例子,但要注意,如果这个column不属于系统默认的column family,那么请在column family和column之间加入用于分割的“.”,例子:put row:me name:ike sex:male address.homeaddress:sh 。
      3. get:可以通过这个命令来获取数据,主要有两个选择:第一个是“get all”,这主要是列出数据库中所有的数据,并安排row key大小的顺序(字典顺序)排列,但不会对输出的数据进行过滤。另一个是“get row:row_key”,通过这个命令会获得这个row的数据,并且会对其输出的数据进行过滤,也就说,同一row同一column只会显示最新的一个值,例子:get row:me。
      4. quit:这个命令最简单的,没有附加的命令,只有在console中输入“quit”就能退出YunTable Console。

     

    还有,如果大家第一次使用YunTable的话,可以参考下面附录里面的两个Test Case,特别推荐Test Case1,也就是短的那一个。

    今后的安排

    关于YunTable的未来,首先,我将会在《剖析云计算》一书的实践篇中,对YunTable的实现和其背后的理论进行详细的讲解。其次,关于YunTable未来的发展,我还没有明确的规划,所以如果大家有兴趣在今后参与YunTable开发的话,可以直接在使用和分析YunTable之后将自己的想法发到我的邮箱ikewu83@gmail.com,等我有空了之后,大家可以一起来商量商量,同时也可以直接动手改代码,来对YunTable进行更新和添加。

    附录:

    下面是两个YunTable的Test Case,一长一短,如果大家有兴趣的话,可以试一下。

    Test Case1(短) 
    make 
    make clean 
    ./yuntable 
    1. add column_family:address 
    2. put row:me name:ike sex:male address.homeaddress:sh 
    3. get all 
    4. quit

    Test Case 2(长) 
    1) begin part 
    make 
    make clean 
    ./yuntable 
    1. get all

    2) add part 
    1. add column_family:address 
    *2. add column_family:address 
    3.  add  column_family:address2

    3) put part 
    1. put row:me name:ike sex:male address.homeaddress:sh 
    2. put row:m22 name:zhu sex:male address.homeaddress:sh address2.workaddress:bj 
    3. put row:m1 name:wu sex:male address.homeaddress:sh 
    *4. put row:m3 name:hua sex:male address3.playaddress:sh 
    5. put row:me name:wu sex:female address.homeaddress:bj

    4) test log part 
    1. quit 
    ./yuntable

    5) get part 
    1. get all 
    2. get row:me 
    *3. get row:wrong 
    4. quit

    *开头的命令,应该返回相应的错误信息。

  • 相关阅读:
    50 系统调用的实现
    49 进程调度预备开发(下)
    48 进程调度预备开发(上)
    47 多进程并行执行(下)
    IIC总线
    46 多进程并行执行(上)
    45 内核中的中断处理(下)
    解决错误/usr/bin/ld: cannot find -lz
    rsync只传输隐藏文件
    Firewall命令
  • 原文地址:https://www.cnblogs.com/licheng/p/1821907.html
Copyright © 2020-2023  润新知